参考博客: Makefile赋值符号的使用——"=" ":=" "?=" "+="_秦伟H的博客-CSDN博客
1、“=”,是最基本的赋值
make将整个Makefile展开后再决定变量的值,变量的值等于Makefile中最后给这个变量所指定的值(换言之,只看最后的赋值)。
比如下面例子中,y的值将会是“xyz bar”,而不是“foo bar”。
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# cat Makefile x = foo y = $(x) bar x = xyz #x的值最后是xyz,所以y=xyz bar all:@echo 'x='$(x)@echo 'y='$(y)root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# make x=xyz y=xyz bar root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel#
2、“:=”,表示覆盖之前的值而进行赋值
另外,变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
那么下面例子中,y的值将会是“foo bar”,而不是“xyz bar”。打脸啊!!!!
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# cat Makefile x = foo y = $(x) bar x := xyzall:@echo 'x='$(x) #x=xyz@echo 'y='$(y) #y=foo barroot@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# make x=xyz y=xyz bar root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel#
3、“?=”,表示如果没有被赋值,则赋予等号后面的值
比如代码中如果有“x=”这样的语句,即“=”后面什么也没有,它的意思为“x的值未定义”或者“x没有被赋值”,此时“?=”的赋值操作才会生效。如果“=”后面已经赋值,那这个“?=”的赋值操作就不生效。
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# cat Makefile
x = foo
x ?= abcd
all:@echo $(x)
#x最后等于foo,因为?=表示没有赋值则进行赋值,现在已经赋值了,所以不再赋值
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# make
foo
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# cat Makefile
#x =
x ?= abcd
all:@echo $(x)
#x最后等于abcd,因为?=表示没有赋值则进行赋值,现在没有赋值所以赋值
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# make
abcd
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel#
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# cat Makefile
x =
x ?= abcd
all:@echo $(x)
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# makeroot@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel#
4、“+=”,表示添加等号后面的值
这有点像字符串的拼接,追加的和原来的有一个空格?(不是因为我输入=左右的缘故)
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# cat Makefile
x = foo
y = bar
x += $(y) all:@echo $(x) #注意这里的“空格”是tab而非空格。另外添加@表示不显示“echo”这个字样#x最后的值为“foo bar”root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel# make
foo bar
root@ubuntu:/home/xjh/iot/embedded_basic_course/kernel/jiuding_kernel#