make 指令

用途

維護、更新及重新產生程式群組。

語法

make [ -DVariable ] [ -d Option ] [ -e ] [ -i ] [ -j[工作]] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile ... ] [ 目標 ... ]

說明

make 指令可協助您維護一組程式。 make 指令的輸入是檔案相依關係規格清單。

make 檔中有四種類型的行: 檔案相依關係規格、Shell 指令、變數指派及註解。 一般而言,行可以用 \ (反斜線) 結尾,從一行接續到下一行。 下行的尾端換行字元和起始空格會壓縮成單一空格。

檔案相依關係規格

相依關係行包含一或多個目標、一個運算子,以及零或多個必備項目 (來源)。 這會建立一個關係,其中目標取決於必要條件,且通常是從它們建立的。 目標與必要條件之間的確切關係由分隔它們的運算子決定。 運算子如下:

項目 說明
: 如果目標的修改時間小於其任何必要條件的修改時間,則會將目標視為過期。 使用此運算子時,目標的必要條件會累積在相依關係行上。 如果 make 指令被岔斷,除非目標具有 ,否則會移除目標。「寶貴」 屬性。
:: 如果未指定任何必備項目,則一律會重建目標。 否則,如果目標的任何必要條件比目標還新修改,則會將目標視為過時。 使用此運算子時,目標的必要條件不會累積在相依關係行上。 如果 make 指令被岔斷,則不會移除目標。

檔案相依關係規格有兩種類型的規則: 推理和目標。 推理規則指定如何構成最新的目標。 這些規則有一個不含/(斜線) 的目標,且至少有一個。 (句點)。 目標規則指定如何建置目標。 這些規則可以有多個目標。

make 檔執行

make 指令會逐行執行 make 檔中的指令。 當 make 執行每一個指令時,它會將指令寫入標準輸出 (除非另有指示,例如使用 -s 旗標)。 make 檔在每一行的指令前面必須有 Tab 鍵。

透過 make 指令執行指令時,它會使用 make的執行環境。 這包括從指令行到 make 指令的任何巨集,以及在 MAKEFLAGS 變數中指定的任何環境變數。 make 指令的環境變數會改寫現有環境中任何同名的變數。
附註:make 指令遇到以單字 include 開頭且後面接著另一個單字是 make 檔名稱 (例如, include 相依) 時, make 指令會嘗試開啟該檔案並處理其內容,如同在出現併入行的位置顯示內容一樣。 只有在 make 指令所讀取之第一個 make 檔的第一個非註解行不是 .POSIX 目標時,才會發生此行為; 否則會發生語法錯誤。

註解: 註解以 # 字元開頭,在 Shell 指令行以外的任何地方,並繼續至指令行結尾。

環境: make 指令會使用 MAKEFLAGS 環境變數 (如果存在的話)。

目標規則

目標規則具有下列格式:

target[target...] : [prerequisite...] [;command]
<Tab>command
多個目標和必要條件以空格區隔。 任何接在; (分號) 之後的文字,以及所有以 Tab 字元開頭的後續行,都會被視為用來更新目標的指令。 當換行不是以 Tab 或 # 字元開頭時,即會啟動新的目標項目。
附註: 必要條件清單可以是空的。

特殊目標

特殊目標不能與其他目標一起併入; 也就是說,它們必須是唯一指定的目標。 這些目標控制 make 指令的作業。 這些目標如下:

項目 說明
。預設值 這用作 make 指令無法找出任何其他建立方法的任何目標 (僅用作必備項目) 的規則。 只會使用 Shell Script。 繼承 .DEFAULT指令之目標的 < (左角括弧) 變數設為目標自己的名稱。
。忽略 此目標的必要條件是目標本身; 這會導致忽略與它們相關聯的指令所產生的錯誤。 如果未指定任何必要條件,這相當於指定 -i 旗標。
.POSIX 導致 make 指令使用不同的預設規則檔。 檔案 /usr/ccs/lib/posix.mk提供 POSIX 標準中指定的預設規則。
。珍貴 此目標的必要條件是目標本身。 。「寶貴」 可防止移除目標。 如果未指定任何必要條件,則為 。將 PRECIOUS 屬性套用至檔案中的每個目標。 通常,當 make 被岔斷時 (例如,使用 SIGHUPSIGTERMSIGINTSIGQUIT) , 它會移除任何局部建立的目標。 如果使用 -n-p-q 旗標來呼叫 make ,則會將目標視為具有 。「寶貴」 屬性。
.SCCS_GET 必須指定此特殊目標 (不含必要條件)。 如果此特殊目標包含在 make 檔中,則會使用與此特殊目標相關聯的指令來取得現行目錄中找不到的所有 SCCS 檔案。 與這個特殊目標相關聯的指令會取代用來從 SCCS 擷取原始檔的預設指令。 在相依關係清單中命名原始檔時, make 會像處理任何其他目標一樣來處理它們。 當目標沒有相依關係,但存在於目錄中時, make 會假設該檔案是最新的。 不過,如果針對目標 source_file找到名為 SCCS/s.source_file 的 SCCS 檔案, make 會額外檢查以確保目標保持最新。 如果遺漏目標,或 SCCS 檔案較新, make 會自動發出指定給 .SCCS_GET 特殊目標的指令,以擷取最新版本。 不過,如果任何人都可以寫入目標,則 make 不會擷取新版本。
無聲自動 目標本身的必要條件是目標本身。 這會導致與目標相關聯的指令在執行之前不會寫入標準輸出。 如果未指定任何必備項目,則會將 .silent 屬性套用至檔案中的每個指令。
.SUFFIX 使用此名稱,將更多字尾新增至 辨識的檔案字尾清單。 目標的必備項目會附加至已知字尾清單。 如果未指定字尾,則會刪除先前指定的任何字尾。 推理規則會使用這些字尾。 若要變更字尾的順序,您需要指定空白 .SUFFIX 項目,然後指定新的 .SUFFIX 項目清單。 make 檔不得將指令與 .SUFFIX相關聯。

推理規則

make 指令具有一組預設推理規則,您可以補充或改寫 make 檔中的其他推理規則定義。 預設規則儲存在外部檔案 /usr/ccs/lib/aix.mk中。 您可以從指令行將 MAKERULES 變數設為您自己的檔名,以替代您自己的規則檔。 下列行顯示如何從指令行變更規則檔:

make MAKERULES=/pathname/filename

推理規則由目標字尾和指令組成。 從字尾, make 指令會決定必要條件,以及從字尾及其必要條件, make 指令會決定如何使目標保持最新。 推理規則具有下列格式:

rule:
<Tab>command
...

其中rule具有下列其中一種格式:

項目 說明
.s1 單一字尾推理規則,說明如何建置附加單一字尾之一的目標。
.s1.s2 雙字尾推理規則,說明如何建置附加 .s2 的目標,以及附加 .s1的必備項目。

.s1.s2 字尾定義為特殊目標 .SUFFIX的必備項目。 在 make 檔中顯示推理規則時,字尾 .s1.s2 必須是已知字尾。 推理規則會依照它們在 .SUFFIX中指定的順序來使用字尾。 當換行不是以「」開頭時,會啟動新的推理規則<Tab>或 # 字元。

如果:rule是空的,例如:

rule: ;

執行沒有作用,且 make 指令可辨識該字尾存在,但在目標過期時不會採取任何動作。

前述規則中的 ~ (波狀符號) 參照 SCCS 檔案。 因此,規則 .c~.o會將 SCCS C 語言必備項目檔案轉換成物件檔 (.o)。 因為 s. SCCS 檔案的字首,它與 make 指令的字尾視圖不相容。 ~ (波狀符號) 是將任何檔案參照變更為 SCCS 檔案參照的一種方式。

圖書館業

目標或必備項目也可以是保存程式庫的成員,如果名稱中有括弧,則會被視為如此。 例如, library (name) 指出 name 是保存程式庫 library的成員。 若要從特定檔案更新檔案庫的成員,您可以使用 .s1.a格式,其中使用字尾為 .s1 的檔案來更新保存檔案庫的成員。 .a 是指保存程式庫。

使用巨集

在 make 檔中,巨集定義的定義格式如下:

variable=value

巨集可在整個 make 檔中顯示,如下所示:

  • 如果巨集顯示在目標行中,則會在讀取目標行時評估該巨集。
  • 如果在指令行中顯示巨集,則會在執行指令時評估該巨集。
  • 如果巨集顯示在巨集定義行中,則會在規則或指令中顯示新巨集時評估該巨集。

如果巨集沒有定義,則預設為 NULL。 新的巨集定義會改寫同名的現有巨集。 巨集指派可以依列出的順序來自下列:

  1. 預設推理規則
  2. 環境內容
  3. Make 檔
  4. 指令行。
    附註: -e 旗標會使環境變數置換 make 檔中定義的那些環境變數。
SHELL 巨集是特殊的。 它由 make 指令設為 shell 指令直譯器 (/usr/bin/sh) 的路徑名稱。 不過,如果在 make 檔或指令行中重新定義它,則會置換此預設值。
附註: SHELL 巨集不會影響 SHELL 環境變數,也不會受到 SHELL 環境變數影響。

Shell 指令

每一個目標都可以與它相關聯一系列 Shell 指令,通常用來建立目標。 此 Script 中的每一個指令前面都必須有 Tab 鍵。 雖然任何目標都可以顯示在相依關係行上,但除非使用 :: 運算子,否則在其中一個相依關係之後只能接著建立 Script。

如果指令行的第一個或前兩個字元是 @ (at 符號)、-(連字號) 及 + (加號) 的其中一個或全部,則會特別處理指令,如下所示:

項目 說明
@ 導致指令在執行之前不會回應。
- 導致指令行的任何非零結束狀態被忽略。
+ 即使指定選項 -n-q-t ,也會導致執行指令行。

make 指令會直接執行沒有 meta 字元的指令。 例如, make 指令會將下列範例中的第一個指令組成 shell ,因為它包含> (大於符號) shell meta 字元。 下列範例中的第二個指令不包含任何 Shell meta 字元,因此 make 指令會直接執行它:

target: dependency
        cat dependency > target
        chmod a+x target

略過 shell 會節省時間,但可能會造成問題。 例如,透過將 SHELL 巨集設為,嘗試從 make 檔內執行 C Shell Script/bin/csh除非指令行也包含至少一個 Shell meta 字元,否則將無法運作。

SHELL=/bin/csh
   
target: dependency
        my_csh_script

此 make 檔失敗,因為 make 指令嘗試執行my_csh_script而不是將它委託給 C Shell。

變數指派

make 指令中的變數與 shell 中的變數非常相似,且由所有大寫字母組成。 = 運算子會將值指派給變數。 然後會置換任何先前的變數。 移除指派值之前的任何空格。

可以將值附加至巨集值,如下所示:
macro += word ... 
macro += macro1 

當使用 + = 運算子來取代 = 時,會在變數的先前內容與附加值之間插入具有單一空格的新值。

以 { } (大括弧) 或 () 括住變數名稱來使用變數 (括弧) 並在其前面加上 $(錢幣符號)。 如果變數名稱只包含單一字母,則不需要括住大括弧或括弧。 不建議使用這個較短的表單。

視使用變數的位置而定,變數替代會在兩個不同的時間發生。 相依關係行中的變數會在讀取行時展開。 執行 shell 指令時,會展開 shell 指令中的變數。

四個變數類別 (依優先順序遞增順序) 如下:

項目 說明
環境 定義為 make 指令環境一部分的變數。
整體 在 make 檔或併入的 make 檔中定義的變數。
指令行 定義為指令行一部分的變數。
本端 特定目標所定義的變數。 區域變數如下:
$<
代表使目標過期 (推理規則) 之必備項目的完整名稱,或目標的完整名稱 (。DEFAULT 規則)。
$*
代表使目標過時 (在推理規則中) 且不含字尾的必備項目的檔名區段。
$@
代表現行目標的完整目標名稱或檔案庫保存目標的保存檔名稱部分。
$%
如果目標是保存程式庫的成員,則代表目標規則中的程式庫成員。

您也可以使用這些附加 DF的區域變數:

D
指出區域變數套用至名稱的目錄部分。 這是不含尾端/(斜線) 的路徑名稱字首。 對於現行目錄, D 是。 (句點)。
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(現行目錄中的子目錄)
  • /usr/local/src.

旗標

項目 說明
-D變數 變數 的值設為 1。
-d選項 顯示 進行 檢查 (除錯模式) 之檔案及時間的詳細資訊。 沒有任何選項或使用 A 選項的 -d 旗標會顯示所有可用的除錯資訊。 可個別選取的除錯選項如下:
A
顯示所有可能的除錯資訊。
A
顯示保存檔搜尋和快取的相關除錯資訊。
D
顯示目錄搜尋的相關除錯資訊。
g1
在製作任何項目之前顯示輸入圖形的相關除錯資訊。
g2
在完成所有項目之後,或在發生錯誤時結束之前,顯示輸入圖形的相關除錯資訊。
m
顯示建立目標的相關除錯資訊,包括修改日期。
顯示字尾搜尋的相關除錯資訊。
v
顯示變數指派的相關除錯資訊。
-e 指定環境變數置換 make 檔內的巨集指派。
-f MakeFile 指定要讀取的 make 檔,而不是預設 make 檔。 如果 MakeFile 是-(連字號) ,則會讀取標準輸入。 可以指定多個 make 檔,並依指定的順序讀取。
-i 忽略 make 檔中 shell 指令的非零結束程式。 相當於在 make 檔中的每一個指令行之前指定-(連字號)。
-j[工作] 指定 make 應該用來建置獨立目標的平行工作數目。 工作 參數可以採用任何正整數值。 如果未指定 工作 ,則 make 指令不會限制用於建置主要目標的平行工作數目。
-k 在發生錯誤之後繼續處理,但僅在那些與建立導致錯誤的目標無關的目標上。
-n 顯示指令,但不執行它們。 不過,會執行以 + (加號) 開頭的行。
-P 在執行任何指令之前,顯示完整的巨集定義及目標說明集。
-q 如果目標檔是最新的,則傳回零狀態碼; 如果目標檔不是最新的,則傳回一個狀態碼。 指定此選項時,將不會更新目標。 不過,將會執行具有 + (加號) 字首的指令行。
-r 不使用預設規則。
-S 如果發生錯誤,則終止 make 指令。 這是預設值,與 -k 旗標相反。
-s 在執行指令時不會在畫面上顯示指令。
-T 建立目標或更新其修改時間,使其看起來保持最新。 執行以 + (加號) 開頭的指令行。
目標 指定 目標 格式的目標名稱,或設定變數值。

結束狀態

當指定 -q 旗標時,此指令會傳回下列結束值:

項目 說明
0 順利完成。
1 目標不是最新的。
> 1 發生一個錯誤。

否則,此指令會傳回下列結束值:

項目 說明
0 順利完成。
> 1 發生一個錯誤。

範例

  1. 若要在 make 檔中找到第一個目標,請鍵入:
    make
  2. 若要顯示 (但不執行) make 指令用來製作檔案的指令:
    make  -n search.o
    執行此動作將驗證新說明檔在使用之前是否正確。
  3. 若要建立 make 檔,指出 pgm 相依於兩個檔案 a.ob.o,而它們又相依於其對應的必備檔案 (a.cb.c) 及一般檔案 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
              c89 -c b.c
  4. 若要從 .c 檔案建立最佳化 .o 檔案,請鍵入:
    .c.o:
              c89 -c -o $*.c
    or:
    .c.o:
              c89 -c -o $<
  5. 若要檢視內建規則的內容,請鍵入:
    make  -p  -f /dev/null 2>/dev/null
  6. 若要以平行模式使用 make 指令,且最多可使用 10 個平行工作來建置 make 檔中指定的目標,請鍵入:
    make -j10

檔案

項目 說明
make 檔 包含相依關係清單。
Make 檔 包含相依關係清單。
s.makefile 包含相依關係清單。 它是 SCCS 檔案。
s.Makefile 包含相依關係清單。 它是 SCCS 檔案。
/usr/ccs/lib/posix.mk 包含 make 指令的預設 POSIX 規則。
/usr/ccs/lib/aix.mk 包含 make 指令的預設規則。