2016-08-25 38 views
0

如果我正确理解make文档,我只能在目标模式中使用一次字符%!Gnu使用模式规则中的多个百分比?

我面临着我的目标是一个条件是这样的:

$(Home)/ecc_%_1st_%.gff: %.fpp

每当我试图匹配/home/ecc_map_1st_map.gff: map.fpp 制作抱怨找不到一个模式。

我知道那是因为使用两次%(完全$(Home)/ecc_map_1st_%.gff: %.fpp符文)

反正是有,我可以在一个目标使用两个%的!?

谢谢

+2

什么是需要在文件名中有两次单词'map'? – igagis

回答

0

你不能有两种模式。最好的办法是在目标名称中不要有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)。

相关问题