为什么 "make" 什么都不回显?
Why doesn't "make" echo anything?
我的 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.
您计算机上的工作目录中可能有一个名为 all
的文件或目录。 Make 看到了这一点,并看到了在你的 makefile 中创建 all
的规则,并确定它是最新的(因为它存在并且没有先决条件)所以什么都不做。
将 .PHONY: all
添加到您的 makefile 将解决此问题。您还可以 运行 make -d
并查看 make 在 运行 生成您的 makefile 时在想什么(非常详细)。
你的调试输出中有这个字符串:
Need a job token; we don't have children
除非使用 -j
选项,否则我无法在调试输出中获取此字符串。但是,您声明在命令行中使用了 make -d
。这也是您的 pastebin 显示的内容。
这向我表明您不是 运行 库存(即未修改的)GNU 品牌。可能性:
你实际上是运行一个脚本,它包裹了真正的make并通过-j
和-s
来制作另外 到你给的参数。 -j
的添加解释了上面的行。 -s
的添加解释了为什么您没有收到回声。
您有一个 shell 别名或一个 shell 函数,其作用与上面假定的脚本相同。 (在 bash 中你可以使用 type -a make
来检查 make
是什么。感谢 MadScientist 关于 type -a
的提醒。)
您正在使用 MAKEFLAGS
环境变量来设置 -j
和 -s
。 (在 bash 中你可以用 printenv MAKEFLAGS
检查它。)
您是 运行 自定义二进制文件。
我的 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.
您计算机上的工作目录中可能有一个名为 all
的文件或目录。 Make 看到了这一点,并看到了在你的 makefile 中创建 all
的规则,并确定它是最新的(因为它存在并且没有先决条件)所以什么都不做。
将 .PHONY: all
添加到您的 makefile 将解决此问题。您还可以 运行 make -d
并查看 make 在 运行 生成您的 makefile 时在想什么(非常详细)。
你的调试输出中有这个字符串:
Need a job token; we don't have children
除非使用 -j
选项,否则我无法在调试输出中获取此字符串。但是,您声明在命令行中使用了 make -d
。这也是您的 pastebin 显示的内容。
这向我表明您不是 运行 库存(即未修改的)GNU 品牌。可能性:
你实际上是运行一个脚本,它包裹了真正的make并通过
-j
和-s
来制作另外 到你给的参数。-j
的添加解释了上面的行。-s
的添加解释了为什么您没有收到回声。您有一个 shell 别名或一个 shell 函数,其作用与上面假定的脚本相同。 (在 bash 中你可以使用
type -a make
来检查make
是什么。感谢 MadScientist 关于type -a
的提醒。)您正在使用
MAKEFLAGS
环境变量来设置-j
和-s
。 (在 bash 中你可以用printenv MAKEFLAGS
检查它。)您是 运行 自定义二进制文件。