运行并行make时出错

时间:2012-06-10 19:18:37

标签: linux compilation makefile gnu-make

考虑以下make:

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执行的 end 中?

更新:

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

2 个答案:

答案 0 :(得分:5)

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

# make
....
# echo $?

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

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

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

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

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

答案 1 :(得分:0)

您所看到的是这两项任务的输出都是独立的。因此,如果你并行运行5个任务,其中3个给出了错误,那么很可能它们会被其他任务的输出所穿插。

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

P.S。 - 此外,除非绝对存在错误,否则永远不要在任务中使用退出1!