对于Make中的变量赋值,我看到:=和=运算符。他们之间有什么区别?
答案 0 :(得分:56)
这在GNU Make文档的标题为6.2 The Two Flavors of Variables 的部分中进行了描述。
简而言之,使用:=
定义的变量会扩展一次,但使用=
定义的变量会在使用时展开。
答案 1 :(得分:33)
简单赋值表达式仅在第一次出现时计算一次。
例如,如果第一次遭遇期间的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
答案 2 :(得分:11)
来自http://www.gnu.org/software/make/manual/make.html#Flavors:
=
定义递归扩展变量。 :=
定义了一个简单扩展的变量。
答案 3 :(得分:6)
对我来说,在实践中看到它的最佳方式是在这个 Makefile 片段中:
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:58:08 -03
不同的值
答案 4 :(得分:0)
这是一个老问题,但这个例子可以帮助我在忘记时理解差异。
使用以下 Makefile 运行 make
将立即退出:
a = $(shell sleep 3)
使用以下 Makefile 运行 make
将休眠 3 秒,然后退出:
a := $(shell sleep 3)
在前者的 Makefile 中,a
直到在 Makefile 的其他地方使用时才会被评估,而在后者中,a
即使没有被使用也会立即评估。