了解 Make 执行了哪些 shell 命令/配方
Know what shell commands / recipes are executed with Make
当我执行 Make 时,我想知道执行了哪些 shell 命令/配方(也许还有 Makefile 在哪一行调用了这些)。有没有一种方法可以在不修改 Makefile 的情况下执行此操作(打印到标准输出或写入文件)?
默认情况下,这些命令将回显到标准输出,除非您通过在它们前面加上 @
.
来禁用它
您可以通过几个选项来制作:
-n
:回显命令 将 变成 运行,但没有 运行ning 它们。这还将回显以 @
. 为前缀的命令
-d
:打印调试输出。这将输出 make 在尝试查找与它试图创建的目标相匹配的规则时所经历的过程。这里会有很多无用的信息,因为它会尝试 许多 默认构建规则(比如如何从 .c 构建 .o 文件)。
有几种方法可以减少噪音:
-r
: 禁用隐式规则。如果您不依赖于任何默认规则,这可以与 -d 一起使用以仅打印您(主要)关心的部分
--debug=b
:基本调试模式。打印它试图制作的内容,但不打印任何关于隐式规则的信息。
其中 None 打印命令的行号,但是 make -n --debug=b
将打印正在构建的目标和正在 运行 的命令,所以它几乎一样好。示例如下。
$ cat makefile
:
c: a b
cat $^ > $@
a:
echo 'foo' > $@
b: a
cat $^ > $@
echo 'bar' >> $@
$ make -n --debug=b
:
Reading makefiles...
Updating goal targets....
File 'a' does not exist.
Must remake target 'a'.
echo 'foo' > a
Successfully remade target file 'a'.
File 'b' does not exist.
Must remake target 'b'.
cat a > b
echo 'bar' >> b
Successfully remade target file 'b'.
Prerequisite 'a' is newer than target 'c'.
Prerequisite 'b' is newer than target 'c'.
Must remake target 'c'.
cat a b > c
Successfully remade target file 'c'.
当我执行 Make 时,我想知道执行了哪些 shell 命令/配方(也许还有 Makefile 在哪一行调用了这些)。有没有一种方法可以在不修改 Makefile 的情况下执行此操作(打印到标准输出或写入文件)?
默认情况下,这些命令将回显到标准输出,除非您通过在它们前面加上 @
.
您可以通过几个选项来制作:
-n
:回显命令 将 变成 运行,但没有 运行ning 它们。这还将回显以@
. 为前缀的命令
-d
:打印调试输出。这将输出 make 在尝试查找与它试图创建的目标相匹配的规则时所经历的过程。这里会有很多无用的信息,因为它会尝试 许多 默认构建规则(比如如何从 .c 构建 .o 文件)。 有几种方法可以减少噪音:-r
: 禁用隐式规则。如果您不依赖于任何默认规则,这可以与 -d 一起使用以仅打印您(主要)关心的部分--debug=b
:基本调试模式。打印它试图制作的内容,但不打印任何关于隐式规则的信息。
None 打印命令的行号,但是 make -n --debug=b
将打印正在构建的目标和正在 运行 的命令,所以它几乎一样好。示例如下。
$ cat makefile
:
c: a b
cat $^ > $@
a:
echo 'foo' > $@
b: a
cat $^ > $@
echo 'bar' >> $@
$ make -n --debug=b
:
Reading makefiles...
Updating goal targets....
File 'a' does not exist.
Must remake target 'a'.
echo 'foo' > a
Successfully remade target file 'a'.
File 'b' does not exist.
Must remake target 'b'.
cat a > b
echo 'bar' >> b
Successfully remade target file 'b'.
Prerequisite 'a' is newer than target 'c'.
Prerequisite 'b' is newer than target 'c'.
Must remake target 'c'.
cat a b > c
Successfully remade target file 'c'.