在makefile中有各种赋值:= := ?= +=,接下里将会对4种赋值做以区分。
递归展开变量(=)
延时变量,只有被使用时才展开定义。
用=或defin关键字都可以定义这种变量,如果变量的定义引用了其他的变量,
那么引用会一直展开下去,直至找到被引用的变量的最新的定义,并以此作为该变量的值。但是有时候会陷入无穷递归。
a=I love
b=$a
a=linux
test:
echo $a $b
# a是linux,b是linux
立即变量(:=)
定义时的赋值立即生效。
用:=这种方式定义的变量,会在变量的定义点,按照被引用的变量的当前值进行展开。
a=I love
b:=$(a) #用$使之成为变量,而不是字符串
a=linux
test:
echo $a $b
#a是linux ,而b是I love
条件变量?=
当变量为空时才赋值。
赋默认值:如果没有初始化该变量,则给它赋值;如果该变量已初始化,则赋默认值无效。
a=4
a?=3
test:
echo $a
#a是4
a=4
a=3
test:
echo $a
# a是3
追加赋值(+=)
为已定义的变量添加新的值。当变量没有被定义过,+=和=是一样的,它定义一个递归展开的变量,但是,当变量已经有定义的时候,
+=只是简单的进行字符的添加工作。
a =I love
a += linux
test:
echo $a
#a是I love linux
如果起初用:=定义变量,那么+=只是利用变量的当前值进行添加;
a :=I love
a += linux
#a=hhh
test:
echo $a
#a是I love linux
如果起初用=定义变量,它并不会在+=的地方马上进程变量展开,
而是会把展开工作推后,直至它找到最后变量的定义,
这和=定义变量的行为类似。
a :=I love #或者a=I love
a += linux
a=happy
test:
echo $a
#a是happy
注:在makefil中注释用#