备注:
makefile中变量定义直接写就表示定义该变量,例如makefile文件中写如下一行代码:
a
就表示定义变量a,且未赋值。
一、变量赋值方法(赋值运算符)
赋值运算符:
=
?=
:=
+=
define
二、变量赋值两种类型
makefile中变量赋值分为两种方式:延时变量和立即变量
2.1、延时变量
延时变量表示:使用该变量的时候,才展开该变量,并确定该变量的值(如 “=”、“?=”、“define”定义的变量)
2.2、立即变量
立即变量表示:定义的时候就已经确定了该变量的值(如“:=”定义的变量,即:=表示立即对变量赋值,并且会覆盖前面的值)
三、 = 与 := 与 ?= 与 += 的区别
符号 | 含义 | 变量类型 |
---|---|---|
= | 递归赋值,当变量展开时,优先从后面展开 | 延时变量 |
:= | 该变量立即赋值(会覆盖前面的值),当变量展开时,优先从前面展开 | 立即变量 |
?= | 若前面没有定义该变量,则此处赋值,如果前面已经定义了,则此处不再赋值 | 延时变量 |
+= | 追加赋值 | 立即变量 |
敲黑板!!!
四、举例验证
x = before
y = $(x)_AAAA
x = later
xx := before
yy := $(xx)_AAAA
xx := later
.PHONY:all
all:
>---@echo "\$$(x) = $(x)"
>---@echo "\$$(xx) = $(xx)"
>---@echo "x = $(y)"
>---@echo "xx = $(yy)"
执行make,结果如下
lsy@ubuntu18:~$ make
$(x) = later
$(xx) = later
x = later_AAAA
xx = before_AAAA
结果分析:
1、无变量嵌套,无需展开:
x和xx最终值都是later,因为语言是从上往下执行的。
2、赋值有变量嵌套,需要展开:
x = later_AAAA,表示 =赋值从后面进行展开,即:后面的优先展开
xx = before_AAAA,表示 :=赋值从前面进行展开,即:前面的优先展开
敲黑板!!!
分析makefile的时候: