2016-07-24 90 views
0

我想編碼規則「,使<name>.done,你需要的模式<name>.needed.*的所有文件,我已經嘗試用這個Makefile這樣寫:。

%.done: $(wildcard %.needed.*) 
    cat $^ > [email protected] 

然而,當我運行touch foo.needed.bar && make foo.done,我得到的是

cat > foo.done 

看樣子裏面$(wildcard)%被解釋爲一個文字「%」。我怎樣才能得到它擴展到正確的價值(在這種情況下,「富」)?

+0

'widcard' - >'wildcard'想必 –

+0

是的,正確。 –

+0

解釋爲什麼它不起作用:在解析過程中,配方參數(源,輸入和依賴關係)已經被評估/擴展,因此'$(通配符)'被調用'%',沒有找到文件,並且被替換爲空字符串。延遲評估僅適用於命令。僅供參考。 – Dummy00001

回答

1

%只是模式匹配中「任意字符串」的佔位符。它在wildcard函數中沒有特殊含義,並且從字面上解釋。

你可能會嘗試使用$*而不是(這將擴展到文件名的莖),但不幸的是它不會工作之一:

%.done: $(wildcard $*.needed.*) 

它不工作的原因是自動變量$*就是其中之一)不能用於依賴項列表中。

的解決方法是請求secondary expansion目標:

.SECONDEXPANSION: 
%.done: $$(wildcard $$*.needed.*) 

這將促使GNU請去在規則的第二次處理的Makefile如常後,展開任何逃脫了不變量第一次擴大。第二次,自動變量有其適當的值。

+1

謝謝,這解決了我的問題。此外,有人早些時候用一個更簡單但較不普遍的解決方案評論道:'%.done:%.needed。*'。 –

+0

@BrianMalehorn那麼,在某些情況下會有效,但如果您在命令中使用'$ <'或'$ +'或其他來重製目標,它可能會選擇錯誤的文件。 – Kusalananda