Makefile 目標後定義變數

2021-08-01 08:15:33 字數 1608 閱讀 6219

設定乙個目標指定變數的語法為: 

target ... : variable-assignment 

或者: 

target ... : override variable-assignment 

乙個多目標指定的變數的作用域是所有這些目標的上下文,它包括了和這個目標相關的

所有執行過程。 

目標指定變數的一些特點: 

1.  「variable-assignment」可以使用任何乙個有效的賦值方式, 「=」 (遞

歸)、「:=」(靜態)、「+=」(追加)或者「?=」(條件)。 

2.  使用目標指定變數值時,目標指定的變數值不會影響同名的那個全域性變數的值。

就是說目標指定乙個變數值時,如果在 makefile 中之前已經存在此變數的定義

(非目標指定的),那麼對於其它目標全域性變數的值沒有變化。變數值的改變只

對指定的這些目標可見。 

3.  目標指定變數和普通變數具有相同的優先順序。就是說,當我們使用 make 命令

行的方式定義變數時,命令列中的定義將替代目標指定的同名變數定義(和普

通的變數一樣會被覆蓋)。另外當使用make的「-e」選項時,同名的環境變數

也將覆蓋目標指定的變數定義。因此為了防止目標指定的變數定義被覆蓋,可

以使用第二種格式,使用指示符「override」對目標指定的變數進行宣告。 

4.  目標指定的變數和同名的全域性變數屬於兩個不同的變數,它們在定義的風格(遞

歸展開式和直接展開式)上可以不同。 

5.  目標指定的變數變數會作用到由這個目標所引發的所有的規則中去。例如: 

prog : cflags = -g 

prog : prog.o foo.o bar.o 

這個例子中,無論 makefile 中的全域性變數「cflags」的定義是什麼。對於目

標「prog」以及其所引發的所有(包含目標為「prog.o」、「foo.o」和「bar.o」的所有

規則)規則,變數「cflags」值都是「-g」。 

使用目標指定變數可以實現對於不同的目標檔案使用不同的編譯引數。看乙個例

子: # sample makefile 

cur_dir = $(shell pwd) 

incs := $(cur_dir)/include 

cflags := -wall –i$(incs) 

exef := foo bar 

.phony : all clean 

all : $(exef) 

foo : foo.c 

foo : cflags+=-o2 

bar : bar.c 

bar : cflags+=-g 

……….. 

……….. 

$(exef) : debug.h 

$(cc) $(cflags) $(addsuffix .c,$@) –o $@ 

clean : 

$(rm) *.o *.d $(exes) 

這個 makefile 檔案實現了在編譯程式「foo」使用優化選項「-o2」但不使用除錯選項

「-g」,而在編譯「bar」時採用了「-g」但沒有「-o2」。這就是目標指定變數的靈活之

處。

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

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