来自docs:
通常
make
在这种情况下立即放弃,返回 非零状态。但是,如果-k
或--keep-going
标志是 指定,make
继续考虑其他先决条件 待定目标,必要时重建它们,在它放弃之前 返回非零状态。例如,编译一个错误后 目标文件,make -k
将继续编译其他目标文件 虽然它已经知道连接它们是不可能的。 *注意 选项摘要:选项摘要。
换句话说,--keep-going
并不意味着Make 完全忽略 错误并返回 exit-status = 0 。< / p>
相反,这意味着Make将 暂时暂停 错误,并仅继续使用其他独立构建(即构建不依赖于这个失败的目标)。然而, 最终 &#34;恢复&#34;那些错误,并因此失败。
但是,请考虑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'
构建失败,因为先决条件无法构建。然而,Make为第二次运行返回 ,我们有-k
(--keep-going
)。
传递失败(和不完整)的构建,就好像它是一个成功的构建。
这是预期的行为还是上面的示例有错误?
答案 0 :(得分:1)
使用--keep-going
时,返回的退出代码是最后一个目标状态的退出代码。目标“所有”失败,但由于你想继续前进,目标“root”继续并且成功。
运行
make -j -k all || echo failure
你会看到只是建立“全部”会给出非零退出。
答案 1 :(得分:0)
这似乎是预期的行为。要解决此问题,将运行
$ make -j -k
$ make -j 1>/dev/null 2>/dev/null
第二次运行应该很短,因为其他一切都已构建。它会设置正确的退出状态。