我们什么时候在GNU makefile中使用:=和=呢?
与我们什么时候在GNU makefile中使用:=和=呢?,makefile,gnu-make,Makefile,Gnu Make,与:=相比,首选=的场景是什么? 在哪些情况下,:=比=更受欢迎? 我从网站上读到,使用=会使运行变慢。我只是想知道,我们什么时候在makefile中使用=呢?对于简单定义的变量,您可以递归地使用变量: ITEMS := one two three ITEMS := $(addsuffix $(ITEMS)) 这是因为简单赋值(:=)是按照您读取它们的顺序进行的 非简单赋值(=)是递归展开的,因此,如果将其赋值给其他变量,它们将依次展开,直到得到包含所有展开部分的最终结果。请注意,makefi
:=
相比,首选=
的场景是什么?在哪些情况下,
:=
比=
更受欢迎?我从网站上读到,使用
=
会使运行变慢。我只是想知道,我们什么时候在makefile中使用=
呢?对于简单定义的变量,您可以递归地使用变量:
ITEMS := one two three
ITEMS := $(addsuffix $(ITEMS))
这是因为简单赋值(:=
)是按照您读取它们的顺序进行的
非简单赋值(=
)是递归展开的,因此,如果将其赋值给其他变量,它们将依次展开,直到得到包含所有展开部分的最终结果。请注意,makefile首先解析该文件,以便分配的顺序不那么重要,下面的示例如下:
i、 e.这是不允许的:
ITEMS = one two three
ITEMS = $(addsuffix $(ITEMS))
因此,这会影响您何时要使用每种类型。使用non simple,您可以执行以下操作:
ITEMS1 = a b c
ITEMS_all = $(ITEMS1) $(ITEMS2)
ITEMS2 = d e f
现在,所有项目都将包含a b c d e f
——即使它们没有按顺序定义,这也是非常有用的。因此,如果您只想分配一个简单的值-请坚持使用:=
如果您想继续向变量添加内容,您可能希望使用=
…简单定义的变量,您可以递归地使用变量:
ITEMS := one two three
ITEMS := $(addsuffix $(ITEMS))
这是因为简单赋值(:=
)是按照您读取它们的顺序进行的
非简单赋值(=
)是递归展开的,因此,如果将其赋值给其他变量,它们将依次展开,直到得到包含所有展开部分的最终结果。请注意,makefile首先解析该文件,以便分配的顺序不那么重要,下面的示例如下:
i、 e.这是不允许的:
ITEMS = one two three
ITEMS = $(addsuffix $(ITEMS))
因此,这会影响您何时要使用每种类型。使用non simple,您可以执行以下操作:
ITEMS1 = a b c
ITEMS_all = $(ITEMS1) $(ITEMS2)
ITEMS2 = d e f
现在,所有项目都将包含a b c d e f
——即使它们没有按顺序定义,这也是非常有用的。因此,如果您只想分配一个简单的值,请坚持使用:=
如果您想继续向变量添加内容,您可能需要使用=
…来回答您的问题,当您想延迟右侧的扩展,直到变量被使用时,将使用=
这允许您以任意顺序定义变量。它还允许您使用引用自动变量的值创建变量(请记住,在运行规则之前,自动变量没有值)。例如:
my_FLAGS = -a
your_FLAGS = -b
FLAGS = $($@_FLAGS)
my your : ; @echo $(FLAGS)
如果使用:=
,则无法执行此操作,因为定义标志
变量时,$@
没有值
它们在定义用户定义的函数时也很有用,这些函数以后可以用$(call…
)调用;您不希望在调用这些变量之前展开它们。要回答您的问题,当您希望在使用变量之前延迟右侧的展开时,将使用=
这允许您以任意顺序定义变量。它还允许您使用引用自动变量的值创建变量(请记住,在运行规则之前,自动变量没有值)。例如:
my_FLAGS = -a
your_FLAGS = -b
FLAGS = $($@_FLAGS)
my your : ; @echo $(FLAGS)
如果使用:=
,则无法执行此操作,因为定义标志
变量时,$@
没有值
它们在定义用户定义的函数时也很有用,这些函数以后可以用$(call…
)调用;在调用它们之前,您不希望对它们进行扩展。您确定“首先解析文件后”部分吗?如果我没记错的话,每次使用变量时都会发生扩展。你是对的-事实上是递归扩展的:)-我将澄清这一部分,为了示例的上下文,我试图保持它的琐碎性。。。我会更新那部分你确定“先解析文件后”部分吗?如果我没记错的话,每次使用变量时都会发生扩展。你是对的-事实上是递归扩展的:)-我将澄清这一部分,为了示例的上下文,我试图保持它的琐碎性。。。我会更新那部分