我正在編寫這樣的 Makefile 規則:
out/%.x: ...
mkdir -p $(@D)/
...
我打算並行化這個Makefile(-j
),這將mkdir -p
同時觸發許多。
這樣安全嗎?或者我需要透過確保mkdir -p
只發生一次來防止出現問題?
(筆記與 不同,這mkdir -p
不一定是檔案系統層級的單一操作mkdir
。
答案1
理由POSIXmkdir
說
因為如果任何路徑組件已經存在,則不會產生錯誤,因此-p選項對於確保特定目錄存在也很有用。
這表明並行使用應該是安全的。考慮到競爭的可能性,我可以理解你的疑慮,所以讓我們看看一個實現...
在 GNU 中coreutils
,該-p
選項最終由mkancesdirs
,其中有一個有用的描述,應該可以減輕您的恐懼:
確保 FILE 的祖先目錄存在,使用即使兩個進程並行執行此函數也應該起作用的演算法。
(它不會立即對來自 的錯誤採取行動mkdir
,而是嘗試chdir
進入每個元件目錄,並且只有在失敗時才會失敗。)
如果你使用 GNU Make,你可以使用它二次擴張以與其他先決條件相同的方式處理目錄:
.SECONDEXPANSION:
%/:
mkdir -p $@
out/%.x: $$(@D)/ ...
...