为什么不“做”回声呢?

时间:2015-03-03 08:50:59

标签: makefile gnu-make

我的make命令出现了奇怪的行为。

在执行之前不打印命令行。 我知道在命令行之前存在-s--silent--quiet选项或@的用法。而且我不使用任何一种。

例如,一个非常基本的Makefile:

all:
        touch toto.txt
        rm toto.txt

在我的电脑上执行:

mylogin@debian:~$ make
mylogin@debian:~$

在另一台计算机上执行:

mylogin@debian:~$ make
touch toto.txt
rm toto.txt
mylogin@debian:~$

这两台计算机上的make版本相同:

mylogin@debian:~$ make -version
GNU Make 3.81
...

打印命令行是默认行为(https://www.gnu.org/software/make/manual/html_node/Echoing.html),我不会使用任何特殊配置。

有人知道为什么make执行但没有回显命令行?

PS:

  • 我没有名为"所有"
  • 的文件或目录
  • 如果删除rm toto.txt,则创建的文件没有任何回复。

PPS:

  • 当我发出make -d时,这些是输出的最后一行:

     Considering target file `all'.
      File `all' does not exist.
      Finished prerequisites of target file `all'.
     Must remake target `all'.
     Need a job token; we don't have children
     Putting child 0x01144970 (all) PID 7478 on the chain.
     Commands of `all' are being run.
     Live child 0x01144970 (all) PID 7478 
     Reaping winning child 0x01144970 PID 7478 
     Removing child 0x01144970 PID 7478 from chain.
     Considering target file `all'.
     File `all' was considered already.
    

2 个答案:

答案 0 :(得分:3)

调试输出中有这个字符串:

  

需要工作代币;我们没有孩子

除非我使用-j选项,否则无法在调试输出中获取此字符串。但是,您声明在命令行中使用了make -d。这也是你的粘贴页显示的内容。

这告诉我你没有运行库存(即未修改的)GNU make。可能性:

  • 您实际上正在运行一个包裹真实制作的脚本,并传递-j-s以使另外到您提供的参数。 -j的添加解释了上面的这一行。 -s的添加解释了为什么你没有得到回声。

  • 你有一个shell别名或shell函数,它与上面提到的脚本相同。 (在bash中,您可以使用type -a make来检查make是什么。感谢MadScientist提醒type -a。)

  • 您正在使用MAKEFLAGS环境变量来设置-j-s。 (在bash中,您可以使用printenv MAKEFLAGS进行检查。)

  • 您正在运行自定义二进制文件。

答案 1 :(得分:1)

您的计算机上的工作目录中可能有一个名为all的文件或目录。 Make看到了,并看到规则在makefile中创建all,并确定它是最新的(因为它存在且没有先决条件),所以没有做任何事情。

在您的makefile中添加.PHONY: all将解决此问题。您还可以运行make -d,并在运行makefile时查看make(非常详细)的内容。