makefile總規則:欲更新目標,必須首先更新它的所有條件;
命令列表中的每條命令必須以乙個tab開頭,注意不能是空格,makefile的格式不像c語言的縮排那麼隨意,對於makefile中的每個以tab開頭的命令,make會建立乙個shell程序去執行它,
在大型專案中gcc的-m選項自動生成目標檔案和原始檔的依賴關係
main: main.o stack.o maze.o #目標:條件
gcc main.o stack.o maze.o -o main #執行的命令
main.o: main.c main.h stack.h maze.h
gcc -c main.c
stack.o: stack.c stack.h main.h
gcc -c stack.c
maze.o: maze.c maze.h main.h
gcc -c maze.c
紅色部分是makefile 的理念,很重要:
執行makefile的時候會嘗試更新makefile的第一條規則,第一條規則的目標稱為預設目標,只要預設目標更新了就算完成任務,而要更新預設目標,需要先更新預設目標的條件。所以總結的一點就是,makefile類似堆疊,由下而上的執行makefile。
執行makefile重新編譯的時候,仍然嘗試更新預設目標,繼而取更新目標的條件目標,重新編譯的條件是被修改的檔案的修改時間若是最新的,則需要重新編譯相關聯的檔案,這樣受影響的目標條件被更新了,那麼預設目標也也就需要重新編譯。即,以下情況下要更新
執行make命令時,是按照gnumakefile、makefile、makefile的順序找到第乙個存在的檔案並執行它,不過還是建議使用makefile做檔名。除了gnu make,有些unix系統的make命令不
是gnu make,不會查詢gnumakefile這個檔名,如果你寫的makefile包含gnu make的特殊語法,可以起名為gnumakefile,否則不建議用這個檔名。
@: 如果執行命令前加上它,則只顯示命令結果,不顯示命令本身
-: 通常makefile裡的命令執行出錯(該命令的退出狀態非0),就立刻終止makefle的執行。但是在命令前加上』-『,即便命令出錯makefile還會執行。通常rm命令和mkdir命令前面要加-號。
在目標前新增它,表示該目標是虛假目標,即偽目標。不管它的目標檔案存在不存在都要更新,即需要執行,想clean一樣
在makefile中使用$()獲取makefile中定義的變數的值,如果變數沒有定義其值為空,這樣可以很好的控制編譯時的引數。
$@獲取規則中的目標,規則例項:main.o:main.cq其中main.o是目標main.c是條件且是第乙個條件
$《獲取規則中的第乙個條件
$?,表示規則中所有比目標新的條件,組成乙個列表,以空格分隔。
$^,表示規則中的所有條件,組成乙個列表,以空格分隔。
%是替換字元,表示1個或者多個字元,例項:%.o:%.c這個例項稱之為模式規則也是makefile的隱含規則
:=表示立即展開,即立即進行賦值;=表示延遲展開,即若當前沒有定義該變數,會需找定義再展開;?=表示如foo ?= (b
ar)的
意思是:
如果fo
o沒有定
義過,那
麼?=相
當於=,
定義fo
o的值是
(bar),但不立即展開;如果先前已經定義了foo,則什麼也不做,不會給foo重新賦值;+=表示追加賦值,但同時保留變數賦值符號的特性,即採用:=進行賦值的話,那麼+=保持:=的特性。
乙個變數的定義從=後面的第乙個非空白字元開始(從(x
)的開始),包括後面的所有字元,直到注釋或換行之前結束。如果要定義乙個變數的值是乙個空格,可以這樣:
nullstring := (回車)
Make File符號說明
用途define 定義乙個 資料報 是用enddef做結尾,可以包含多行的命令。ifeq ifneq 條件判斷,可以搭配else使用,endif結尾。原型 ifeq arg1,arg2 ifdef ifndef 變數是否定義的條件判斷,可以搭配else使用,endif結尾。原型 ifdef var。...
Make File符號說明
用途 define 定義乙個 資料報 是用enddef做結尾,可以包含多行的命令。ifeq ifneq 條件判斷,可以搭配else使用,endif結尾。原型 ifeq arg1,arg2 ifdef ifndef 變數是否定義的條件判斷,可以搭配else使用,endif結尾。原型 ifdef var...
Make File符號說明
用途 define 定義乙個 資料報 是用enddef做結尾,可以包含多行的命令。ifeq ifneq 條件判斷,可以搭配else使用,endif結尾。原型 ifeq arg1,arg2 ifdef ifndef 變數是否定義的條件判斷,可以搭配else使用,endif結尾。原型 ifdef var...