以下均來自網路收集,自己整理了一下,只整理了以前不熟悉,而目前會用到的一些東西:
一:Makefile中變數定義的方式:
1.遞迴展開方式,遞迴展開方式定義的變數是在引用在該變數時進行替換的,即如果該變數包含了對其他變數的應用,則在引用該變數時一次性將內嵌的變數全部展開,雖然這種類型的變數能夠很好地完成使用者的指令,但是它也有嚴重的缺點,如不能在變數後追加內容(因為語句:CFLAGS
= $(CFLAGS) -O在變數擴充過程中可能導致無窮迴圈)。
2.簡單方式。用:=定義。為了避免上述問題,簡單擴充型變數的值在定義處展開,並且只展開一次,因此它不包含任何對其它變數的引用,從而消除變數的嵌套引用。
3.用?=定義變數,它的含義是如果變數還沒定義 ,即如果使用者不定義,就提供給他預設的。
舉例說明遞迴展開與簡單方式定義的區別:
CFLAGS:=-WallCFLAGS:=$(CFLAGS)all: echo $(CFLAGS) 對於以上Makefile,執行make後echo輸出-Wall CFLAGS=-Wall CFLAGS=$(CFLAGS) all: echo $(CFLAGS) 執行make後echo輸出:Makefile:2:***Recursive variable `CFLAGS
GNU make 的主要預定義變數:
預定義變數 含義
$* 不包含副檔名的目標檔案名稱。
$+ 所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。
$< 第一個依賴檔案的名稱。
$? 所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。
$@ 目標的完整名稱。
$^ 所有的依賴檔案,以空格分開,不包含重複的依賴檔案。
$% 如果目標是歸檔成員,則該變數表示目標的歸檔成員名稱。例如,如果目標名稱
為 mytarget.so(image.o),則 $@ 為 mytarget.so,而 $% 為 image.o。
AR 歸檔維護程式的名稱,預設值為 ar。
ARFLAGS 歸檔維護程式的選項。
AS 組譯工具的名稱,預設值為 as。
ASFLAGS 組譯工具的選項。
CC C 編譯器的名稱,預設值為 cc。
CCFLAGS C 編譯器的選項。
CPP C 先行編譯器的名稱,預設值為 $(CC) -E。
CPPFLAGS C 先行編譯的選項。
CXX C++ 編譯器的名稱,預設值為 g++。
CXXFLAGS C++ 編譯器的選項。
FC FORTRAN 編譯器的名稱,預設值為 f77。
FFLAGS FORTRAN 編譯器的選項。
參考:http://www.aka.org.cn/Lectures/001/Lecture-1/make.html
http://hi.chinaunix.net/?uid-14782631-action-viewspace-itemid-10165
http://www.sudu.cn/info/html/edu/20080407/264139.html
http://blog.csdn.net/lijierson8/article/details/6283040
http://www.worldhello.net/doc/makefile_howto/makefile_howto.mm.htm
經典的shell教程:《Linux Shell Scripting with Bash》—Ken O.Brutch的翻譯
使用Bash編寫Linux Shell指令碼-6.運算式
http://blog.csdn.net/fox_lht/article/details/5894940
陳皓專欄:
http://blog.csdn.net/haoel
http://coolshell.cn/
經典的makefile教程:跟我一起寫makefile
http://blog.csdn.net/haoel/article/details/2886(http://www.chinaunix.net/jh/23/408225.html)
+
http://wenku.baidu.com/view/4a171e6a25c52cc58bd6be6b.html
GCC常用編譯選項:最佳化選項的功能
http://blog.csdn.net/iterzebra/article/details/6203067