1. ホーム
  2. makefile

[解決済み] 1つのソースファイルからいくつかのターゲットを生成するGNU Makefileルール

2022-09-28 09:15:34

質問

次のようなことをやろうとしています。あるプログラムがあり、それを foo-bin というプログラムがあり、1 つの入力ファイルを受け取って 2 つの出力ファイルを生成します。これに対する馬鹿な Makefile ルールは次のようになります。

file-a.out file-b.out: input.in
    foo-bin input.in file-a.out file-b.out

しかし、これでは make に対して、両方のターゲットが同時に生成されることを何ら伝えていません。を実行するときはいいのですが make を直列に実行する場合は良いのですが,もし make -j16 などとすると問題が発生する可能性があります。

問題は、そのような場合のために適切な Makefile のルールを書く方法が存在するかどうかということです。 明らかに DAG を生成するでしょうが、どういうわけか GNU make マニュアルにはこのケースがどのように扱われうるか明記されていません。

同じコードを 2 回実行し、1 つの結果のみを生成することは、計算に時間がかかるため、問題外です (数時間と考えてください)。1 つのファイルのみを出力することもかなり難しいでしょう。なぜなら、データ ファイルの一部のみを処理する方法を知らない GNUPLOT への入力として、頻繁に使用されるからです。

どのように解決するのですか?

私は次のように解決します。

file-a.out: input.in
    foo-bin input.in file-a.out file-b.out   

file-b.out: file-a.out
    #do nothing
    noop

この場合、並列 make は a と b の作成を「直列化」しますが、b の作成は何もしないので、時間はかかりません。