【问题标题】:Why doesn't "make" echo anything?为什么“make”不回显任何东西?
【发布时间】:2016-02-12 21:29:36
【问题描述】:

我的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:

  • 我没有名为“all”的文件或目录
  • 如果我删除 rm toto.txt,则创建的文件没有任何 make 回显。

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.
    

【问题讨论】:

  • 这里是make -d 输出:pastebin.com/kwt41E15。对我来说似乎没有任何问题。
  • 我已将最后几行复制到您的答案中。它说它调用命令来制作all 目标,但没有显示它们;我认为应该。如果您想在这里帮助一些读者,请重试env LANG=en_US make -d
  • 有英文版:pastebin.com/MXrrA3Kp

标签: makefile gnu-make


【解决方案1】:

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

需要一个工作令牌;我们没有孩子

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

这向我表明您没有运行库存(即未经修改)的 GNU make。可能性:

  • 实际上,您正在运行一个包含真实 make 的脚本,并将 -j-s 传递给 make 您提供的参数。添加-j 解释了上面的行。添加-s 解释了为什么您没有收到回声。

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

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

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

【讨论】:

  • 请运行命令type -a make 以查看您的环境是否有任何特殊的别名或shell 函数调用带有额外标志的make。
  • @MadScientist 忘记了那个方法。
  • 当我在 bash 中执行 alias 时,什么都不使用 make。当我直接运行/usr/bin/make 时,行为相同。另外,我尝试apt-get purge makeapt-get install make 仍然是相同的行为。
  • @Oneil67 我之前没有想过MAKEFLAGS。检查是否设置:printenv MAKEFLAGS。 (策略检查的输出看起来不错。)
  • 谢谢@Louis!那是包含-s$MAKEFLAGS
【解决方案2】:

您的计算机工作目录中可能有一个名为all 的文件或目录。 Make 看到了这一点,并看到了在您的 makefile 中创建 all 的规则,并确定它是最新的(因为它存在并且没有先决条件),因此什么也不做。

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

【讨论】:

  • @Oneil67 添加到上述答案中,您可以删除 rm toto.txt 规则并检查运行 make 后是否创建了 toto.txt,以确认规则是否未执行或 make 未回显
  • 使用make 3.81和4.0,使用OP显示的Makefile运行make,当当前目录中已经存在all文件时,会输出make: 'all' is up to date
  • 是的。我认为只有运行make all 才能做到这一点,但不是这样。在那种情况下,我想不出任何方式 make 会在不打印任何输出的情况下运行。他必须进行调查:按照我的建议运行make -d
  • 感谢您的回复。我没有名为“all”的文件或目录。与 Makefile 中的“.PHONY: all”结果相同。这是make -dpastebin.com/kwt41E15。命令运行:如果我删除rm toto.txt,则创建文件。
猜你喜欢
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2023-02-07
  • 1970-01-01
相关资源
最近更新 更多