我有一个用 gnu-make 构建的 C 项目。
作为构建过程的一部分,我运行了一些 python 脚本。脚本可能会返回错误(例如 sys.exit(1))。
我希望在 python 脚本返回错误后立即停止构建过程,而不是在“正常”编译错误后。
当我使用 -k 运行 make 时,它会在 python 或编译出现错误后继续运行,如果没有它,它在所有情况下都会在第一个错误处停止......
有什么方法可以实现我正在寻找的东西吗?
谢谢。
最佳答案
any way to accomplish what I'm looking for?
是的。
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)
这样您就可以在一个地方打开或关闭所有错误抑制。
关于python - 如何在外部脚本错误后强制 make 退出,但在编译错误后不退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46831085/