结论:
=赋值的变量在变量被用到时才求值;:=赋值的变量在定义时就求值;(即变量展开时机不同。)
举例
x1=a1
y1=$(x1)
x1=b1
x2=a2
y2:=$(x2)
x2=b2
.PHONY:show
show:
echo $(y1)
echo $(y2)
输出结果如下:
root@ubuntu:/home/workspace/Makefile/mf9# make show
echo b1
b1
echo a2
a2
可以看到echo $(y1)
结果不是a1
,而是b1
,也就是说在定义它的地方y1=$(x1)
并没有立刻赋值,而是等到了用到它的地方——echo $(y1)
,这个时候求$(y1)
就是求$(x1)
,求$(x1)
也就是b1
;
而echo $(y2)
结果是a2
,而不是b2
,因为在定义y2的时候——y2:=$(x2)
,就立马求值了,此时y2就是a2
,因此y2是在定义的时候立刻求值。
再看个例子巩固下:
y1=$(x1)
x1=a1
y2:=$(x2)
x2=a2
.PHONY:show
show:
echo $(y1)
echo $(y2)
结果如下:
root@ubuntu:/home/workspace/Makefile/mf9# make show
echo a1
a1
echo
看到这里明白了把~
=
和:=
展开时机不同,=
在用到的时候才求值展开;:=
在定义的时候就展开。