【发布时间】:2010-03-10 08:58:20
【问题描述】:
有没有办法记录命令,调用编译程序?我知道参数-n 和-p,但它们要么不解析if 条件,而是将它们打印出来。或者,当在 Makefile 中有对“make”本身的调用时,它们不起作用。
【问题讨论】:
标签: makefile
有没有办法记录命令,调用编译程序?我知道参数-n 和-p,但它们要么不解析if 条件,而是将它们打印出来。或者,当在 Makefile 中有对“make”本身的调用时,它们不起作用。
【问题讨论】:
标签: makefile
这个
make SHELL="sh -x -e"
将导致 shell(它调用以评估 shell 构造)打印有关它正在做什么的信息,让您看到 shell 命令中的任何条件是如何被评估的。
-e 是必要的,以确保正确检测到 Makefile 目标中的错误并返回非零进程退出代码。
【讨论】:
-e 标志,因为我得出的结论是,如果没有它,Makefile 触发的错误的语义会发生变化,导致执行多个命令时不会失败来自Makefile 目标。我想知道 -c 标志是否也应该包括在内? (见gnu.org/software/make/manual/html_node/Choosing-the-Shell.html)
Make 将它执行的每个命令写入控制台,所以
make 2>&1 | tee build.log
将创建一个名为build.log 的日志文件作为副作用,其中包含写入屏幕的相同内容。 (man tee 了解更多详情。)
2>&1 将标准输出和错误合并到一个流中。如果您不包含它,则常规输出将进入日志文件,但错误只会进入控制台。 (make 仅在命令返回错误代码时写入 stderr。)
如果您想完全禁止输出以支持将日志记录到文件中,那就更简单了:
make 2>&1 > build.log
因为这些只是捕获控制台输出,所以它们与递归 make 一起工作得很好。
【讨论】:
您可以尝试使用strace 记录execve 的通话
strace -f -e execve make ...
【讨论】:
您可能会在SparkBuild 生成的带注释的构建日志中找到您要查找的内容。这包括构建中执行的每个规则的命令,无论“@”是否用于阻止 make 打印命令行。
您对 if 条件的评论有点令人困惑:您是在谈论 shell 构造还是 make 构造?如果您的意思是外壳构造,我认为除了使用其他人描述的 strace 之外,您没有任何方法可以准确地获得您想要的东西。如果您的意思是 make 构造,那么您看到的输出 是解析条件表达式的结果。
【讨论】:
您是否尝试过使用 -d 参数(调试)?
请注意,您可以改用 --debug 来控制信息量。例如,--debug=a(与 -d 相同)或--debug=b 仅显示基本信息...
【讨论】: