2013-03-01 27 views
3

GNU make通過在最後調用rm filename自動刪除由隱式規則創建的中間文件。如果其中一個目標實際上是一個目錄,這顯然不起作用。看看下面的例子:如何獲取GNU make以移除由隱式規則創建的中間目錄?

.PHONY: all 

all: test.target 

%.target: tempdir.% 
    touch [email protected] 

tempdir.%: 
    mkdir -p [email protected] 

make -n揭示了行動計劃:

mkdir -p tempdir.test 
touch test.target 
rm tempdir.test 

是否有可能得到GNU做出正確處置中間的目錄?也許通過將rm更改爲rm -rf

回答

3

沒有辦法做到這一點。雖然GNU make會打印命令「rm」,但它確實在內部直接運行unlink(2)系統調用,而不是調用shell命令。沒有辦法配置或修改GNU make運行的命令(除了通過更改源代碼)。

但是,我覺得我應該指出,只是不打算將目錄用作目標的常規先決條件。 GNU make使用時間最後修改的比較來判斷目標是否處於最新狀態,並且目錄的時間最後修改不符合標準規則。目錄的TLM每次更新該目錄中的文件(或子目錄)被創建,刪除或重命名。這意味着您將創建該目錄,然後生成一大堆依賴於該目錄的文件:第一個文件已構建並具有時間戳N.最後一個文件已構建並具有時間戳N + x。這也將目錄的時間戳設置爲N + x。然後在下一次運行make時,它會注意到第一個具有比它的先決條件(目錄,在N + x)更早的時間戳(N)和重建。

這會一直髮生,直到它可以快速構建剩餘的「過時」先決條件,以使它們的時間戳不比目錄更新。

而且,如果您要在該目錄中放置臨時文件或編輯器備份文件或其他東西,它將重新開始。

只是不這樣做。

有些人使用顯式shell命令來創建目錄。有些人把它們作爲目標創造的副作用。有些人使用訂單唯一的先決條件來確保他們按時創建。

相關問題