私はそれらの違いについて混乱しています。
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)
使用すると、date
2回実行(およびstderrとして印刷)されます。$(xyzzy)
しかし、これは:
xyzzy := $(shell date >&2)
foo:
: $(xyzzy)
: $(xyzzy)
set時にdate
一度実行してstderrに印刷します。xyzzy
この場合、ターゲットが処理されなくてもdate
ターゲットが実行される。foo