在 GNU makefile 中我们什么时候使用 := 什么时候使用 =?

When do we use := and when do we use = in GNU makefile?

在哪些情况下 = 优于 :=
在什么情况下 :== 更受欢迎?
我从 gnu 网站上读到,使用 = 会使 make 运行 变慢。我只是想知道,我们什么时候在 makefile 中使用 =

使用简单定义的变量,您可以递归地使用变量:

ITEMS := one two three
ITEMS := $(addsuffix $(ITEMS))

这是因为简单赋值 (:=) 是按照您阅读它们的顺序发生的

非简单赋值 (=) 是递归展开的,因此如果您将其赋值给其他变量,它们将依次展开,直到您得到包含所有展开部分的最终结果。请注意,makefile 首先解析文件,因此您执行分配的顺序并不那么重要,示例如下:

即这是不允许的:

ITEMS = one two three
ITEMS = $(addsuffix $(ITEMS))

所以这会影响您何时使用每种类型。使用非简单你可以做:

ITEMS1 = a b c
ITEMS_all = $(ITEMS1) $(ITEMS2)
ITEMS2 = d e f

现在 ITEMS_ALL 将包含 a b c d e f - 尽管它们没有按顺序定义,但这可能非常有用。因此,如果您只想分配一个简单的值 - 如果您想继续向变量添加内容,请坚持使用 :=,您可能需要使用 =...

为了回答你的问题,当你想延迟右侧的扩展直到使用变量时,使用 =

这允许您以任何顺序定义变量。它还允许您使用引用自动变量的值创建变量(请记住,自动变量在规则被 运行 之前没有值)。例如:

my_FLAGS = -a
your_FLAGS = -b

FLAGS = $($@_FLAGS)

my your : ; @echo $(FLAGS)

如果您使用 := 这将无法工作,因为当定义 FLAGS 变量时,$@ 没有值。

它们在定义稍后可以用 $(call ...) 调用的用户定义函数时也很有用;您不希望在调用它们之前展开它们。