私は次のMakefileルールを書いています。
out/%.x: ...
mkdir -p $(@D)/
...
私は同時に複数をトリガーする-j
Makefile()を並列化する予定です。mkdir -p
これは安全ですか?それとも、mkdir -p
問題が一度だけ発生し、問題が発生しないようにする必要がありますか?
(ノート対照的に、これはmkdir -p
ファイルシステムレベルで必ずしも単一の操作を必要としませんmkdir
。 )
答え1
理由POSIXmkdir
説明する
パスコンポーネントがすでに存在する場合、エラーは生成されません。-血オプションは、特定のディレクトリが存在することを確認するのにも役立ちます。
これは、並列使用が安全でなければならないことを示します。競争の可能性を考慮すると、あなたの懸念を理解できるので、実装を見てみましょう。
GNUでは、coreutils
この-p
オプションは最終的にmkancesdirs
、あなたの恐怖を軽減するのに役立つ説明が含まれています。
両方のプロセスがこの機能を並行して実行しても動作する必要があるアルゴリズムを使用して、FILEの親ディレクトリが存在することを確認します。
(エラーが発生した場合はすぐに対処せず、mkdir
代わりにchdir
各コンポーネントディレクトリに移動しようとし、失敗した場合にのみ失敗します。)
GNU Makeを使用している場合はこれを使用できます2番目の拡張他の前提条件と同じ方法でディレクトリを処理します。
.SECONDEXPANSION:
%/:
mkdir -p $@
out/%.x: $$(@D)/ ...
...