一、概述
Makefile中使用的變量類似於C/C++中的宏,代表一個字符串。在Makefile執行過程中,變量會被替換成所代表的字符串。
變量的命名可以包含數字、字符、下劃線,但不可以有“:”“#”“=”或者空字符。傳統的Makefile變量全部大寫,爲避免和系統變量衝突,可能會大小寫搭配。
二、變量的基礎
變量在聲明的時候需要給予初值,而在使用的時候,在變量名前加上“
三、變量的變量
Makefile可以使使用變量值來構造變量。有兩種方式,
a、使用“=”,此時=右側的變量可以是之前沒有定義的值,可以使用後面才定義的變量值;
b、使用“:=”,右側只能是前面已經定義好的變量值。
“?=”表示如果變量沒有被定義過,則值等於右側的值。
四、變量的高級用法
1、變量值的替換
可以替換變量中共有的部分,格式爲“$(var:a=b)”或者“${var:a=b}”,含義爲將變量var中的字母a替換爲字母b。
如
foo:=a.o b.o c.o
ret:=${foo:o=c}
則ret爲a.c b.c c.c
2、變量值再當變量
嵌套定義
如
x=y
y=z
a:=$($(x))
則a爲z
五、追加變量值
使用“+=”操作符表示給變量追加值:
如果變量之前沒有被賦值,則“+=”會自動變爲“=”;如果變量之前有賦值,則會自動繼承之前的賦值,繼續增加新的值;如果變量之前是以“:=”賦值,則“+=”自動以“:=”賦值。
如
obj =a.o b.o
obj +=c.o
$(obj)
最後的$(obj)的值爲a.o b.o c.o
六、override提示符
如果有變量是通常make的命令行參數設置的,那麼Makefile中對該值的賦值會被忽略;而如果想在Makefile中設置該參數值,可以通過override進行設置。格式
override <variable>=<value>或者
override <varibale>:=<value>
七、多行變量
使用define關鍵字,其後跟上變量名,另起一行爲變量值,以endef結束。define前加Tab。如
define two-lines
echo a
echo b
endef
八、環境變量
系統的環境變量可以在make運行時載入到Makefile中,但如果Makefile中已經定義了這個環境變量或者make的命令行參數中已經指定了該環境變量參數,那麼在該make運行時,系統變量值會被覆蓋。
如果make運行時,指定了參數“e”,則Makefile中的環境變量值會被系統的環境變量值覆蓋。
因此,如果系統設置了“CFLAGS”環境變量,則可以在所有的Makefile中使用該變量值。
當make嵌套調用時,上層Makefile中定義的變量會以系統環境變量的方式傳遞到下層Makefile中。默認情況下,只有通過命令行設置的參數纔會傳遞,也可以通過在文件的變量前設置“export”表示可傳遞。
九、目標變量
之前提及的在Makefile中定義的變量均屬於“全局性變量”,整個文件中均可訪問。
自動化變量屬於“規則型變量”,依賴於規則的目標和依賴目標的定義,也可以設置局部變量。
格式爲
<target>:<varible-assignment>
或者
<target>:override <varible-assignment>
局部變量可以和全局變量名相同,但是在局部變量所屬的規則及連帶規則中,變量值爲局部變量值。
如
prog:CFLAGS=-g
prog:prog.o main.o
$(CC) $(CFLAGS) prog.o main.o
此處CFLAGS爲-g,不管全局變量值爲多少。
十、模式變量
也可以將變量定義在符合某種模式的目標上,如%.o:CFLAGS=-o
格式爲
<pattern>:<varible-assignment>
或者
<pattern>:override <varible-assignment>