Makefile中變量的定義有兩種方式。
第一種: =
例如name=chen
info=$(name)
第二種: :=
例如name=chen
info:=$(name)
這兩種定義變量的區別主要是對引用的其它變量的展開時機不同。
第一種方式:使用=
name=chen
info=$(name)
在這種方式中,info的值就是“$(name)”這個字符串,它的展開一直延續到命令中對info的引用,也就是在命令中出現$(info)的時候,纔會用$(name)替換$(info)【因爲$(info)的值是 $(name)】,然後$(name)又是對一個變量的引用,所以用chen這個文本替換$(name),最終也就是得到$(info)的值是文本chen。
只有在命令中引用一個變量var時,纔會對var引用的其它變量進行展開,如果上面兩行後面,再加上一行
infoadd=$(info) henan
那麼,infoadd的值就是文本“$(info) henan”,直到$(infoadd)出現在命令中,纔會對infoadd引用的其它變量進行層層展開。
第二種方式:使用:=
name=chen
info:=$(name)
這種方式,info在定義時,就對它所引用的變量進行展開,info的值就是文本“chen”,在命令中出現$(info),或者以同樣的方式引用$(info)定義另一個變量時,都會用“chen”這個文本去替換$(info).
例如,再加一行
infoadd:=$(info) henan
那麼,infoadd的值就是“chen henan”這個文本。
下面是兩個印證的例子:
例1:
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
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
root@ubuntu:/home/workspace/Makefile/mf9# vim Makefile
因爲使用 := 定義變量時會立即展開,所以定義y2時,去展開$(x2),但是此時x2還沒有定義,所以y2的值爲空。
而使用 = 定義變量,到了運行的時候,纔會去展開,所以y1可以引用後面定義的x1.