来自https://www.gnu.org/software/make/manual/html_node/Errors.html#Errors 的
通常,
make在这种情况下会立即放弃,返回非零状态。但是,如果指定了-k或--keep-going标志,make将继续考虑挂起的目标的其他先决条件,必要时重新构建这些目标,在放弃之前重新生成,并返回非零状态。例如,在编译一个对象文件时出错后,make -k将继续编译其他对象文件,尽管它已经知道链接它们是不可能的。*说明备选办法摘要:备选案文摘要。
换句话说,--keep-going并不意味着Make 完全忽略了错误,并返回了exit-status = 0。
相反,这意味着使will 暂时挂起错误,并且只继续使用其他独立构建(即不依赖于此失败目标的构建)。然而,它最终将“恢复”这些错误,并相应地失败。
但是,请考虑makefile:
# If 'd' was a "regular" file, we remove it first.
$(shell rm -rf D)
# Force make to do a "direcotry-serach(a "vpathization")", for the file 'all'.
$(shell rm -rf all)
# 'D' is a VPATH directory
$(shell mkdir D)
# Make will associate 'all' with 'D/all'
$(shell touch D/all)
VPATH = D
root: all;
# Building 'all' results in a fatal error.
all ::
false
.SILENT: D/all执行,我们得到:
# The "normal" case (without '--keep-going').
$ make -j
makefile:15: recipe for target 'D/all' failed
make: *** [D/all] Error 1
$ echo 'exit-status is: '"'$?'"
exit-status is: '2'
##########################
# Run with '--keep-going'
$ make -j -k
makefile:15: recipe for target 'D/all' failed
make: *** [D/all] Error 1
$ echo 'exit-status is: '"'$?'"
exit-status is: '0'构建失败,因为前提条件无法构建。然而,在第二次运行时,要返回successfully,其中有-k (--keep-going)。
对失败(和不完整)构建进行传递,就好像它是一个成功的构建一样。
这是预期的行为还是上面的例子有一些错误?
发布于 2015-10-19 14:50:55
当使用--keep-going时,返回的退出代码是最后一个目标状态的退出代码。目标"all“失败,但由于您想要继续,目标"root”继续,这是成功的。
跑
make -j -k all || echo failure你会看到,只要建造“所有”,就会有一个非零的出口。
发布于 2021-01-21 13:32:34
这似乎是人们所期待的行为。为了解决这个问题
$ make -j -k
$ make -j 1>/dev/null 2>/dev/null第二次运行应该非常短,因为其他一切都是构建的。它将设置正确的退出状态。
https://stackoverflow.com/questions/32222204
复制相似问题