代码之家  ›  专栏  ›  技术社区  ›  Ninja2k

Makefile FILES命令将不执行

  •  0
  • Ninja2k  · 技术社区  · 5 年前

    我试图学习Make语法,我已经指示它编译一个文件,它正确地做到了这一点,当我告诉它执行一个shell命令来创建一个文件使用触摸它不这样做,它不会返回任何错误,以表明任何事情是错的。

    命令

    HelloWorld: HelloWorld.c
        gcc -o HelloWorld HelloWorld.c 
    
    FILES="$(shell touch > file1.txt)"
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   MadScientist    5 年前

    正如已经指出的,你的语法是错误的。但除此之外,你的外壳函数是 从没被处决过 .

    为什么不呢?因为在makefile中,您定义了一个包含shell变量调用的变量,但是您永远不会 使用 变量在任何地方。因为不使用它,所以变量永远不会展开。由于变量从未展开,因此它中的函数从未被调用。

    如果你想扩展变量,你需要将它变成一个简单的变量(使用 := )因此,当变量被赋值时,右边会被展开,或者你必须在函数立即展开的上下文中使用函数;另一个答案有一个使用这个的例子(在任何变量赋值之外)

    下面是一个使用简单变量的示例:

    HelloWorld: HelloWorld.c
            gcc -o HelloWorld HelloWorld.c 
    
    FILES := $(shell touch file1.txt)
    

    (注意,与shell变量不同,设置makefile变量时不需要引号)。

    至于手册,它是作为用户指南编写的:也就是说,你应该从一开始就阅读它,而不是一本参考手册。特别是,除非你仔细阅读并完全理解最初的两章“makefiles简介”和“编写makefiles”,否则你写makefiles是不会有任何进展的。为了流利,您需要理解该部分 How make Reads a Makefile .

        2
  •  1
  •   HardcoreHenry    5 年前

    我想你想要:

     $(shell touch file1.txt)
    

    (请注意缺少 > 重定向到那里)。因此,touch也不会向标准输出任何内容 FILES 无论如何都是空白的,所以作业是无用的。

    如果你要做这样的事情,要知道 $(shell ...) 在运行任何配方之前,在解析时执行命令(在全局范围内)。

    ------------编辑-------------

    关于您关于创建空白文件的问题:

    all:
    $(info output $(shell echo "hello world"))
    $(shell touch file1.txt)
    

    应出示您的文件:

    > ls file1.txt; make; ls file1.txt
    file1.txt
    output hello world
    make-3.81: Nothing to be done for `all'.
    file1.txt