有没有一种方式可以记录编译程序的命令调用?我知道参数-n
和-p
,但它们要么不能解决if条件而只是将其打印出来,要么当Makefile中有对'make'本身的调用时就无法正常工作。
有没有一种方式可以记录编译程序的命令调用?我知道参数-n
和-p
,但它们要么不能解决if条件而只是将其打印出来,要么当Makefile中有对'make'本身的调用时就无法正常工作。
make SHELL="sh -x -e"
会导致Shell(make调用以评估shell构造)打印有关其正在执行的信息,让您查看如何评估shell命令中的任何条件语句。
-e
是必要的,以确保可以正确检测到Makefile
目标中的错误,并返回非零进程退出代码。
Make会将它执行的每个命令写入控制台,因此
make 2>&1 | tee build.log
作为副作用,将创建一个名为build.log
的日志文件,其中包含与屏幕上写入的相同内容。(有关更多详细信息,请参见man tee
。)
2>&1
将标准输出和错误组合成一个流。如果不包括它,正常的输出将进入日志文件,但错误仅将进入控制台。(只有当命令返回错误代码时,make
才会写入stderr。)
如果您想完全抑制输出,以便记录到文件中,那么就更简单了:
make 2>&1 > build.log
make
一起使用。你可能会在SparkBuild生成的注释构建日志中找到你要找的内容。这包括构建中执行的每个规则的命令,无论是否使用“@”防止make打印命令行。
关于if条件的评论有点令人困惑:你是在谈论shell结构还是make结构?如果你指的是shell结构,我认为除了像其他人描述的那样使用strace之外,没有其他方法可以精确地获得你想要的结果。如果你指的是make结构,那么你看到的输出就是解析条件表达式的结果。
-e
标志,因为我得出结论,如果没有它,由Makefile
更改引发的错误语义会导致如果从Makefile
目标执行多个命令,则事情不会像应该失败。我想知道是否还应该包括-c
标志?(请参见https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html) - Per LundbergSHELL
必须是一个程序的名称,你不能在其中包含标志。对此,你需要使用.SHELLFLAGS
变量。除非你要将SHELL
更改为其他内容,否则最后一个标志应该始终是-c
(默认值),这样配方才能正确传递给shell命令。 - undefined