Makefile &引用--“继续前进”;将致命的生成转换为成功的生成

Makefile &引用--“继续前进”;将致命的生成转换为成功的生成,makefile,gnu-make,Makefile,Gnu Make,来自: 正常情况下,make在这种情况下立即放弃,返回 非零状态。但是,如果-k或--keep going标志为 指定的,使继续考虑其他的先决条件 待决目标,如有必要,在放弃和 返回非零状态。例如,在编译一个 对象文件,make-k甚至将继续编译其他对象文件 尽管它已经知道将它们联系起来是不可能的*注 选项摘要:选项摘要 换句话说,--继续并不意味着Make将完全忽略错误并返回退出状态=0 相反,这意味着Make将暂时挂起错误,并仅对其他独立构建继续(即不依赖于此失败目标的构建)。然而,它最终

来自:

正常情况下,
make
在这种情况下立即放弃,返回 非零状态。但是,如果
-k
--keep going
标志为 指定的,<代码>使继续考虑其他的先决条件 待决目标,如有必要,在放弃和 返回非零状态。例如,在编译一个 对象文件,
make-k
甚至将继续编译其他对象文件 尽管它已经知道将它们联系起来是不可能的*注 选项摘要:选项摘要


换句话说,
--继续
并不意味着Make将完全忽略错误并返回退出状态=0

相反,这意味着Make将暂时挂起错误,并仅对其他独立构建继续(即不依赖于此失败目标的构建)。然而,它最终将“恢复”这些错误,并相应地失败



<强>但请考虑Mag文件:< /强>

#如果“d”是一个“常规”文件,我们首先删除它。
$(壳牌rm-rf D)
#强制make对文件“all”执行“direcotry serach(一种“vpathization”)”。
$(壳牌rm-rf全部)
#“D”是一个VPATH目录
$(shell mkdir D)
#Make将“all”与“D/all”关联
$(shell touch D/all)
VPATH=D
根:全部;
#生成“全部”将导致致命错误。
全部::
假的
.沉默:D/全部



执行时,我们得到:

#“正常”情况(没有“--继续进行”)。
$make-j
makefile:15:目标“D/all”的配方失败
制造:**[D/all]错误1
$echo'退出状态为:“$?”
退出状态为:“2”
##########################
#用“继续前进”跑
$make-j-k
makefile:15:目标“D/all”的配方失败
制造:**[D/all]错误1
$echo'退出状态为:“$?”
退出状态为:“0”


生成失败,因为先决条件未能生成。但是,在第二次运行中,我们成功地返回了
-k
-继续运行

对失败(且不完整)的构建进行传递,就像它是一个成功的构建一样

这是预期的行为还是上述示例中存在一些错误?

当使用
--keep go
时,返回的退出代码是最后一个目标状态的退出代码。目标“全部”失败,但由于您希望继续,目标“根”将继续并成功


你会看到,只要构建“all”就会给出一个非零出口

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

$ make -j -k
$ make -j 1>/dev/null 2>/dev/null
  • 尽可能地运行make。记录所有错误
  • 错误时停止(带有退出代码),不要打印错误(错误将从(1)开始重复)
  • 第二次运行应该很短,因为其他所有的都是构建的。它将设置正确的退出状态

    $ make -j -k
    $ make -j 1>/dev/null 2>/dev/null