makefile - 了解使用 Make 执行的 shell 命令/配方
问题描述
当我执行 Make 时,我想知道执行了哪些 shell 命令/配方(可能还有 Makefile 在哪一行调用了这些命令)。有没有办法在不修改 Makefile 的情况下这样做(打印到标准输出或写入文件)?
解决方案
默认情况下,这些命令将回显到标准输出,除非您通过在它们前面加上前缀来禁用它@
。
您可以通过一些选项来制作:
-n
: 回显将要运行的命令,但不运行它们。这也将回显以 . 为前缀的命令@
。-d
:打印调试输出。这将输出 make 在尝试查找与其尝试创建的目标匹配的规则时所经历的过程。这里会有很多无用的信息,因为它会尝试许多默认的构建规则(比如如何从 .c 构建 .o 文件)。有几种方法可以减少噪音:-r
:禁用隐式规则。如果您不依赖任何默认规则,则可以将其与 -d 结合使用以仅打印您(主要)关心的部分--debug=b
:基本调试模式。打印它正在尝试制作的内容,但不打印有关隐式规则的任何信息。
这些都不会打印命令的行号,但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'.
推荐阅读
- java - Hibernate PropertyAccessException:调用 getter 时发生 IllegalArgumentException?发生了什么?
- cloud-foundry - “cf push”是如何工作的?
- docker - 如何将 Vim 连接到 Docker?
- excel - 将值与范围匹配并动态记录关联值
- javascript - 如何使用 remote_function 并防止 javascript xss 注入?
- apache - 两个域指向同一个站点,即使它不应该
- keras - Keras 分类交叉熵与二元交叉熵
- orgchart - 可以突出显示搜索找到的节点 - Orgchart
- git - 如何将贡献者(不是合作者)添加到私有 GitHub 存储库?
- c++ - 在 C++ 中使用 RegisterWaitForSingleObject 将参数传递给回调函数