在哪些情况下,=
比:=
更受欢迎
在哪些情况下,:=
比=
更受欢迎
我从gnu站点了解到,使用=
会使make
运行速度变慢。我只是想知道,我们什么时候在makefile中使用=
?
为了回答您的问题,当您想将右侧的扩展延迟到使用变量时,会使用=
。
这允许您以任何顺序定义变量。它还允许您创建具有引用自动变量的值的变量(请记住,在运行规则之前,自动变量没有值(。例如:
my_FLAGS = -a
your_FLAGS = -b
FLAGS = $($@_FLAGS)
my your : ; @echo $(FLAGS)
如果使用:=
,这将不起作用,因为在定义FLAGS
变量时,$@
没有值。
它们在定义用户定义的函数时也很有用,这些函数稍后可以用$(call ...)
调用;在调用它们之前,您不希望对它们进行扩展。
使用简单定义的变量,您可以递归地使用变量:
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
——尽管它们没有按顺序定义,但这可能非常有用。因此,如果你只想分配一个简单的值——坚持使用:=
——如果你想继续向变量添加内容,你可能想使用=
。。。