GNU Make(バージョン3.81)が単純なMakefileを処理する方法を理解するのを手伝っていただけませんか?ファイルは次のとおりです。
.PHONY: a b c e f
a : b c
@echo "> a(b,c)"
e : a
@echo "> e(a)"
e : f
@echo "> e(f)"
f :
@echo "> f()"
b :
@echo "> b()"
c :
@echo "> c()"
今私はコマンドを実行します
make e
'e'ターゲットを構築します。 Makeの出力は次のようになります。
Makefile:7: warning: overriding commands for target `e'
Makefile:5: warning: ignoring old commands for target `e'
> f()
> b()
> c()
> a(b,c)
> e(f)
http://www.gnu.org/software/make/manual/html_node/Error-Messages.html 次の説明をします:
「警告:ターゲット「xxx」のレシピを上書きします」
「警告:ターゲット「xxx」の古いレシピを無視します」
GNU makeでは、ターゲットごとに1つのレシピのみを指定できます(ダブルコロンルールを除く)。すでに定義されているターゲットのレシピを指定すると、この警告が発行され、2番目のレシピが最初のを上書きします。
しかし、出力から、ビルド 'a'ターゲットのコマンドも実行されていることがわかります。 「エラーメッセージ」ページの説明によると、このMakefileを処理し、「e」ターゲットを構築しようとしているときに(make e)、最初に「e」が「a」に依存していると判断し、これを上書きする必要があると思いました'e'は 'f'に依存します。そして、出力は次のようになります。
Makefile:7: warning: overriding commands for target `e'
Makefile:5: warning: ignoring old commands for target `e'
> f()
> e(f)
しかし、「e」は「a」に依存し、レシピをまったく上書きしないことをまだ覚えているようです。
この動作を理解するのを手伝ってください。レシピを上書きした後でも、「a」ターゲットを構築するためのコマンドが実行されるのはなぜですか?
依存関係はコマンドとは異なります。 a
への依存は忘れられませんが、コマンドは忘れられません。