2013-01-12 113 views
20

我的Makefile中的一條規則將整個目錄(res/)壓縮成ZIP文件。很顯然,這個規則需要在res/目錄下的任何文件更改時執行。因此,我希望規則具有該目錄下所有文件的先決條件。我怎樣才能實現這個規則?Makefile規則依賴於目錄下的所有文件(包括子目錄下)

在Bash with the globstar option enabled中,您可以使用通配符res/**/*獲得該目錄中所有文件的列表。然而,這似乎並沒有,如果你將它指定爲在Makefile的前提工作:

即使在 touch
filename.jar: res/**/* 

荷蘭國際集團在res/文件,使報告仍然

make: `filename.jar' is up to date. 

所以顯然這是不認識模式。

如果我宣佈了目錄本身作爲一個先決條件:

filename.jar: res 

然後讓不會重新執行,當一個文件被修改(我認爲make只着眼於目錄本身,修改日期只當直接的孩子被添加,移除或重命名時改變)。

+0

的可能重複[Makefile文件:取決於目錄的所有文件(http://stackoverflow.com/questions/5656913/makefile-depends-on-every-file-of-a-directory) –

回答

29

此:

filename.jar: $(wildcard res/**/*) 

似乎工作,至少在某些平臺上。

編輯:

或者更好的,剛切結:

filename.jar: $(shell find res -type f) 
+1

'wildcard'建議不適用於我,但'find'確實可行。 (我只用'$(shell find res)'來觸發它,當文件被刪除時也是如此。) –

+3

注意:如果你在刪除*之後刪除了一個輸入文件,make不會注意到。爲了能夠檢測文件刪除,可以將列表存儲在一個文件中,類似於http://stackoverflow.com/questions/3236145/force-gnu-make-to-rebuild-objects-affected-by-compiler-definition/3237349#3237349 – slowdog

+0

@slowdog:是的,但爲此目的(ZIP存檔)我不認爲這很重要。 – Beta

相關問題