【发布时间】:2012-07-05 13:11:09
【问题描述】:
:= 和 += 在 Linux 内核 Makefile 中是否相同并且可以互换使用?如果不是,那两者有什么区别呢?
【问题讨论】:
标签: makefile linux-kernel kernel
:= 和 += 在 Linux 内核 Makefile 中是否相同并且可以互换使用?如果不是,那两者有什么区别呢?
【问题讨论】:
标签: makefile linux-kernel kernel
正如其他人所说,:= 是分配。
但:= 和= 之间存在细微差别。在大多数情况下,这无关紧要,但可能会产生很大的不同。
X = $(Y) 将X 定义为递归变量,类似于 C 预处理器宏。
每当引用X 时,将使用Y 的值。
扩展发生在 X 扩展时。所以你可以在定义X之后再定义Y,就可以了。
X := $(Y) 将X 定义为一个简单的变量。这更像是一个 C 作业。
现在,Y 在定义时已扩展,因此稍后更改它将无济于事。
X += $(Y) 附加到X,但保持其类型。
如果X 之前用= 定义,Y 将不会立即展开。如果从未定义过 X,则相同。
如果X 之前用:= 定义,Y 将立即展开。
你可以试试这个示例生成文件:
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
【讨论】:
:= 和 = 之间的区别对于在尝试编写/诊断 makefile 时不会发疯至关重要。
:= 类似于 =, i。 e 这是一个作业。
+= 是一个连接和赋值运算符。
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
【讨论】:
abc def,而不是abcdef。
:= 等同于= 具有误导性;有一个关键的区别。
:= 是赋值。 += 是串联。见here.
【讨论】:
:= 清除您要分配的变量的先前值,而 += 向变量添加(连接)
例如,假设 CFLAGS 已设置为 -Wundef
如果我们这样做,
CFLAGS := -Wall
CFLAGS 现在设置为“-Wall”
如果我们这样做,
CFLAGS += -Wall
CFLAGS 现在变为“-Wundef -Wall”
在 Linux Makefiles 中经常使用它。
【讨论】: