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 可以在发生错误时执行规则吗?的主要内容,如果未能解决你的问题,请参考以下文章

GNU make学习笔记

make: *** 没有规则可以创建“default”需要的目标“build”。 停止。

《GNU_makefile》第五章——为规则书写命令

《GNU_makefile》第五章——为规则书写命令

GNU autotool:没有规则来制定目标

GNU make:删除生成的文件时如何重建哨兵目标?