2017-12-21 9 views
2

Should は、前提条件を満たしていてファイルを指していないレシピを持っているターゲットを常にリメイクしますか?またはは、1つ以上の前提条件を再作成する必要がある場合にのみ、そのようなターゲットをリメイクしますか?GNU makeはファイル以外のターゲットを常に再作成したものとみなします。

たとえば、以下に示すMakefileでは、前提条件を持つobjectsというターゲットを追加しましたが、ファイルを指していません。 programと呼ばれる主要なターゲットは、objects(およびその他の前提条件もあります)に依存します。

file1 file2 file3: ;  touch [email protected] 

objects: file1 file2 

program: objects file3 ; @echo 'Making [email protected]' 

私の期待はmake programが実行され、何のファイル前提条件がリメイクする必要はない(すなわちFILE1、FILE2 FILE3と、すべてが存在する)されたときに、programがリメイクされるべきではないとということです。

実際のGNU の動作は、programのレシピが常に実行されることです(前提条件ファイルに関係なく)。これは、objectsは常に再作成されたものとみなされ、依存関係(つまりprogram)を再作成する必要があるからです。

あなたが実行することでこれを確認することができます:make --trace -d --no-builtin-rules programを、あなたはを作ることがわかりますが、常に「は、ターゲットのオブジェクト」をリメイクしなければならない」を出力 だからobjectsは常に「リメイク」(それが何のレシピを持っていなくても)常に新しく更新されたものとみなされます。

これは、objectsが実際のファイルを指していない可能性が高いためです。しかし、私はレシピがないので、その前提条件のどれも再作成する必要がない限り、再製作されないことを期待していました。

これは予期した動作ですか、それともバグですか?

GNU Make manual状態:

ルールには、前提条件やレシピを持っていない、とルール のターゲットが存在しないファイルで、そのルールがある時はいつでも想像このターゲットが を更新されているために作成した場合走るこれは、これに依存するすべてのターゲット が常にレシピを実行することを意味します。

しかしobjectsターゲットは前提条件をていないので、その説明は、上記の場合には適用されません。しかし、おそらく動作は同じで、Makeマニュアルは、これを明確にするために更新する必要があります。

いくつかの追加の注意事項:

  • 私はそれが簡単に 読者がコードをコピーして貼り付けできるようにすること上記のレシピ-後のセミコロンのフォーマットを使用していました。それ以外の場合、 ウェブページからコピーすると、タブは通常の タブインデントレシピ形式のスペースに変換されます。もちろん

  • 私はちょうど は、ファイルのリストを指すと上記objects ターゲットの代わりにそれを使用することを変数$(OBJECTS)を作ることができることを知っています。それは本当にここでのポイントではありません。

  • This questionも同じ動作をしているようですが、期待される動作であるかバグが議論されているかどうかは関係ありません。

  • 私は私はあなたが引用された段落は、単にどのようにFORCEのためのシーンを設定するために、すでに他の場所で指定の挙動の特定の場合をリキャップしていることを信じているGNUは4.2.1

答えて

4

を確認し使用しています働く確かに単純でありながら、より一般的な、文はprevious sectionに作られ

あなたがそのレシピターゲットファイルを作成しませんルールを記述する場合、レシピはターゲットが起動するたびに実行されますリメイクのため。

そして再びhere:それは前提条件のいずれよりも古い場合、それが存在しない場合、または

ターゲットが古くなっています。

したがって、あなたが観察している動作は完全に予想されます。

関連する問題