【问题标题】:Multiple using of % pattern within the same target rule in Makefile在 Makefile 中的同一目标规则中多次使用 % 模式
【发布时间】:2022-01-19 15:01:33
【问题描述】:

假设有许多这样的规则:

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 函数并为每个 生成显式规则的情况下实现这一目标?

【问题讨论】:

  • 简短回答:不。 Make 不支持在一个隐式规则中使用多个通配符。可能有一种方法可以获得不使用 foreach/eval/call/define 的相同效果,但它会很丑。

标签: makefile gnu-make


【解决方案1】:

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/$1/$1_suffix/$1.txt: prefix/$1/$1_input.txt

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

%.txt:
    @echo '$<'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多