makefile中給變數賦值有以下兩種方式:
1.遞迴展開式,使用=直接定義,例子如下:
foo = $(bar)
bar = $(ugh)
ugh = huh?
all:;echo $(foo)
執行「make」將會列印出「huh?」。整個變數的替換過程時這樣的:首先「$(foo)」被替換為「$(bar)」,接下來 「$(bar)」被替換為「$(ugh)」,最後「$(ugh)」被替換為「hug?」。整個替換的過程是在執行「echo $(foo)」是進行的。
這種方式的缺點是
缺點1:使用此風格的變數定義,可能會由於出現變數遞迴定義而導致make陷入到無限的變數展開過程中,最終使make執行失敗.
缺點2:這種風格的變數定義中如果使用了函式,那麼包含在變數值中的函式總會在變數被引用的地方執行(變數被展開時)。
2.直接展開式
這種風格的變數使用「:=」來定義變數。在使用「:=」定義變數時,變數值中對另外變數的引用或者函式的引用在定義時被展開(對變數進行替換)。
x := foo
y := $(x) bar
x := later
就等價於:
y := foo bar
x := later
需要cflags := $(include_dirs) -o
include_dirs := -ifoo -ibar
由於在變數「include_dirs」的定義出現在「cflags」定義之後。因此在「cflags」的定義中,「include_dirs」的值為空。「cflags」的值為「-o」而不是「-ifoo -ibar -o」。注意的是:此風格變數在定義時就完成了對所引用的變數的展開,因此它不能實現對其後定義變數的引用。
變數的替換引用,格式為「$(var:a=b)」(或者「$」),
意思是,替換變數「var」中所有「a」字元結尾的字為「b」結尾的字。
「結尾」的含義是空格之前(變數值多個字之間使用空格分開)。
而對於變數其它部分的「a」字元不進行替換。
$@,$^,$《這些是makefile中的自動變數。針對一條目標和依賴關係的命令來說。
$@ 表示目標檔案
$^ 表示所有的依賴檔案
$< 表示第乙個依賴檔案
比如我們乙個目錄下有以下檔案:main.c hello.c 兩個檔案。我們要寫makefile。
一般的不用自動變數的方法:
hello: main.o hello.o
gcc -o hello main.o hello.o
main.o: main.c
gcc -c main.c
hello.o: hello.c
gcc -c hello.c
.phony : clean
clean:
rm -rf *.o hello
以上內容描述了要生成最終目標所需要的檔案及依賴關係還有生成目標檔案的命令。
比如這樣一條目標、依賴條目:
hello: main.o hello.o
make程式預設:$@ 表示hello $^表示main.o hello.o $< 表示main.o
將上面的makefile更改為使用自動變數的形式,我們就不用在命令裡重寫這些依賴檔案了。更改後如下:
hello: main.o hello.o
gcc -o$@$^
main.o: main.c
gcc -c$^
hello.o: hello.c
gcc -c $^
.phony : clean
clean:
rm -rf *.o hello
顯得更簡潔一些。
下面附上學習makefile的乙個資料內容:
跟我一起寫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預定義變數
含義 不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該變數表示目標的...