makefile變數的定義

2021-08-08 15:27:07 字數 1878 閱讀 1019

一、變數名

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...