【问题标题】:Know what shell commands / recipes are executed with Make了解使用 Make 执行的 shell 命令/配方
【发布时间】:2019-05-22 04:45:58
【问题描述】:

当我执行 Make 时,我想知道执行了哪些 shell 命令/配方(可能还有 Makefile 在哪一行调用了这些命令)。有没有办法在不修改 Makefile 的情况下做到这一点(打印到标准输出或写入文件)?

【问题讨论】:

标签: makefile gnu-make


【解决方案1】:

默认情况下,命令将回显到标准输出,除非您通过在它们前面加上 @ 来禁用它。

您可以传递几个选项来制作:

  • -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'.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2015-02-13
    • 2023-03-18
    • 2018-10-06
    • 2016-05-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多