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



在哪些情况下,=:=更受欢迎
在哪些情况下,:==更受欢迎
我从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——尽管它们没有按顺序定义,但这可能非常有用。因此,如果你只想分配一个简单的值——坚持使用:=——如果你想继续向变量添加内容,你可能想使用=。。。

最新更新