如果我正確理解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