在 Makefile 中的同一目标规则中多次使用 % 模式

Multiple using of % pattern within the same target rule in Makefile

假设有许多这样的规则:

prefix/FOO/FOO_suffix/FOO.txt: prefix/FOO/FOO_input.txt
    echo @<
prefix/BAR/BAR_suffix/BAR.txt: prefix/BAR/BAR_input.txt
    echo @<

取而代之的是,我想要一个隐式规则,例如:

prefix/%/%_suffix/%.txt: prefix/%/%_input.txt
    echo @*

(所以,% 代表同一个
是否可以在不使用 foreach/eval/call/define 函数并为每个 生成显式规则的情况下实现?

GNU make的二次扩展有时可以代替foreach-eval-call:

.SECONDEXPANSION:

prefix/%.txt: prefix/$$(notdir $$*)/$$(notdir $$*)_input.txt
    @echo '$<'

演示:

$ make prefix/FOO/FOO_suffix/FOO.txt prefix/BAR/BAR_suffix/BAR.txt
prefix/FOO/FOO_input.txt
prefix/BAR/BAR_input.txt

但如果你不想使用foreach-eval-call的原因是你觉得二次展开很难理解和维护,那么二次展开可能没那么简单。比较:

MY_MACRO = prefix//_suffix/.txt: prefix//_input.txt

$(foreach t,FOO BAR,$(eval $(call MY_MACRO,$t)))

%.txt:
    @echo '$<'

看到了吗?甚至没有一个 define$$...