執行make時候會自動在當前目錄順序搜尋GNUMakefile、makefile、Makefile、。
Make命令:
Make [參數] [宏] [目標 目標 ……]
通常從第一條規則開始維護。檢查順序:第一個依賴文件——第一個依賴文件的依賴文件…… ——>第二個依賴文件——第二個依賴文件的依賴文件…… …… 樹狀一條路徑逐層展開,直查找到依賴文件都是源文件,而後原路返回,查找下一條路徑。同一規則的依賴文件按照從左至右順序。
參數:
-c dir 指定make工做後的工做目錄
-e 不容許makefile中給環境宏賦值
-f filename 或--file filename 指定一個或順序指定多個makefile文件
-i 忽略makefile中命令執行是產生的錯誤,不停止make
-k 執行命令出錯,放棄當前目標文件,轉向其餘目標
-n 或--just-print按實際執行是順序顯示命令,包括@開頭的,但不實際執行
-p 顯示makefile中全部宏定義和內部規則
-r 忽略內部規則
-s 執行,但不顯示執行的命令
-S 執行makefile命令菜單時出錯即退出makefile
-t 或--touch修改每一個目標文件的建立日期,但不真正從新建立目標文件
-V 顯示make版本號
-x 把全部宏輸出到環境
Make的基本規則:
Target [屬性] 分隔符 [依賴文件] [;命令行 ]
{Tab 命令行}
注:命令行間能夠加入任意多個空行,但空行也要以tab開頭。Cat –v-t-e Makefile會使Makefile文件中tab以^]顯示,行尾以$顯示。
注:命令過長,用\來鏈接多行成一行。註釋以#開頭,若是#要用做字符符號,「#」。
分隔符:
::目標有多個規則。哪條規則中的依賴文件比目標新,執行哪條規則。若是多條規則的依賴文件都比目標新,多條規則都執行。因爲後面的規則可能覆蓋前面規則的執行結構,因此規則順序不一樣,執行結構也不一樣。
:^把本規則依賴文件和目標文件已有的依賴文件合起來,生成目標新的依賴文件列表。
:-清除目標已有依賴文件,把本規則依賴文件做爲目標依賴文件列表。
:!對每一個更新過的依賴文件都執行一次命令菜單。 ???
:|內部規則專用。 ???
如:file.o :file.c
file.o :^ filef.c 現依賴文件爲file.c filef.c
file.o :- filef.c 現依賴文件爲 filef.c
命令行屬性:
- 若本命令的執行錯誤,忽略掉,繼續向下執行。(不加該標誌,make會中止)
+ 始終執行本命令,即便make參數使用了-n-q-t。(前提是本規則中依賴文件新與目標文件,命令行須要執行)
@ 本命令行不在標準輸出顯示。
Target屬性:
指定多個目標文件屬性: 屬性 屬性 …… :目標 目標 ……
規則中指定單個目標屬性:目標 屬性:[依賴文件] ……
·IGNORE 相似與命令行屬性-
·SILENT 相似與命令行屬性@
·PRECIOUS 保留中間文件
·LIBRARY 目標是一個庫。若是make發現目標是lib(member)或lib((entry))形式,會自動給名爲lib的目標加上該屬性。
·LIBRARYM 目標是庫的一個成員。若是make發現目標是lib(member)形式,會自動給lib目標加上·LIBRARY,被member目標加上·LIBRARYM。本屬性不可在makefile文件顯式聲明。
·SYMBOL 目標是指定入口的庫成員。Make會自動給lib((entry))的目標和依賴文件加上本屬性。本屬性不可在makefile文件顯式聲明。
命令行屬性、目標屬性、make參數都是用來控制make的,當三者屬性發生矛盾時候,規則遵循的屬性優先順序爲:命令行屬性——目標屬性——make參數,但三者都未指定,則用默認。
僞目標:
Linux提供的內部僞目標:
·ERROR :
Make遇到錯誤,執行該目標規則。
·INCLUDE :file1 ……
包含其餘makefile文件,其餘makefile文件位於·INCLUDE規則的依賴文件位置。實際上,是把包含的文件內容copy到當前位置。好比:包含一個宏定義文件,以便在當前位置展開,本makefile文件能夠用這些宏。形式:
·INCLUDE :filename1 filename2……
或要包含的文件不在當前文件夾
·INCLUDE :路徑1 路徑2 ……
·INCLUDE :filename1 filename2 ……
或者
·INCLUDE :路徑/filename> ……
·IMPORT :宏 ……
使用環境變量中的宏。
·IMPORT :·ENVERTHING 可使用環境中全部宏了。
·EXPORT :宏 ……
將宏及當前值輸入環境變量中。
·SETDIR=路徑
改變當前工做路徑。
注:有時候要定義的僞目標可能與文件名重。好比存在clean這個文件。能夠用:
PHONY:clean
cean:
…………
PHONY的做用是確保下面的clean是僞目標,非文件,從而避免混亂。命令行