回答:
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つの変数はありません。