回答:
VARIABLE = value
変数の通常の設定ですが、value
フィールドで言及された他の変数は、宣言されたときのものではなく、変数が使用された時点での値で再帰的に展開されます
VARIABLE := value
内部の値の単純な展開による変数の設定-その中の値は宣言時に展開されます。
VARIABLE ?= value
値がない場合のみの変数の設定。value
にVARIABLE
アクセスすると、常に評価されます。に相当
ifeq ($(origin FOO), undefined)
FOO = bar
endif
詳細については、ドキュメントを参照してください。
VARIABLE += value
指定された値を既存の値に追加する(または、変数が存在しない場合はその値に設定する)
を使用する=
と、変数に値が割り当てられます。変数にすでに値がある場合は、置き換えられます。この値は使用時に拡張されます。例えば:
HELLO = world
HELLO_WORLD = $(HELLO) world!
# This echoes "world world!"
echo $(HELLO_WORLD)
HELLO = hello
# This echoes "hello world!"
echo $(HELLO_WORLD)
の使用:=
はの使用に似てい=
ます。ただし、値は使用時に展開されるのではなく、割り当て中に展開されます。例えば:
HELLO = world
HELLO_WORLD := $(HELLO) world!
# This echoes "world world!"
echo $(HELLO_WORLD)
HELLO = hello
# Still echoes "world world!"
echo $(HELLO_WORLD)
HELLO_WORLD := $(HELLO) world!
# This echoes "hello world!"
echo $(HELLO_WORLD)
を使用すると?=
、以前に変数が割り当てられていなかった場合に、変数に値が割り当てられます。変数に以前に空白値(VAR=
)が割り当てられていた場合、それはまだセットと見なされます。それ以外の場合、機能はまったく同じです=
。
using +=
はusing =
に似ていますが、値を置き換えるのではなく、値を現在の値にスペースを入れて追加します。変数が以前にで設定されていた場合、:=
展開されると思います。結果として得られる値は、使用すると拡張されると思います。例えば:
HELLO_WORLD = hello
HELLO_WORLD += world!
# This echoes "hello world!"
echo $(HELLO_WORLD)
のようなものHELLO_WORLD = $(HELLO_WORLD) world!
が使用された場合、再帰が発生し、Makefileの実行が終了する可能性が高くなります。場合A := $(A) $(B)
に使用された、その結果は、使用するのとまったく同じではない+=
ので、B
で展開されている:=
のに対し+=
起こさないB
拡張します。
VARIABLE = literal
とVARIABLE := literal
常に同じです。私はそれを正しく理解しましたか?
「make」を使用していくつかの実験を行うことをお勧めします。これは、=
との違いを示す簡単なデモ:=
です。
/* Filename: Makefile*/
x := foo
y := $(x) bar
x := later
a = foo
b = $(a) bar
a = later
test:
@echo x - $(x)
@echo y - $(y)
@echo a - $(a)
@echo b - $(b)
make test
プリント:
x - later
y - foo bar
a - later
b - later bar
@
この混乱する結果の繰り返しを避けるために、各レシピの前にaを使用することをお勧めします。
/* ... */
ブロックコメントをサポートしていません
を使用するVARIABLE = value
場合、value
が実際に別の変数への参照である場合、値はVARIABLE
が使用されるときにのみ決定されます。これは例で最もよく説明されています:
VAL = foo
VARIABLE = $(VAL)
VAL = bar
# VARIABLE and VAL will both evaluate to "bar"
を使用するとVARIABLE := value
、value
現在の値が得られます。例えば:
VAL = foo
VARIABLE := $(VAL)
VAL = bar
# VAL will evaluate to "bar", but VARIABLE will evaluate to "foo"
を使用VARIABLE ?= val
すると、VARIABLE
if の値のみが設定されますVARIABLE
。まだ設定されていない場合、値の設定はVARIABLE
が使用されるまで延期されます(例1のように)。
VARIABLE += value
に追加value
するだけVARIABLE
です。の実際の値はvalue
、=
またはを使用して、最初に設定されたときと同じように決定されます:=
。
上記の回答では、「値は宣言/使用時に展開される」とはどういう意味かを理解することが重要です。のような値を指定*.c
しても、拡張は必要ありません。この文字列がコマンドによって使用された場合のみ、何らかのグロビングがトリガーされる可能性があります。同様に、拡張のような値$(wildcard *.c)
または$(shell ls *.c)
拡張を伴わない値は、使用した場合でも定義時に完全に評価されます:=
、変数定義でしたます。
Cファイルがあるディレクトリで次のMakefileを試してください。
VAR1 = *.c
VAR2 := *.c
VAR3 = $(wildcard *.c)
VAR4 := $(wildcard *.c)
VAR5 = $(shell ls *.c)
VAR6 := $(shell ls *.c)
all :
touch foo.c
@echo "now VAR1 = \"$(VAR1)\"" ; ls $(VAR1)
@echo "now VAR2 = \"$(VAR2)\"" ; ls $(VAR2)
@echo "now VAR3 = \"$(VAR3)\"" ; ls $(VAR3)
@echo "now VAR4 = \"$(VAR4)\"" ; ls $(VAR4)
@echo "now VAR5 = \"$(VAR5)\"" ; ls $(VAR5)
@echo "now VAR6 = \"$(VAR6)\"" ; ls $(VAR6)
rm -v foo.c
実行make
すると、呼び出される追加の(空の)Cファイルを作成するルールがトリガーされfoo.c
ますがfoo.c
、その値に6つの変数はありません。