複数ターゲットを並列して構築する場合、メークファイルに関していくつかの制限があります。依存ファイルの処理の順序が明示的に指定されているメークファイルは、並列モードの構築を行うことはできません。また、メークファイル内に同じファイルを更新する複数のターゲットが存在する場合に、2 つのターゲットが同時に同じファイルを変更することになると、構築処理を行うことができません。この節では、起こり得る問題の例を挙げて説明します。
ターゲットを並列して構築を行う場合、依存関係リストを正確に記述することが必要です。たとえば、2 つの実行可能ファイルが同一のオブジェクトファイルを使用する場合に、一方の実行可能ファイルのみで依存関係を指定していると、並列モードの構築処理はエラーになります。次のような記述を含むメークファイルがあるとします。
all: prog1 prog2 prog1: prog1.o aux.o $(LINK.c) prog1.o aux.o -o prog1 prog2: prog2.o $(LINK.c) prog2.o aux.o -o prog2
逐次モードで構築を行う場合、ターゲット aux.o は prog1 の依存ファイルとして構築され、prog2 の構築の際に更新されます。一方、構築が並列モードで行われた場合、aux.o が構築される前に prog2 のリンクが開始されるため、正しい結果が得られないことになります。make の .KEEP_STATE 機能を使用すると、依存関係の検査を行うことができますが、上記のような関係は検査されません。
依存関係が暗黙に順序付けされている場合、それを並列モードの構築用に修正することはさらに難しくなります。たとえば、あるシステムのヘッダーをほかのどれよりも先に構築しなければならない場合、すべてがこのヘッダーの構築に依存することになります。このような場合、メークファイルの内容はかなり複雑になり、そのメークファイルに新しいターゲットを追加するとエラーが発生しやすくなります。そこで、メークファイル内に特殊ターゲットとして .WAIT を指定して、依存ファイルの暗黙の順序付けを示すことができます。dmake は依存関係リスト内で .WAIT を検出すると、このターゲットの前の依存ファイルの処理が終了するまで、それ以降の依存ファイルの処理を行いません。1 つの依存関係リストに複数の .WAIT ターゲットを使用できます。.WAIT を使用して、ヘッダーを一番先に構築するように指定する例を示します。
all: hdrs .WAIT libs functions
.WAIT ターゲットに対して空の規則を追加して、メークファイルに下位互換性を持たせることができます。