Makefile中 = ?= += :=的区别
= 最基本的赋值
:= 覆盖之前的值
?= 如果没有被赋值过就赋予等号后面的值
+= 添加等号后面的值
ifdef DEFINE_VRE
VRE = "Hello World!"
else
endif
ifeq ($(OPT), define)
VRE ?= "Hello World! First!"
endif
ifeq ($(OPT), add)
VRE += "Kelly!"
endif
ifeq ($(OPT), recover)
VRE := "Hello World! Again!"
endif
all:
@echo $(VRE)
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover 输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!
"=":make会将整个Makefile展开后,再决定变量的值。也就是说,变量的值将会是整个Makefile中最后被指定的值。
X = foo
Y = $(X) bar
X = xyz
Y的值是
xyz bar,X的值是xyz
":=" 表示变量的值决定于它在Makefile中的位置,而不是整个Makefile展开后的最终值。
X1 := foo
Y1 := $(X1) bar
X1 := xyz
Y1的值是
foo bar,X1的值是xyz
参考: