内核Makefile中的=和+ =有什么区别?

时间:2012-07-05 06:48:22

标签: makefile linux-kernel kernel

在Linux内核Makefile中是:=和+ =相同,可以互换使用吗?如果没有,那么两者之间有什么区别?

4 个答案:

答案 0 :(得分:9)

正如其他人所说,:=是作业。

:==之间存在细微差别。在大多数情况下,这并不重要,但它可能会产生很大的不同。

X = $(Y)X定义为递归变量,类似于C预处理器宏。
每当引用X时,都会使用Y的值 扩展X时会发生扩展。因此,您可以在定义Y后定义X,这样就可以了。

X := $(Y)X定义为一个简单变量。这更像是C任务 现在,Y在定义时被扩展,因此稍后更改它将无效。

X += $(Y)附加到X,但保留其类型。
如果先前使用X定义了=,则Y不会立即展开。如果从未定义X,则相同 如果之前使用X定义:=,则Y将立即展开。

你可以试试这个exmaple makefile:

X = 1

Y  = $(X)
Z := $(X)

X = 2

Y += $(X)
Z += $(X)

X = 3

test:
        @echo "Y = $(Y)"
        @echo "Z = $(Z)"

打印

Y = 3 3
Z = 1 2

答案 1 :(得分:3)

:=类似于=,i。这是一项任务。

+ =是一个串联和赋值运算符。

实施例

VARIABLE := abc
# here VARIABLE is abc
VARIABLE := def
# VARIABLE is now def only!

VARIABLE_2 = abc
# VARIABLE_2 is now abc
VARIABLE_2 += def
# VARIABLE_2 is abc def

答案 2 :(得分:0)

:=是作业。 +=是串联的。见here.

答案 3 :(得分:0)

:=清除您要分配的变量的先前值,而 + =将(连接)添加到变量

例如,假设CFLAGS已设置为-Wundef

如果我们这样做,

CFLAGS := -Wall

CFLAGS现在设置为'-Wall'

如果我们这样做,

CFLAGS += -Wall

CFLAGS现在成为'-Wundef -Wall'

它常用于Linux Makefiles。