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 -j -k
$ make -j 1>/dev/null 2>/dev/null