一、變數名
makefile變數名是不包括":"、"#"、"="、前置空白和尾空白的任何字串。
(1)變數名最好由字母、數字和下劃線組成
儘管在gnu make中沒有對變數的命名有其它的限制,但是字母、數字和下劃線以外的字元
可能會在make的後續版本中被賦予特殊的含義。
(2)變數名大小寫敏感
(3)變數名中可以包含函式或者其它變數的引用
(4)變數的值在長度上沒有限制。值較長時可以分成多行書寫,使用反斜槓(\)連線
二、變數的引用
(1)引用方式
"$(varname)"或者"$"
備註:對於變數名為單字元的變數,在引用時可省略括號;對於變數名為多字元的變數不能省略括號,
不然make會把變數名的首字母作為變數而不是整個字串。
(2)引用展開
是嚴格的文字替換過程,即變數值的字串被精確地展開在變數被引用的地方。
(3)當引用未定義變數時,make預設其值為空。
三、變數的定義
主要有直接展開和引用展開兩種方式:
1、引用展開方式
(1)使用"="或者指示符define定義變數
define定義變數的語法格式:
以指示符"define" 開始,"endif"結束,變數名和指示符"define"在同一行,使用空格分開;
(2)在引用變數的地方對該變數引用的變數和函式進行展開,而不是在變數定義時展開。
(3)可以引用在其後定義的其它變數,但是其的變數的定義必須在引用該變數之前。
2、直接展開方式
(1)使用":="定義變數
(2)在變數定義時就展開該變數引用的變數和函式
(3)不可以引用在其後定義的變數
四、高階用法
1、條件賦值
使用?=賦值,該操作符在變數之前沒有被賦值的情況下才會對變數進行賦值
2、追加賦值
使用+=給變數追加賦值
(1)如果被追加值的變數之前沒有定義,那麼"+="會自動變成"=",此變數就被定義為乙個引用展開的變數。
如果之前存在這個變數定義,那麼"+="就繼承之前定義時的變數風格
(2)直接展開式變數的追加過程:變數使用":="定義,之後"+="操作將會先替換展開之前此變數的值,而後在末尾新增需要追 加的值,並使用":="重新給此變數賦值。
(3)引用展開式變數的追加過程:變數使用"="定義,之後"+="操作時不對之前此變數中任何的引用進行替換展開,而是按照文 本的擴充套件方式替換(等號右邊的文字未發生變化),而後在末尾新增需要追加的值,並使用":="重新給此變數賦值。
3、替換引用
格式:"$(varname:a=b)"或者"$"
將變數中所有以a字元結尾的字替換為以b結尾的字
4、override
通常在執行make時,如果通過命令列定義了乙個變數,那麼它將替代在makefile中出現的同名變數的定義。就是說,對於乙個在makefile中使用常規方式(使用「=」、「:=」或者「define」)定義的變數,我們可以在執行make時通過命令列方式重新指定這個變數的值,命令列指定的值將替代出現在makefile中此變數的值。如果不希望命令列指定的變數值替代在makefile中的變數定義,那麼我們需要在makefile中使用指示符「override」來對這個變數進行宣告,像下邊那樣:
override variable = value
或者: override variable := value
也可以對變數使用追加方式:
override variable += more text
對於追加方式需要說明的是:變數在定義時使用了「override」,則後續對它值進行追加時,也需要使用帶有「override」指示符的追加方式。否則對此變數值的追加不會生效。
MakeFile預定義變數
makefile中常見預定義變數 命 令 格 式 含 義 ar庫檔案維護程式的名稱,預設值為ar as匯程式設計序的名稱,預設值為as ccc編譯器的名稱,預設值為cc cppc預編譯器的名稱,預設值為 cc e cxxc 編譯器的名稱,預設值為g fcfortran編譯器的名稱,預設值為f77 r...
Makefile預定義變數
含義 不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該變數表示目標的...
Makefile定義變數 和 的區別
makefile中變數的定義有兩種方式。第一種 例如name chen info name 第二種 例如name chen info name 這兩種定義變數的區別主要是對引用的其它變數的展開時機不同。第一種方式 使用 name chen info name 在這種方式中,info的值就是 name...