【问题标题】:Log invoked commands of make记录调用的 make 命令
【发布时间】:2010-03-10 08:58:20
【问题描述】:

有没有办法记录命令,调用编译程序?我知道参数-n-p,但它们要么不解析if 条件,而是将它们打印出来。或者,当在 Makefile 中有对“make”本身的调用时,它们不起作用。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    这个

    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
    【解决方案2】:

    Make 将它执行的每个命令写入控制台,所以

    make 2>&1 | tee build.log
    

    将创建一个名为build.log 的日志文件作为副作用,其中包含写入屏幕的相同内容。 (man tee 了解更多详情。)

    2>&1 将标准输出和错误合并到一个流中。如果您不包含它,则常规输出将进入日志文件,但错误只会进入控制台。 (make 仅在命令返回错误代码时写入 stderr。)

    如果您想完全禁止输出以支持将日志记录到文件中,那就更简单了:

    make 2>&1 > build.log
    

    因为这些只是捕获控制台输出,所以它们与递归 make 一起工作得很好。

    【讨论】:

    • 不幸的是,以@(静默执行)为前缀的命令不包含在此日志中。
    【解决方案3】:

    您可以尝试使用strace 记录execve 的通话

    strace -f -e execve make ...
    

    【讨论】:

    • 这是一个不错的工具。还没听说过。但是它会产生很多输出,在这种情况下我不需要。
    • Strace 是一个跟踪所有系统调用的工具(在我的示例中仅限于 execv),所以是的,它可能会给您提供超过您正在寻找的最小值(特别是它会打印所有(失败) 尝试从所有 $PATH 目录执行命令)。
    【解决方案4】:

    您可能会在SparkBuild 生成的带注释的构建日志中找到您要查找的内容。这包括构建中执行的每个规则的命令,无论“@”是否用于阻止 make 打印命令行。

    您对 if 条件的评论有点令人困惑:您是在谈论 shell 构造还是 make 构造?如果您的意思是外壳构造,我认为除了使用其他人描述的 strace 之外,您没有任何方法可以准确地获得您想要的东西。如果您的意思是 make 构造,那么您看到的输出 解析条件表达式的结果。

    【讨论】:

    • 它们似乎是外壳构造。但我不知道,当您可以使用 Makefile 构造时,为什么有人想在 Makefile 中使用 shell 构造。它们在某些方面更好吗?
    • 我的 SparkBuild 看起来很有趣。我一定会调查的。
    • shell 构造与 make 构造的问题取决于您要做什么。一方面,你可以用 shell 结构做一些你不能用 make 结构做的事情,比如测试文件是否可读或可执行。另一方面,相对于规则正文中的其他命令,它们在不同时间进行评估:make 构造在任何命令实际执行之前进行评估,但 shell 构造将在命令执行时就地评估。
    【解决方案5】:

    您是否尝试过使用 -d 参数(调试)?

    请注意,您可以改用 --debug 来控制信息量。例如,--debug=a(与 -d 相同)或--debug=b 仅显示基本信息...

    【讨论】:

    • 不要忘记将标准输出重定向到文件,make -d 会很快产生大量信息。
    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2013-06-16
    • 2017-11-14
    • 1970-01-01
    • 2015-12-19
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多