你不能有两种模式。最好的方法是不要在目标名称中包含两次 map。
如果必须,并且您正在使用 GNU make,secondary expansion 可能会有用:
.SECONDEXPANSION:
$(Home)/ecc_%.gff: $$(word 1,$$(subst _, ,$$*)).fpp
通常你不能在先决条件中使用automatic variables,例如$*,但是二次扩展允许你这样做。请注意,我使用$$ 代替了$,因此真正的扩展发生在第二遍而不是第一遍。
假设您正在制作$(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
但这看起来不是一个明智的解决方案。
总结一下,如果没有类似命名的文件,那么第一个解决方案会很好用。此外,如果您事先知道目标名称,则可以使用明确的模式规则使其更安全(甚至生成它们on the fly)。