【发布时间】:2011-06-20 06:12:07
【问题描述】:
对于 Make 中的变量赋值,我看到 := 和 = 运算符。他们之间有什么区别?
【问题讨论】:
-
Makefile variable assignment 的可能重复项
标签: makefile gnu-make colon-equals
对于 Make 中的变量赋值,我看到 := 和 = 运算符。他们之间有什么区别?
【问题讨论】:
标签: makefile gnu-make colon-equals
对我来说,在实践中查看它的最佳方式是在这个 Makefile sn-p 期间:
XX := $(shell date) // date will be executed once
tt:
@echo $(XX)
$(shell sleep 2)
@echo $(XX)
跑步
make tt
将产生:
sex 22 jan 2021 14:56:08 -03
sex 22 jan 2021 14:56:08 -03
(相同值)
XX = $(shell date) // date will be executed every time you use XX
tt:
@echo $(XX)
$(shell sleep 2)
@echo $(XX)
跑步
make tt
将产生:
sex 22 jan 2021 14:56:08 -03
sex 22 jan 2021 14:56:10 -03
不同的值
【讨论】:
这是一个老问题,但这个例子可以帮助我在忘记时理解差异。
使用以下 Makefile 运行 make 将立即退出:
a = $(shell sleep 3)
使用以下 Makefile 运行 make 会休眠 3 秒,然后退出:
a := $(shell sleep 3)
在前一个 Makefile 中,a 直到它在 Makefile 的其他地方使用才被评估,而在后者中,a 即使没有被使用也会立即被评估。
【讨论】:
:=
一个简单的赋值表达式只计算一次,在第一次出现时。
例如,如果在第一次相遇期间CC :=${GCC} ${FLAGS} 被评估为gcc -W,那么
每次出现${CC} 时,都会被gcc -W 替换。
=
每次遇到变量时都会计算递归赋值表达式
在代码中。例如,像CC = ${GCC} {FLAGS} 这样的语句只会在
像${CC} file.c 这样的动作被执行。但是,如果变量 GCC 被重新分配,即
GCC=c++ 然后${CC} 将在重新分配后转换为c++ -W。
?=
条件赋值仅在变量没有值时才为其赋值
+=
假设CC = gcc,那么附加运算符的使用就像CC += -w
那么CC 现在的值是gcc -W
更多信息请查看tutorials
【讨论】:
这在 GNU Make 文档的标题为 6.2 The Two Flavors of Variables 的部分中有描述。
简而言之,用:= 定义的变量会展开一次,而用= 定义的变量会在每次使用时展开。
【讨论】:
make 的主要工作)比这种内部变量解析的开销要大得多。
来自http://www.gnu.org/software/make/manual/make.html#Flavors:
= 定义了一个递归扩展的变量。 := 定义了一个简单扩展的变量。
【讨论】: