筆記。
用處
保護、更新和重新生成程序組。
語法
make [ -DVariable ] [ -d Option] ] [ -e ] [ -i ] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile … ] [ Target … ]
描寫
make 命令輔助您保護程序集。輸入 make 命令的是1個文件相干性規范列表。
在 makefile 中有4種類型的行:文件相干性規范、shell 命令、變量賦值和注釋。通常,各行可通過以1個 \ (反斜杠) 結束來繼續到下1行。以下行的末尾換行符和開頭空白處都緊縮成1個空格。
文件相干性規范
如果目標的修改時間小于它的任何先決條件,那末將目標視為過期。在使用此運算符時,目標的先決條件是通過相干性行積累的。除非目標有 .PRECIOUS 屬性,否則如果 make 命令中斷,那末該目標將被刪除。
:: 如果沒有指定先決條件,那末始終重新創建目標。否則,如果目標的任何先決條件都比目標修改得更晚,那末將該目標認為過期。在使用此運算符時,目標的先決條件不通過相干性行積累。如果 make 命令中斷,則不會刪除目標。
文件相干性規范有兩種類型的規則:推論和目標。推論規則指定目標如何才是最新的。這些規則有1個帶有 .(句點)的最小值且沒有 /(斜杠)的目標。目標規則指定如何構建目標。這些規則能夠有多于1個的目標。
make 命令逐行履行 makdfile 中的命令。猶如 make 履行每條命令,它把命令寫到標準輸出中(除非另外指定的,例如使用 -s 標志)。makefile 在每行之前必須有1個制表符。
當1條命令通過 make 命令履行時,它使用 make 的履行環境。它包括從命令行到 make 命令的任何宏和在 MAKEFLAGS 變量中指定的任何環境變量。make 命令的環境變量覆蓋現有環境中的任何同名變量。
注:
當 make 命令遇到以單詞 include 開頭,后面隨著另外一個是 makefile 的名稱的單詞的行(例如 include depend)時,make 命令會試圖打開那個文件,并且處理它的內容,就像那些內容原來就顯示在 include 行處1樣。這類行動只有在由 make 命令讀取的第1個 makefile 的第1個非注釋行不是 .POSIX 目標時產生;否則,將出現1個語法毛病。
注釋:注釋以字符 # 開始,可以放在除 shell 命令行中的任何位置,并且到行尾結束。
環境:如果 MAKEFLAGS 環境變量存在的話,make 命令將使用它。
目標規則具有以下格式:
target[target…] : [prerequisite…] [;command]
command
多個目標和先決條件用空格分隔。任何后面隨著 ;(分號)的文本和所有以制表符開始的隨后各行都被認為是用來更新目標的命令。1個新行不以制表符或 # 字符開始時,開始1個新的目標。
注:
先決條件的列表可為空。
特殊目標
特殊目標不能包括到其它目標中;即它們是指定的唯1目標。這些目標控制 make 命令的操作。這些目標是:
.DEFAULT 這用作1些目標(只用作先決條件)的規則,這些目標是沒法由 make 命令用其他任何方法創建的。僅使用 shell 腳本。繼承 .DEFAULT 的命令的目標的 <(左尖括號)變量被設置成目標本身的名稱。
.IGNORE 此目標的先決條件是目標本身;這會致使疏忽與它們本身關聯的命令所產生的毛病。如果沒有指定先決條件,則同等于指定 -i 標志。
.POSIX 致使 make 命令使用不同的缺省規則文件。文件 /usr/ccs/lib/posix.mk 提供 POSIX 標準中指定的缺省規則。
.PRECIOUS 此目標的先決條件是目標本身。.PRECIOUS 避免目標被刪除。如果沒有指定先決條件,那末 .PRECIOUS 屬性將利用于文件中的每個目標。通常,當 make 被中斷時(例如,使用 SIGHUP、SIGTERM、SIGINT 或 SIGQUIT),它將刪除所有未完全構成的目標。如果 make 以帶有 -n、-p 或 -q 標志來調用,則認為目標具有 .PRECIOUS 屬性。
.SILENT 目標的先決條件是目標本身。這會致使履行與目標關聯的命令之前不會將其寫到標準輸出中。如果沒有指定先決條件,那末 .PRECIOUS 屬性將利用于文件中的每條命令。
.SUFFIXES 使用此名稱把更多的后綴添加到 make 辨認的文件后綴列表中。目標的先決條件被附加到已知后綴列表。如果沒有指定后綴,那末任何之前指定的后綴會被刪除。這些后綴由推論規則使用。要更改后綴的順序,需要指定1個空的 .SUFFIXES 條目,然后指定1個新的 .SUFFIXES 條目列表。makefile 1定不能將命令與 .SUFFIXES 關聯。
推論規則
make 命令有1個缺省的推論規則集,能夠用 makefile 中的附加推論規則定義來補充或改寫它。缺省規則存儲在外部文件 /usr/ccs/lib/aix.mk 中。可以通過在命令行中將 MAKERULES 變量設置為自己的文件名來替換自己的規則文件。下1行顯示如何從命令行中更改規則文件:
make MAKERULES=/pathname/filename
推論規則由目標后綴和命令構成。通過后綴,make 命令肯定先決條件,通過后綴和它們的先決條件,make 命令肯定如何使目標最新。推論規則具有以下格式:
rule:
command
…
其中 rule 具有以下情勢之1:
.s1 單后綴推論規則描寫如何構建附加單后綴的目標。
.s1.s2 雙后綴推論規則描寫如何構建附加帶有先決條件的 .s2 的目標,這個先決條件附加帶有 .s1。
.s1 和 .s2 后綴定義為特殊目標 .SUFFIXES 的先決條件。推論規則顯示在 makefile 中時,后綴 .s1 和 .s2 必須是已知的后綴。推論規則按其在 .SUFFIXES 中指定的順序使用后綴。當新行不以 或 # 字符開始時,開始新的推論規則。
如果 rule 為空,例如:
rule: ;
履行不起作用且 make 命令辨認出后綴已存在,但當目標過期時無任何操作。
在前面規則中的 ~ (代字號) 指的是 SCCS 文件。因此,規則 .c~.o 將 SCCS C 語言先決條件文件轉換成對象文件(.o)。由于 SCCS 文件的 s. 是1個前綴,所以它和 make 命令的后綴視圖不兼容。~ (代字號) 是1個把任何文件援用都更改成 SCCS 文件援用的方法。
目標或先決條件也能夠成為歸檔庫的成員,即便名稱中有圓括號也能夠這樣處理。例如,library(name) 表示 name 是歸檔庫 library 的1位成員。要通過特殊的文件更新庫的成員,可使用格式 .s1.a,其中帶有 .s1 后綴的文件用來更新歸檔庫的成員。.a 指的是歸檔庫。
在 makefile 中,宏定義按以下格式定義:
variable=value
宏能夠通過 makefile 顯示,以下:
如果宏顯示在目標行中,那末在讀取目標行時給宏賦值。
如果宏顯示在命令行中,那末在履行命令行時給宏賦值。
如果宏顯示在宏定義行中,那末在新的宏顯示于規則或命令中時給宏賦值。
如果宏沒有定義,那末它缺省為 NULL。新的宏定義會覆蓋現有的的同名宏定義。宏可以按下面列出的順序來賦值:
缺省的推論規則
環境的內容
Makefile
命令行。
注:
-e 標志會使環境變量覆蓋 makefile 中定義的變量。
SHELL 宏比較特殊。它是由 make 命令設置到 shell 命令解釋器(/usr/bin/sh)的路徑名上。但是,如果在 makefile 中或命令行上重新定義 SHELL 宏,那末將覆蓋它的缺省設置。
注:
SHELL 宏既不影響 SHELL 環境變量,也不會被它影響。
shell 命令
每一個目標都可以具有與其關聯的1系列 shell 命令,這些命令通經常使用來創建目標。此腳本中的每條命令都必須以制表符開始。雖然任何目標都能夠顯示在相干性行上,但除非使用 :: 操作符,否則這些相干性中只有1個能夠通過創建腳本來跟隨。
如果命令行的第1個或前兩個字符是 @ (at 符號)、-(連字符)和 +(加號)這幾個符號之1或全部,那末將特別處理該命令,以下:
@ 使命令在被履行前不被回顯。
- 使任何命令行的任何非零退出狀態都被疏忽。
+ 使命令行可以通過指定 -n、-q 或 -t 選項來履行。
沒有元字符的命令通過 make 命令直接履行。例如,make 命令將下例中的第1條命令拜托給 shell,由于它包括 >(大于號)shell 元字符。由于下例中的第2條命令不包括任何 shell 元字符,所以 make 命令直接履行它:
target: dependency
cat dependency > target
chmod a+x target
疏忽 shell 程序可以節儉時間,但是會致使某些問題。例如,如果命令行不包括最少1個 shell 元字符,那末要試圖在 makefile 中通過設置 SHELL 宏到 /bin/csh 來履行 C shell 腳本的做法將不會成功。
SHELL=/bin/csh
target: dependency
my_csh_script
該 makefile 失敗,這是由于 make 命令試圖運行 my_csh_script,而不是把它拜托到 C shell 中。
變量賦值
make 命令中的變量和 shell 中的變量非常類似,全部由大寫字母組成。= 運算符將值分配給變量。任何之前的變量都會被覆蓋。
賦值前的任何空格都會被刪除;如果值是附加的,那末要在之前的變量內容和附加的值之間加1個空格。
變量通過用 { } (花括號) 或 ( )(圓括號)括起變量名并在前面加1個 $(美元符號)來進行擴大。如果變量名只包括1個字母,那末就不需要用花括號或圓括號把它括起來。不建議使用這類簡短格式。
變量替換出現在兩種不同的時刻,取決于它被使用的場合。相干性行中的變量在此行被讀取時被擴大。shell 命令中的變量在 shell 被履行時被擴大。
變量的4種類型(按優先順序從小到大排列):
環境 變量被定義為 make 命令的環境的1部份。
全局 變量在 makefile 中或在被包括的 makefile 中定義。
命令行 變量被定義為命令行的1部份。
局部 特定為某種目標定義的變量。局部變量以下:
代表使沒有后綴的目標過期(在推論規則下)的先決條件的文件名段。
如果目標是歸檔庫的成員,代表目標規則中的庫成員。
還可以通過附加 D 或 F 來使用局部變量:
D
表明局部變量利用于名稱的目錄部份。這是后面不帶有 /(斜杠)的路徑名。對當前目錄,D 是1個 .(句點)。
F
表明局部變量利用于名稱的文件名部份。
另外,make 命令設置或理解以下變量:
LANG 當 LC_ALL 和相應的環境變量(以 LC_ 開始的)都沒有指定語言環境時,肯定對語言環境種別所用的語言環境。
LC_ALL 肯定用于重設語言環境種別的值的語言環境,這些語言環境種別是由 LANG 或任何其它的 LC_ 環境變量的設置指定的。
LC_CTYPE 肯定對字符情勢的文本數據的按字節順序解釋的語言環境。例如,參數中的單字節對多字節字符串。
LC_MESSAGES 肯定寫消息所用的語言。
MAKEFLAGS 環境變量 MAKEFLAGS 包括在 make 命令行中指定的任何內容。任何在 make 命令行中指定的內容都被附加到 MAKEFLAGS 變量中,然后將變量輸入到 make 履行的所有程序的環境中。注意 MAKEFLAGS 變量中的 -f 和 -p 標志的操作未定義。在這個變量中,命令行標志優先于 -f 和 -p 標志。
VPATH 允許指定搜索先決條件的目錄列表。這個目錄列表就像 SHELL 中的 PATH 變量那樣工作。VPATH 變量可以用冒號隔開指定多個目錄。例如:
VPATH=src:/usr/local/src
這表明 make 命令按以下順序搜索給出的目錄:
當前目錄(乃至在沒有 VPATH 時也會出現)
src(當前目錄中的1個子目錄)
/usr/local/src.
標志
-D 變量 設置變量值為 1。
-d 選項 顯示關于 make 檢查(調試方式)的文件和次數的詳細信息。沒有任何選項或帶有 A 選項的 -d 標志顯示所有可用的調試信息。以下為個別可選的調試選項:
A
顯示所有可能的調試信息。
a
顯示關于歸檔搜索和高速緩存的調試信息。
d
顯示關于目錄搜索的調試信息。
g1
顯示在構造任何對象前的關于輸入圖的調試信息。
g2
顯示構造每一個對象以后或出錯退出之前關于輸入圖的調試信息。
m
顯示關于構造目標的調試信息,包括修改日期。
s
顯示關于后綴搜索的調試信息。
v
顯示關于變量賦值的調試信息。
-e 指定環境變量覆蓋 makefile 中的宏賦值。
-f Makefile 指定讀取1個 makefile 來代替缺省的 makefile。如果 Makefile 是 -(連字符),則讀取標準輸入。可以指定多個 makefile 并按指定的順序讀取。
-i 疏忽 makefile 中的 shell 命令的非零退出。同等于在 makefile 中的每個命令行前指定 - (連字符)。
-k 遇到毛病后繼續處理,但僅限于對不依賴于在創建時產生了毛病的目標的那些目標進行該操作。
-n 顯示命令,但是其實不運行它們。但是,會履行以 +(加號)開始的行。
-p 在履行任何命令前顯示所有宏定義集合和目標描寫。
-q 如果對象文件沒有過期,則返回1個零狀態碼;如果目標過期,則返回1個狀態碼。但是,會履行以 +(加號)為前綴的命令行。
-r 不使用缺省規則。
-S 如果產生毛病,則終止 make 命令。這是缺省值,與 -k 標志相反。
-s 履行命令時不在屏幕上顯示它們。
-t 創建1個目標或更新它的修改時間,使它看起來沒有過期。履行以 +(加號)開始的命令行。
Target 指定 Target 情勢的目標名或設置變量值。
退出狀態
當指定 -q 標志時,這條命令返回以下退出值:
0 成功完成。
1 目標過期。
1 產生毛病。
否則,這條命令返回以下退出值:
0 成功完成。
1 產生毛病。
示例
為了構建在 makefile 中找到的第1個目標,請輸入:
make
顯示但不運行,make 命令用來構成1個文件的命令:
make -n search.o
該履行將在使用1個新的描寫文件時驗證其是不是正確。
要建立1個 makefile,比如 pgm,取決于兩個文件(a.o 和 b.o),這兩個文件取決于它們相應的先決條件文件(a.c 和 b.c)和1個公共文件 incl.h,請輸入:
pgm: a.o b.o
c89 a.o b.o -o pgm
a.o: incl.h a.c
c89 -c a.c
b.o: incl.h b.c
b.o: incl.h b.c
c89 -c b.c
要從 .c 文件優化 .o 文件,請輸入:
.c.o:
c89 -c -o
要查看內置規則的內容,請輸入:
make -p -f /dev/null 2>/dev/null
文件
makefile 包括相干性列表。
Makefile 包括相干性列表。
s.makefile 包括相干性列表。這是1個 SCCS 文件。
s.Makefile 包括相干性列表。這是1個 SCCS 文件。
/usr/ccs/lib/posix.mk 包括用于 make 命令的缺省的 POSIX 規則。
/usr/ccs/lib/aix.mk 包括用于 make 命令的缺省的規則。