2016-07-29 106 views
2

我認爲這是相當簡單的的Makefile:防止無限遞歸模式

%.png: ../figs/%.png 
     convert $? -resize '40%' [email protected] 

也就是說,我想在「../figs/」來從相應的圖像此目錄中的圖像。

但是,上述導致依賴性無限鏈,因爲../figs/foo.png匹配%.png,因此使試圖檢查../figs/../figs/foo.png,它匹配%.png,因此作出嘗試。 。 。 最終,以「文件名太長」來停止。

我必須缺少一些東西。什麼是乾淨的解決方案?

回答

1

殺死鏈具有空規則

%.png: ../figs/%.png 
    convert $? -resize '40%' [email protected] 

../figs/%.png: ; 
+0

謝謝!那很完美。有趣的是,Mac OS X附帶的GNU Make 3.81仍會與您的代碼一起生成無限鏈,而我單獨安裝的GNU Make 4.2.1則不會。這是否意味着這個問題最近才解決? – Ryo

+0

看起來模式規則在[3.82](http://git.savannah.gnu.org/cgit/make.git/tree/NEWS)中轉換爲最短的詞幹順序,您可以在3.81中通過將空統治在另一個之前。 – user657267

0

user657267的解決方案是完美的。另一種選擇是使用靜態模式規則:

PNGS := $(patsubst ../figs/%.png,%.png,$(wildcard ../figs/*.png)) 

all: $(PNGS) 

$(PNGS): %.png: ../figs/%.png 
    convert $< -resize '40%' [email protected] 

clean: 
    rm -f $(PNGS) 

所有先決條件列表計算的所有目標的列表中有幾個不錯的副作用,比如增加了allclean目標,例如的prossibility。

+0

謝謝!我已經使用了像PNGS這樣的目標列表,但我不知道可以使用列表來限制模式的應用(第三個非空行,帶兩個冒號)。順便說一句,我使用'$(notdir ...)'函數而不是'patsubst'。 – Ryo