5

GNU make を使用して、「--jobs」オプションを使用すると、同時にスケジュールされない一連のターゲットを作成できますか?

バックグラウンド:

これをもう少し具体的にするために、次の形式のメイクファイルを検討してください。

p1: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p2: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

p3: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
        ...rules...

e1: ...deps... # cannot run at same time as any other e*
        ...rules...

e2: ...deps... # cannot run at same time as any other e*
        ...rules...

e3: ...deps... # cannot run at same time as any other e*
        ...rules...

私がする必要がある主なことは、e1、e2、および e3 が同時に処理されないようにすることです。これは、リソースが限られている組み込みデバイスで何らかの作業を行うためです。それらの複数のものが同時に実行されている場合、それらはクラッシュします。p1、p2、および p3 は、任意の e* ジョブを含む任意のものと並行して実行できます。

実際のメイクファイルには、約 10 レベルの深さの依存関係ツリーを持つ数千のターゲットがあることに注意してください。そのため、(a) make を連続して実行する必要がなく、(b) の利点を保持する方法があることを願っています。メイクファイルで依存関係ツリーをエンコードします。

4

2 に答える 2

6

選択肢の 1 つは、「flock」を使用して、排他ロックの下で「e」ルールを実行することです。詳細は man flock(1) を参照してください。たとえば、代わりに

e2: deps
    my_cmd foo bar

あなたが持つことができます

e2: deps
    flock .embedded-device-lock -c my_cmd foo bar

そうすると、すべての「e」ターゲットが make によって並行して (おそらく) 開始されますが、実際のコマンドは順次実行されます。

于 2009-02-23T17:38:55.337 に答える
3

これは完全な解決策ではありませんが、順序のみの前提条件を使用して、e* ターゲットに特定の順序を課すことができます。

e1: ...deps...
    ...commands...
e2: ...deps... | e1
    ...commands...
e3: ...deps... | e2 e1
    ...commands...

パイプ記号「|」の後の前提条件 注文のみです。たとえば、e1 または e2 が変更された場合に e3 を強制的に更新することはありませんが、e3 のコマンドが開始される前に、e1 および e2 のすべてのコマンドの実行が終了する必要があります。

これの欠点は、順序を選択させるのではなく、これらの相互に排他的な前提条件に対して特定の順序を課すことmakeですが、実際には、合理的な順序を手動で把握できる可能性があります。

于 2009-02-23T17:48:38.340 に答える