Makefile中有什么区别:=和=?

时间:2011-02-02 20:38:08

标签: makefile gnu-make colon-equals

对于Make中的变量赋值,我看到:=和=运算符。他们之间有什么区别?

5 个答案:

答案 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 即使没有被使用也会立即评估。