2016-04-19 113 views
1

我有一個奇怪的項目是在構建時生成幾個文件。他們是其他文件,但有一個特殊的sulffix。 (而不是一個正常的項目,其中裝置一些類型的所有文件他們自動產生)Makefile:PHONY模式匹配規則

例如:

然後我有一個圖案規則:

DATA=$(get string from template.txt) 
%: %.tpl 
    sed 's/__TEMPLATE__/$(DATA)/g' $< > [email protected] 
templates: src/fileB.js src/fileD.css 

一切都很好。直到下一個版本...現在src/fileB.js不會得到更新,因爲那裏已經有一個,並且src/fileB.js.tpl沒有更改,雖然我使用其他文件template.txt作爲數據源來更新它可能。這將我帶入了清潔的一步。

現在我乾淨的步驟是rm ing每個文件。這是醜陋的。

.PHONY: clean 
clean: 
    rm src/fileB.js 
    rm src/fileD.css 
    ... 

你可以看到它是如何變得醜陋。

在一個正常的項目中,我的乾淨將只是rm *.o,但在這裏我不能做rm *.js因爲一半的文件不是自動生成的。

有什麼辦法可以使規則%: %.tpl成爲PHONY嗎?

如果不是,有沒有辦法將文件列表從template提供到clean

回答

2

這是怎麼回事?

TEMPLATES=$(wildcard src/*.tpl) 
GENERATED=$(TEMPLATES:%.tpl=%) 

clean: 
    rm -f $(GENERATED) 

嗯,我希望備份測試此之前...

+0

真好!現在我的'模板'規則也更清潔,模板:$(GENERATED)'。非常感謝!總是忘記'通配符' – gcb

+0

手動所需的'乾淨'步驟是make的「代碼味道」。你不需要擁有它們。這裏的問題的解決方案是使用* always *生成的中間文件,然後只在與中間文件不同時更新實際的'.js'文件。是的,這有點昂貴,但意味着你不能忘記清理並最終破碎。 –