GNU Makefile變量賦值=,?=,:=和+ =之間有什麼區別?


Answers

使用=會使變量分配一個值。 如果變量已經有一個值,它將被替換。 該值在使用時會擴大。 例如:

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擴展。

Question

任何人都可以清楚地說明變量賦值在Makefiles中是如何工作的。

有什麼區別:

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

我已經閱讀了GNU Make手冊中的section ,但它對我仍然沒有意義。




當您使用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尚未設置,則只設置VARIABLE的值。 如果尚未設置,則將該值的設置延遲至使用VARIABLE (如示例1中所示)。

VARIABLE += value只是將value附加到VARIABLE 。 價值的實際價值是根據初始設置時確定的,使用=:=




Links