2009-09-24 19 views
1

我有一個Makefile有以下類型的規則:GNU製作和通配符 - 丟失的文件

%.html: 
    ./generate-images.py > [email protected] 
    make $(patsubst %.png,%.gif,$(wildcard *.png)) 

generate-images腳本不僅寫入HTML文件(到標準輸出),但幾個.png文件到當前目錄。這裏的目標是將它們轉換爲.gif。 (不是真的,但這是一個例子)

這個工程,如果我直接調用它。問題是:如果我從foo.html是依賴項的其他規則調用它,通配符語句無法找到任何文件。換句話說,它只叫make,沒有任何參數,這不是我想要的。

與通配符有什麼關係?或者,有沒有更好的方法來做到這一點?

回答

1

聽起來好像它正在評估所有$()表達式,因爲它正在處理Makefile,而不是執行每個規則。你可以添加一個規則,以你的Makefile像這樣:

images: $(patsubst %.png,%.gif,$(wildcard *.png)) 
.PHONY: images 

,然後更改您的示例代碼段

%.html: 
    ./generate-images.py > [email protected] 
    make images 

因此,使計算在正確的時間的水珠。這是關於哪些檢查手冊可能是值得的。

3

雖然您的問題可能有所不同,但我清楚地看到其中之一。

全部規則中的全部文本被同時處理,使得make的函數和變量得到擴展。假設目錄中沒有.png文件,並且您調用make,因此它應該重新生成它們:a.pngb.png。然後,您調用make後,該規則的文本將有效看起來像這樣:

file.html: 
    ./generate-images.py > file.html 
    make 

因爲在讀入makefile的那一刻沒有.png文件!第一行執行後,文件將出現,但下一行已經生成只是「make」。

只有當你調用生成文件第二次,將其擴大到

file.html: 
    ./generate-images.py > file.html 
    make a.gif b.gif 

這不是你想要的。所以我建議以正確的方式來做。

# If you have batch conversion program, this may be helpful 
images.stamp: *.png 
    convert_all_images $? 
    touch images.stamp 

# OR, if you want convert one-by-one with means of make 
images.stamp: $(wildcard *.png) 
    touch images.stamp 

%.gif: %.png 
    convert_one --from=$^ [email protected] 

# HTML would look like 
%.html: 
    ./generate-images.py > [email protected] 
    make images.stamp 

所以,當你調用make all,它產生HTMLS和轉換新生成的圖像。請注意,它只會轉換更新的圖像,這正是您想要的。


感謝Beta指出了gif/png擴展名的混亂。

+0

這是我的帖子得到的。 – Novelocrat 2009-09-24 22:46:56

+0

+1表示通配符問題的清晰解釋,-1表示過度複雜和錯誤的規則(即使在編輯後),+1表示令人驚訝的新洞察力:如果沒有遞歸,你真的無法做到這一點! – Beta 2009-09-25 16:00:30

+0

@貝塔:我真的很想知道我的規則中存在哪些錯誤!請放下提示 - 我將編輯我的答案,並給予您適當的歸屬。 順便說一句,實際上,你*可以*沒有遞歸:-)這就是爲什麼我已經從我的帖子中刪除了這一說法:-)但是,這使得我的帖子更加複雜...... – 2009-09-25 19:32:24