" - 保持持续"将致命的构建变成成功的构建

时间:2015-08-26 08:59:37

标签: makefile gnu-make

来自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)。

传递失败(和不完整)的构建,就好像它是一个成功的构建。

这是预期的行为还是上面的示例有错误?

2 个答案:

答案 0 :(得分:1)

使用--keep-going时,返回的退出代码是最后一个目标状态的退出代码。目标“所有”失败,但由于你想继续前进,目标“root”继续并且成功。

运行

 make -j -k all || echo failure

你会看到只是建立“全部”会给出非零退出。

答案 1 :(得分:0)

这似乎是预期的行为。要解决此问题,将运行

$ make -j -k
$ make -j 1>/dev/null 2>/dev/null
  1. 尽可能运行 make。记录所有错误。
  2. 出现错误时停止(带有退出代码),不要打印错误(它们会从 (1) 中重复出现)。

第二次运行应该很短,因为其他一切都已构建。它会设置正确的退出状态。