私は、複数の出力ファイルを生成するツールを持っています。これは、makeでモデリングするのが難しいことで有名です。私はGNU Makefile rule generating a few targets from a single source fileでレシピを使用していますが、これは簡単で信頼できるようです。そしてそれはほぼの作品です。信頼できない並列は、.INTERMEDIATEを使用してmakefileにビルドされますか?
残念ながら、並列ビルドに関するいくつかの非常に奇妙な動作が見られます。並列ビルドに関しては、依存関係が時々破棄されるようです。なぜ私は理解できません。私は一度それを構築する場合
out3: out1 out2
touch out3
.INTERMEDIATE: out.intermediate
out1 out2: out.intermediate
out.intermediate: in
touch out1 out2
、それは動作します:
は、ここに私のテストケースだ
$ touch in
$ make -f test.mk out3 -j4
touch out1 out2
touch out3
out1
とout2
が一緒に構築されて、一度、良いです。その結果からout3
が構築されます。
は今、私はインクリメンタルビルドをシミュレートし、入力ファイルに触れ、再度実行してください:
$ touch in
$ make -f test.mk out3 -j4
touch out1 out2
正しく、out1
とout2
を再構築だ...しかし、それはそれは持っている必要がありout3
を再構築していないこと。それでは別のビルドをすれば:
$ make -f test.mk out3 -j4
touch out3
...そしてそれがキャッチアップします。
は、並列ビルドに適用されます。 -j1
は正常に動作します。
これは悪いです---私は正しいビルドに頼ることができる必要があります。誰が何が起こっているかについて何か考えがありますか?
これはGNU Make 4.1です。
あなたが参照しているレシピはGNU以外のフォールバック提案 です。あなたが* GNU Makeを使用しているときには、GNU Makeソリューションを同じ答えで使うことができます。GNU Makeソリューションを最も上に挙げた答えで使うことができます。テストケースでそれを試してみました。 –
GNUはどのソリューションを作っていますか?あなたはパターンを意味しますか?私のファイル名は関連していないので、これは適切ではありません。 –
必要な関連性は、ターゲットファイル名(前提条件ファイル名ではない)が少なくとも1つの文字( '。それじゃない? –