2016-08-25 67 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)。

相關問題