Gnu make在模式规则中使用多个%的问题?

4
如果我正确理解了制作文档,那么在目标模式中我只能使用字符%一次! 我面临的情况是我的目标看起来像:$(Home)/ecc_%_1st_%.gff: %.fpp。每当我尝试匹配/home/ecc_map_1st_map.gff: map.fpp时,Make就会抱怨找不到模式。我知道这是因为使用了两个%,($(Home)/ecc_map_1st_%.gff: %.fpp运行得很完美)。有没有办法可以在一个目标中使用两个%?谢谢。

2
为什么需要在文件名中两次使用单词“map”? - igagis
可能是[如何在目标中匹配双斜杠% /%或其他方式?]的重复问题(https://dev59.com/87bna4cB1Zd3GeqPjexN) - Y00
1个回答

2
你不能有两个模式。最好的方法是在目标名称中不要两次使用map
如果你必须这样做,而且你正在使用GNU make,则secondary expansion可能会有用。
.SECONDEXPANSION:
$(Home)/ecc_%.gff: $$(word 1,$$(subst _, ,$$*)).fpp

通常情况下,您不能在先决条件中使用自动变量,例如$*,但是二次展开允许您这样做。请注意,我使用$$代替$,以便真正的展开发生在第二次而不是第一次。
假设您正在创建$(Home)/ecc_map_1st_map.gff$*变量将成为词干,即map_1st_map。然后,$(subst _, ,...)将下划线替换为空格,以获得map 1st map。现在,$(word N,...)从中提取第N个以空格分隔的单词。第一个单词将是第一个map,第二个将是1st,第三个将是第二个map。我选择第一个。
当然,这非常宽松,不能保证您会完全匹配所需的目标(例如, $(Home)/ecc_map_2nd_notmap__foo.gff 可以匹配并给出 map.fpp )。您可以进行进一步检查(在中间加入 1st ,其他两个必须匹配)并退出:
extract-name = $(call extract-name-helper,$1,$(word 1,$(subst _, ,$1)))
extract-name-helper = $(if $(filter $2_1st_$2,$1),$2,$(error Invalid .gff target))

.SECONDEXPANSION:
ecc_%.gff: $$(call extract-name,$$*).fpp

但这似乎不是一个明智的解决方案。
总之,如果没有同名文件,那么第一种解决方案将很好地工作。此外,如果您事先知道目标名称,可以使用显式模式规则使其更安全(甚至可以动态生成)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接