首先来看一段测试代码
x = foo
y = $(x)bar
z := $(x)bar
x = xyz
y ?= $(z)bar
x += ijk
target:
@echo $(x)
@echo = $(y)
@echo ?= $(y)
@echo := $(z)
输出结果:
xyz ijk #x
:= foobar #z
?= xyz ijkbar #y
= xyz ijkbar #y
- 可以看到,
x
经过三次赋值变为了xyz ijk
+=
的含义显而易见,将右值增加到左边的变量基础上。空格是自动添加的。=
的含义是在右值在遍历整个Makefile,完全展开后再赋值给左边的变量。?=
的含义是如果左值未被赋值过,则将右值赋值给它,可见这里y不会再被赋值一次。:=
的含义是将右值当前的值赋值给左值,不会遍历Makefile获取右值的最终值。