【问题标题】:Error while running parallel make运行并行make时出错
【发布时间】:2012-06-10 19:18:37
【问题描述】:

考虑以下品牌:

all: a b

a:
        echo a
        exit 1


b:
        echo b start
        sleep 1
        echo b end

make -j2 运行时,我收到以下输出:

echo a
echo b start
a
exit 1
b start
sleep 1
make: *** [a] Error 1
make: *** Waiting for unfinished jobs....
echo b end
b end

我们有一个相当大的make文件,很容易错过错误,因为在执行结束时没有错误消息。

有没有办法让错误消息也出现在 make 执行的结束

更新:

请参阅我可能的 solution 如何从 make 中检查 make 退出状态。

【问题讨论】:

  • 我总是通过一个脚本输出 Make 的输出,该脚本突出显示带有“错误”和“警告”等关键字的行。
  • @OliCharlesworth 我们也使用了colorgcc,它会高亮gcc的警告/错误,但是编译时间太长了,程序员仍然有很大的机会漏掉错误。
  • 在那种情况下...好吧,我不知道如何直接解决您的问题,但一种可能性是将 Make 包装在一个脚本中,tees 将其输出到一个临时文件,然后 greps 该文件以获取相关消息并在最后转储它。
  • @OliCharlesworth 我们有相当多的makefile 最好是传递现有状态而不是错误消息。错误可能完全不同 - 来自 gcc、sed、ls、mkdir、专有脚本等的错误。包装可能是一种解决方案,因为大多数 make 返回正确的退出状态。但问题是是否有标准解决方案或者我错过了什么。

标签: linux compilation makefile gnu-make


【解决方案1】:

如果make 调用的任何程序返回错误,make 的返回码将不为零。因此,在调用make 之后,您只需检查返回码以查看是否发生错误。在bash(以及许多其他shell,如zsh)上,您可以执行以下操作:

# make
....
# echo $?

如果一切正常,echo 将打印 0,否则将打印其他内容。

您也可以在 shell 脚本中运行检查:

make
if [ $? -eq 0 ]; then
    echo "Everything OK"
else
    echo "Something went wrong!"
fi

如果您需要确切的错误消息,最简单的方法是将输出从 make 重定向到某个文件,如果执行失败,则将输出重定向到 grep

但我通常这样做的方式是并行运行make,如果出现问题,则使用-j1 重新执行它,这样我会收到一条干净的错误消息。我想这可以使用上述技术放入 shell 脚本中。

【讨论】:

    【解决方案2】:

    您看到的是这两个任务的输出是独立的。因此,如果您并行运行 5 个任务,其中 3 个出现错误,则它们很可能被其他任务的输出所穿插。

    最好的办法是一起运行一组串行任务,将它们的错误输出发送到一个文件中......并在退出时将其打印到屏幕上。

    附: - 另外,除非绝对有错误,否则切勿在任务中使用出口 1!

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2018-11-05
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多