【问题标题】:GNU make's SECONDEXPANSION and recursionGNU make 的 SECONDEXPANSION 和递归
【发布时间】:2017-04-11 09:20:19
【问题描述】:

我正在尝试使用 GNU make 的 SECONDEPANSION(使用 3.81、3.80 和更早版本不支持 SECONDEPANSION),如 documentation 中所述,通过隐式规则在目标层次结构中递归。层次结构由宏/变量定义:

.SECONDEXPANSION :

top00.subblocks := mid00 mid01
mid00.subblocks := bottom00

wanted : top00.recurse ;
works_but_not_wanted : top00.onelevel ;

%.recurse : %.report $$(addsuffix .recurse,$$($$*.subblocks)) ;
%.onelevel : %.report $$(addsuffix .report,$$($$*.subblocks)) ;

%.report :
    @echo REPORT: $*

如果我尝试make wanted,它会给出:

make: *** No rule to make target `top00.recurse', needed by `wanted'.  Stop.

如果我尝试make works_but_not_wanted,它会给出:

REPORT: top00
REPORT: mid00
REPORT: mid01

这不是我想要的,因为它没有报告 bottom00,出于显而易见的原因只会递归下降一级。但是目标wanted 失败了。似乎 GNU make 在递归行为方面遇到了问题。

有什么建议吗?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    这是documented behavior

    任何一条隐式规则都不能在一条链中出现多次。

    【讨论】:

    • 谢谢,这是有道理的。因此,即使二次扩展也是如此。除了明显的递归调用之外,您对基于层次结构定义宏的上述预期递归有什么建议吗?
    • 是的,因为二次扩展不会创建新的模式规则。顺便说一下,我不明白为什么它不能那样工作,但跟踪以前的扩展以确保没有重复将是一些重大的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多