web-dev-qa-db-ja.com

GNU作成:警告:ターゲット `xxx 'の古いコマンドを無視します

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」ターゲットを構築するためのコマンドが実行されるのはなぜですか?

13
bav

依存関係はコマンドとは異なります。 aへの依存は忘れられませんが、コマンドは忘れられません。

12
tripleee