makefile 變數定義的優先順序

2021-08-21 20:45:12 字數 1961 閱讀 4381

1.

environment:

當執行 make 的 shell 程序的環境表中定義相關變數(export)。

或者說 make 程序環境變數表,因為 make 程序是 shell 程序 fork 而出,其繼承於 shell 的環境表。

2.command:

當執行 make 的命令列中定義相關變數(作為引數)。

3.makefile:

makefile 中定義相關變數。

如果有同乙個變數同時被以上三種方式定義,並且變數值互不相同,那按誰定義的為準呢?誰優先順序高呢?

var

=in makefile

all:

@echo $(var)

例一:

同時通過以下三種方式定義變數var:

1)環境變數定義:make 命令前的 var=」in environment」

2)命令引數定義:make 命令後的 var=」in command」

3)命令指令碼定義:makefile 檔案中的 var = in makefile

執行結果如下:

結論:2)命令引數定義優先順序最高。

例二:同時通過以下兩種方式定義變數var:

1)環境變數定義:make 命令前的 var=」in environment」

2)命令指令碼定義:makefile 檔案中的 var = in makefile

執行結果如下:

結論:2)命令指令碼定義優先順序高於環境變數定義

例三:修改 makefile:(刪除var變數定義)

all:

@echo

$(var)

執行結果如下:

結論:當引用某變數而此變數未在命令引數中定義且未在 makefile 中定義時,則嘗試從 make 程序的環境表中 search。

總結:首先,make 命令引數定義的優先順序最高,可以覆蓋 make 程序環境表及 makefile 指令碼定義。

其次,makefile 指令碼定義變數中等,在沒有 make 命令引數定義指定變數時,其優先順序高於 make 程序環境表。

最後,make 程序環境表定義最低,僅當指定變數在 make 命令引數及 makefile 中都未定義時,才被使用。

是否可以修改變數定義的優先順序?

當然可以。

例如,可以通過 make 的 -e 引數來將 make 環境表定義優先順序提高到 makefile 定義之上。

但是,-e 引數無法提高優先順序到最高:

可見,即使 make 時新增 -e 引數,其優先順序還是低於 make 命令引數定義優先順序。

參見 man make 手冊:

give variables taken from

the environment precedence over variables from makefiles. 後記

makefile 可以巢狀呼叫,此時,make 可達的變數,又該以怎樣的方式傳入子 makefile 中呢?優先順序如何呢?

^_^

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預定義變數

含義 不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該變數表示目標的...