891

変数の割り当てが Makefile で実際にどのように機能するかを明確に説明できる人はいますか。

違いは何ですか :

 VARIABLE = value
 VARIABLE ?= value
 VARIABLE := value
 VARIABLE += value

GNU Make のマニュアルのセクションを読みましたが、それでも意味がわかりません。

4

6 に答える 6

1165

レイジーセット

VARIABLE = value

変数の通常の設定ですが、フィールドで言及されている他の変数valueは、宣言されたときの値ではなく、変数が使用される時点での値で再帰的に展開されます

即時セット

VARIABLE := value

内部の値を単純に展開する変数の設定 - その中の値は宣言時に展開されます。

存在しない場合のレイジー セット

VARIABLE ?= value

値がない場合のみの変数の設定。valueがアクセスされると常に評価されVARIABLEます。と同等です

ifeq ($(origin VARIABLE), undefined)
  VARIABLE = value
endif

詳細については、ドキュメントを参照してください。

追加

VARIABLE += value

提供された値を既存の値に追加します (変数が存在しない場合は、その値に設定します)。

于 2009-01-15T23:25:35.207 に答える
307

を使用する=と、変数に値が割り当てられます。変数がすでに値を持っている場合は、それが置き換えられます。この値は使用時に拡張されます。例えば:

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==

の使用+=は の使用に似て=いますが、値を置き換える代わりに、値が現在の値に追加され、その間にスペースが挿入されます。変数が以前に で設定されていた場合:=は、展開されていると思います。結果の値は、使用すると拡張されると思います。例えば:

HELLO_WORLD = hello
HELLO_WORLD += world!

# This echoes "hello world!"
echo $(HELLO_WORLD)

のようなものHELLO_WORLD = $(HELLO_WORLD) world!を使用すると、再帰が発生し、Makefile の実行が終了する可能性が高くなります。が使用された場合、結果は使用とまったくA := $(A) $(B)同じにはなりません。+=B:=+=B

于 2009-01-15T23:34:46.093 に答える
76

「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

詳しい説明はこちら

于 2012-12-23T14:43:59.037 に答える
34

を使用する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"

Usingとは、 ifがまだ設定されていない場合VARIABLE ?= valにのみ値を設定することを意味します。まだ設定されていない場合、値の設定はが使用されるまで延期されます (例 1 のように)。VARIABLE VARIABLEVARIABLE

VARIABLE += valueに追加valueするだけVARIABLEです。の実際の値は、またはvalueを使用して、最初に設定されたときと同じように決定されます。=:=

于 2009-01-15T23:26:15.410 に答える