比较好理解的是 ?= ,比较难以区分的是 := 和 =
- ?= 如果变量已经被赋值,那就不再重新赋值
- := 立即赋值,取值时展开
- = 变量被使用时展开
目录
1、?=
VAR = hello # 初次赋值
VAR ?= world # 发现已经赋值就不再重新赋值
all:
@echo $(VAR)
2、:=
如果赋的值是一个常量,效果等价于 ' = ' ;如果赋的值是一个变量,那么在赋值的时候就会把这个变量展开。所谓展开,可以理解为把变量的值取出来。
:= 相当于把P的值取出来拷贝一份赋给 VAR,此后 P 的改变都不会影响到 VAR
P = hello
VAR := $(P) # 立即展开,就相当于 VAR := hello
P = world
all:
@echo $(VAR)
3、 =
如果赋的值是一个常量,效果等价于 ' := ';如果赋的值是一个变量,只有在使用的时候才会把变量展开。相当于只有在使用的时候才会把变量的值取出来。
= 相当于把 P 的地址给了 VAR,取出来的结果还是 P 的内容。
P = hello
VAR = $(P)
P = world # 后续VAR的值会受到 P 的影响
all:
@echo $(VAR)