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
が実際のファイルを指していない可能性が高いためです。しかし、私はレシピがないので、その前提条件のどれも再作成する必要がない限り、再製作されないことを期待していました。
これは予期した動作ですか、それともバグですか?
ルールには、前提条件やレシピを持っていない、とルール のターゲットが存在しないファイルで、そのルールがある時はいつでも想像このターゲットが を更新されているために作成した場合走るこれは、これに依存するすべてのターゲット が常にレシピを実行することを意味します。
しかしobjects
ターゲットは前提条件をていないので、その説明は、上記の場合には適用されません。しかし、おそらく動作は同じで、Makeマニュアルは、これを明確にするために更新する必要があります。
いくつかの追加の注意事項:
私はそれが簡単に 読者がコードをコピーして貼り付けできるようにすること上記のレシピ-後のセミコロンのフォーマットを使用していました。それ以外の場合、 ウェブページからコピーすると、タブは通常の タブインデントレシピ形式のスペースに変換されます。もちろん
私はちょうど は、ファイルのリストを指すと上記
objects
ターゲットの代わりにそれを使用することを変数$(OBJECTS)
を作ることができることを知っています。それは本当にここでのポイントではありません。This questionも同じ動作をしているようですが、期待される動作であるかバグが議論されているかどうかは関係ありません。
私は私はあなたが引用された段落は、単にどのように
FORCE
のためのシーンを設定するために、すでに他の場所で指定の挙動の特定の場合をリキャップしていることを信じているGNUは4.2.1