Makefileの「再帰拡張変数の割り当て」と「単純な拡張変数の割り当て」の違いは何ですか?

Makefileの「再帰拡張変数の割り当て」と「単純な拡張変数の割り当て」の違いは何ですか?

私はそれらの違いについて混乱しています。

GNUドキュメントを読んだが、まだ混乱している。

指定した値はそのままインストールされます。他の変数への参照が含まれている場合、その変数が置き換えられるたびに(他の文字列を拡張する際に)、これらの参照が拡張されます。これが発生した場合を再帰拡張と呼びます。

変数が定義されると、単純に拡張された変数の値が一度スキャンされ、他の変数と関数への参照が拡張されます。拡張が完了すると、変数の値は拡張されなくなります。変数を使用すると、値は拡張としてそのままコピーされます。変数への値参照が含まれている場合、拡張結果には変数が定義されたときの値が含まれます。

誰でも彼らの違いを明確に説明できますか?

ありがとうございます。

答え1

説明しようとしているすべての文書は、(使用時にネストされた拡張を処理することの違いです)。再帰割り当て=)、割り当て時(簡単な宿題:=)。


簡単な例を見てください:

これ

foo = abc
bar = $(foo)
foo = xyz

all:
    echo $(bar)

$(foo)使用時に拡張される「xyz」を印刷します。$(bar)

しかし、これは:

foo := abc
bar := $(foo)
foo := xyz

all:
    echo $(bar)

$(foo)設定後に拡張される「abc」を印刷します。bar


同様に、

xyzzy = $(shell date >&2)

foo:
    : $(xyzzy)
    : $(xyzzy)

使用すると、date2回実行(およびstderrとして印刷)されます。$(xyzzy)

しかし、これは:

xyzzy := $(shell date >&2)

foo:
    : $(xyzzy)
    : $(xyzzy)

set時にdate一度実行してstderrに印刷します。xyzzyこの場合、ターゲットが処理されなくてもdateターゲットが実行される。foo

関連情報