我正在编写这样的 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)/ ...
...