Makefile定義變量 = 和 := 的區別

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


例2:

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.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章