如何在外部脚本错误后强制make退出,但在编译错误后不强制make退出

时间:2017-10-19 13:30:10

标签: python c makefile build gnu-make

我有一个用gnu-make构建的C项目。

作为构建过程的一部分,我运行了一些python脚本。脚本可能会返回错误(例如,使用sys.exit(1))。

我希望在从python脚本返回错误后立即停止构建过程,但不会在“正常”编译错误之后停止。

当我使用-k运行make时,它会在python或编译出错后继续运行,如果没有它,它会在所有情况下在第一个错误处停止...

任何方式来完成我正在寻找的东西?

感谢。

2 个答案:

答案 0 :(得分:1)

  

任何方式来完成我正在寻找的东西?

make不区分食谱中的不同命令。它只是将它们提交给shell执行,并记下它们的退出状态以确定如何继续执行。因此,如果任何配方中的任何命令失败都应导致make停止,则不得使用-k选项。

如果您不使用-k,那么当遇到您希望忽略的错误时,问题就变成了如何让make 停止。这(概念上)很简单:只需确保这些命令不会失败。你可以通过在命令末尾附加|| :来做到这一点,这样如果主命令失败,:命令 - 什么也不做,总是成功 - 将运行并提供整体退出状态:

foo.o: foo.c
    $(CC) -o $@ $(CPPFLAGS) $(CFLAGS) $< || :

请注意,此方法要求您提供自己的规则,以避免在出错时停止。 Make的内置规则不会表现出相同的行为。

您甚至可以将其配置为可配置,我建议您这样做:

# Stop on error (unless -k is in effect):
# ON_ERROR =
#
# Do not stop on (most) errors: 
ON_ERROR = || :

foo.o: foo.c
    $(CC) -o $@ $(CPPFLAGS) $(CFLAGS) $< $(ON_ERROR)

bar.o: bar.c
    $(CC) -o $@ $(CPPFLAGS) $(CFLAGS) $< $(ON_ERROR)

baz.o: baz.c
    $(CC) -o $@ $(CPPFLAGS) $(CFLAGS) $< $(ON_ERROR)

这样你就有一个地方可以打开或关闭所有错误抑制。

答案 1 :(得分:0)

来自GNU make manual

  

要忽略配方行中的错误,请在开头写一个“ - ”   line的文本(在初始标签之后)。 ' - '在之前被丢弃   line被传递给shell执行。

所以,只需在你想要的命令中放置一个-来忽略错误,而不是在其他命令的前面。