如果我正确理解make文档,我只能在目标模式中使用一次字符%!Gnu使用模式规则中的多个百分比?
我面临着我的目标是一个条件是这样的:
$(Home)/ecc_%_1st_%.gff: %.fpp
每当我试图匹配/home/ecc_map_1st_map.gff: map.fpp
制作抱怨找不到一个模式。
我知道那是因为使用两次%(完全$(Home)/ecc_map_1st_%.gff: %.fpp
符文)
反正是有,我可以在一个目标使用两个%的!?
谢谢
如果我正确理解make文档,我只能在目标模式中使用一次字符%!Gnu使用模式规则中的多个百分比?
我面临着我的目标是一个条件是这样的:
$(Home)/ecc_%_1st_%.gff: %.fpp
每当我试图匹配/home/ecc_map_1st_map.gff: map.fpp
制作抱怨找不到一个模式。
我知道那是因为使用两次%(完全$(Home)/ecc_map_1st_%.gff: %.fpp
符文)
反正是有,我可以在一个目标使用两个%的!?
谢谢
你不能有两种模式。最好的办法是在目标名称中不要有map
两次。
如果你一定要和你使用GNU做,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)。
什么是需要在文件名中有两次单词'map'? – igagis