Sun WorkShop 入門

並列性を制限する

メークファイルでファイルの衝突が避けられない場合があります。たとえば、C プログラムから文字列を抽出して、共有文字列を生成する xstr(1) コマンドがあります。xstr コマンドでは変更された C プログラムは x.c という固定したファイルに書き込まれ、抽出した文字列は strings という固定ファイルに追加されます。xstr は個々の C ファイルを対象として実行するので、次の .c.o 規則がよく使用されます。


.c.o:
    $(CC) $(CPPFLAGS) -E $*.c | xstr -c - 
    $(CC) $(CFLAGS) $(TARGET_ARCH) -c x.c
    mv x.o $*.o

この場合、各ターゲットを作成するごとに、x.cstrings という同じファイルに書き込みを行うので、dmake ユーティリティは上のルールにもとづいてターゲットを同時に作成することはできません。また使用するファイルを変更することもできません。この場合は、.NO_PARALLEL: という特殊なターゲットを使用して、dmake に各ターゲットを同時には作成しないように指示する必要があります。たとえば、.c.o 規則を使用して作成するオブジェクトを OBJECTS マクロで定義すると、次の指定により dmake は各ターゲットを直列形式で作成するようになります。


.NO_PARALLEL: $(OBJECTS)

大部分のオブジェクトを直列的に作成する場合は、依存関係のない .NO_PARALLEL: ターゲットを入れて、全オブジェクトをデフォルトとして強制的に直列処理するように設定するのが、安全で簡単な方法です。並列的に処理できるターゲットは、次のように .PARALLEL: ターゲットの依存関係として記述できます。


.NO_PARALLEL:
.PARALLEL: $(LIB_OBJECT)

入れ子構造の分散メークの呼び出し

dmake が、さらに別の dmake コマンドを呼び出すターゲットを検出すると、並列ではなく、直列形式でターゲットが作成されます。これにより、 2 つの異なる dmake の呼び出しが、同じディレクトリ中の同じターゲットを作成することはなくなります。このような問題は、 2 つの異なるプログラムを同時に作成して、両方が同じライブラリにアクセスする場合などに起きます。それぞれの dmake の呼び出しで、必ず最新のライブラリを適用するには、dmake を繰り返し呼び出して、このライブラリを作成する必要があります。dmake ユーティリティは、CLI で $(MAKE) マクロが使用されている場合に、入れ子になった呼び出しを認識します。

入れ子のコマンドを使用した場合でも、必ず正しい結果が得られる確信があれば、.PARALLEL: 構文を使用して、並列的に処理することができます。

メークファイルの中に、並列的に実行する入れ子のコマンドが多数含まれている場合は、負荷平均化アルゴリズムのために、ローカルのマシンに割り当てられる構築ジョブが超過する場合があります。この結果、スワップ空間の不足といった別の問題が生じたり、処理負荷が高くなったりすることも考えられます。こうした問題が起きた場合は、入れ子にしたコマンドをすべて直列形式で実行するように変更してください。