最小限例:なぜこのメイクファイルが私の目標を削除するのですか?
%.txt: foo.log
# pass
%.log:
# pass
ラン:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
最後のアクションは、rm foo.logあるのはなぜ? どのようにそれを取り除く?
最小限例:なぜこのメイクファイルが私の目標を削除するのですか?
%.txt: foo.log
# pass
%.log:
# pass
ラン:
$ make a.txt --dry-run
# pass
# pass
rm foo.log
最後のアクションは、rm foo.logあるのはなぜ? どのようにそれを取り除く?
a.txt
は、の暗黙のルールのチェーン(この場合、自分で定義した暗黙的なルール)によって作成されます。そのため、Makeはfoo.log
をintermediate fileとみなし、その目的を果たしたときに削除します。あなたは二次ターゲットをfoo.log
宣言することでこの動作をオーバーライドすることができます:デフォルトでは
.SECONDARY: foo.log
は、GNU makeが中間ファイルを削除します。 %.txtは%.logに依存するため、makeは.logファイルを削除します。その動作を防止するには、.PRECIOUSまたは.SECONDARYを使用して貴重なマークを付けます。
.PRECIOUS: foo.log
また、依存関係のない.SECONDARYを使用して中間ファイルを削除しないようにすることもできます。
.SECONDARY:
GNU makeマニュアルのthisセクションを参照してください。
.SECONDARY:%.log#does not work、ルールを一般化するにはどうすればよいですか? –
すべての中間体を残したい場合は、依存関係のない.SECONDARY:のターゲットを宣言してください。また、.PRECIOUSでワイルドカードを使用することもできます。つまり、.PRECIOUS:%.log – Sean
@Sean:ワイルドカードはPRECIOUSでは動作しますが、SECONDARYでは動作しないというのは奇妙です... – Beta