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:[plain]view plain
copy
x1=a1
y1=$(x1)
x1=b1
x2=a2
y2:=$(x2)
x2=b2
.phony:show
show:
echo $(y1)
echo $(y2)
[plain]view plain
copy
root@ubuntu:/home/workspace/makefile/mf9# make show
echo b1
b1
echo a2
a2
例2:[plain]view plain
copy
y1=$(x1)
x1=a1
y2:=$(x2)
x2=a2
.phony:show
show:
echo $(y1)
echo $(y2)
[plain]view plain
copy
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.
makefile變數的定義
一 變數名 makefile變數名是不包括 前置空白和尾空白的任何字串。1 變數名最好由字母 數字和下劃線組成 儘管在gnu make中沒有對變數的命名有其它的限制,但是字母 數字和下劃線以外的字元 可能會在make的後續版本中被賦予特殊的含義。2 變數名大小寫敏感 3 變數名中可以包含函式或者其它...
MakeFile預定義變數
makefile中常見預定義變數 命 令 格 式 含 義 ar庫檔案維護程式的名稱,預設值為ar as匯程式設計序的名稱,預設值為as ccc編譯器的名稱,預設值為cc cppc預編譯器的名稱,預設值為 cc e cxxc 編譯器的名稱,預設值為g fcfortran編譯器的名稱,預設值為f77 r...
Makefile預定義變數
含義 不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該變數表示目標的...