协慌网

登录 贡献 社区

GNU Makefile 变量赋值 =,?=,:= 和 + = 有什么区别?

任何人都可以清楚地解释变量赋值在 Makefiles 中是如何工作的。

之间有什么区别:

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

我已经阅读了 GNU Make 手册中的部分 ,但是对我来说仍然没有意义。

答案

懒集

VARIABLE = value

变量的常规设置 - 使用该变量时会递归扩展其中的值,而不是在声明该变量时

立即设置

VARIABLE := value

使用内部值的简单扩展设置变量 - 声明时扩展其中的值。

缺席的懒惰集

VARIABLE ?= value

仅在没有值的情况下设置变量。当访问VARIABLE时,总是评估该value 。相当于

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= ), 仍然认为它已设置。否则,功能与=完全相同。

使用+=就像使用= ,但是不是替换值,而是将值附加到当前值后面,并在两者之间留有空格。如果该变量以前是用:=设置的, 我认为它将被扩展。 我认为,使用它时,结果值会扩展。例如:

HELLO_WORLD = hello
HELLO_WORLD += world!

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

如果类似HELLO_WORLD = $(HELLO_WORLD) world!使用后,将导致递归,这很可能会终止 Makefile 的执行。如果使用A := $(A) $(B) ,则结果与使用+=并不完全相同,因为B:=扩展,而+=不会导致B扩展。

我建议您使用 “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

在这里查看更详细的解释