SECONDEXPANSION与隐式规则递归失效问题排查(GNU Make 3.82)
GNU Make 3.82隐式规则递归规避导致目标无法构建的问题
问题场景
执行touch a b c后运行make aaa.zzz,无标准输出和错误输出,构建异常。使用版本为GNU Make 3.82,对应的Makefile配置如下:
.SECONDEXPANSION: %.xxx: $$(shell echo a b c) echo in xxx %.zzz: %.xxx $$(shell echo a b) echo in zzz
通过make aaa.zzz -d调试输出可看到:查找aaa.xxx的规则时,出现**"Avoiding implicit rule recursion"(避免隐式规则递归)**提示。
问题原因
GNU Make 3.82的隐式规则递归检测逻辑存在局限性:当%.zzz依赖%.xxx,而%.xxx的依赖文件(a、b、c)与%.zzz的另一组依赖文件(a、b)存在重叠时,Make误判这是规则递归依赖的情况,触发了递归规避机制,直接跳过aaa.xxx规则的执行,最终导致aaa.zzz也无法正常构建。
有效解决方案
调整依赖中的shell命令输出后,以下几种配置均可正常运行:
- 将
%.zzz依赖的$$(shell echo a b)改为$$(shell echo a b c) - 将
%.xxx依赖的$$(shell echo a b c)改为$$(shell echo b c) - 将
%.zzz依赖的$$(shell echo a b)改为$$(shell echo a)
这些修改的核心是通过调整依赖集合的重叠程度,绕过Make 3.82的递归检测误判:要么让两个规则的依赖集合完全包含(第一种情况),要么减少重叠的依赖项数量,避免触发递归规避逻辑(后两种情况)。
内容的提问来源于stack exchange,提问作者karsu
相关产品推荐
相关产品推荐

