在 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
或 $$
...
假设有许多这样的规则:
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
或 $$
...