GNU make 可以在发生错误时执行规则吗?
Posted
技术标签:
【中文标题】GNU make 可以在发生错误时执行规则吗?【英文标题】:Can GNU make execute a rule whenever an error occurs? 【发布时间】:2014-02-02 18:38:30 【问题描述】:这与Can a Makefile execute code ONLY when an error has occurred?略有不同。
我想要一个规则或特殊目标,只要发生错误(独立于给定目标;不更改每个目标的规则,因为另一个答案似乎暗示了 || 运算符)。
在dmake 中有特殊目标 .ERROR,只要检测到错误情况就会执行。 GNU make 有没有类似的东西?
(我仍在使用 GNU make 3.81,但我也没有在新的 GNU make 4.0 的文档中找到任何内容)
【问题讨论】:
不,GNU make 不支持这个。如果您使用递归来包装“main”make,然后在失败时运行命令,则可以做到这一点,但仅此而已。 【参考方案1】:Gnu 不明确支持它,但有办法破解几乎任何东西。如果任何一个 make 失败,则 Make 返回 1。这意味着如果第一个 make 失败,您可以在命令行上使用错误规则重新运行 make:
make || make error_targ
当然,我假设您只是想将增加的复杂性放在 makefile 本身中。如果是这种情况,您可以创建一个递归 make 文件:
all:
$(MAKE) normal_targ || $(MAKE) error_targ
normal_targ:
... normal make rules ...
error_targ:
... other make rules ...
这将导致 makefile 尝试构建 normal_targ,如果失败,它将运行 error_targ。对于没有经验的人来说,阅读 makefile 有点困难,但它将所有逻辑放在一个地方。
【讨论】:
如何从normal_targ
获取错误代码/消息,以便error_targ
可以显示一些包含错误描述的自定义错误消息?
这简直是天才
@JHH 也许你可以通过使用 shell $?
变量来做到这一点,当 make 失败时它会在这个变量上返回一个错误代码,所以你可以做类似 $(MAKE) normal_targ || echo $$? && $(MAKE) error_targ
的事情(这只会打印错误值,但您可以使用此值打印自定义消息)以上是关于GNU make 可以在发生错误时执行规则吗?的主要内容,如果未能解决你的问题,请参考以下文章