make 會產生一系列的指令供 UNIX shell 來執行。make 所倚靠的是一個檔案之間的關連表(dependency table),這個表由程式設計人員輸入後,可以自動替使 用者進行更新的動作。這個表內記錄了一系列的指令,以及一些檔案的更新順序。程式碼更新時,可用 make 來進行最有效率的更新。
指令行語法
make [options] [targets] [macro definitions]
options(選項)、targets(目標檔)和macro definitions(巨集定義檔)的順序可以任意排列。巨集定義的形式如下:
name=string
Options
-e 處理巨集定義時,優先使用環境變數。
-f file 用 file 當作描述檔;以「-」來代替檔名時,表示標準輸入。-f 可以重複使用,用來合併多個描述檔。預設檔案為 makefile 或 Makefile。
-i 忽略指令所產生的錯誤訊息(和 .IGNORE 一樣)。
-k 若目前的項目失敗,則繼續以下無關的項目。
-n 印出指令但不執行(測試用)。-n 會將所有行印出,包括以 @ 開頭的行。
-p 印出巨集定義、後置字串和目標描述。
-q 查詢;若檔案已是最新版,則傳回 0,否則傳回非 0 的值。
-r 不使用預設規則。
-s 不顯示指令行(和 .SILENT 一樣)。
-t 將目標檔案日期更新。
描述行(Description File Lines)
描述檔中的每一個指令都當作是一行。若一個指令超過一行的長度,則在行的最後加上「\」就可將下一行內容視為和本行是同一行。描述檔中 可有下列任何一種行:
空白行 空白行會直接跳過不管
註解行 「#」以後的任何內容都視為註解。make 會略過「#」之後的任何文字
相依行 依賴一個或多個不同的目標檔。會繼續執行接下去的某些特定的指令。其格式如下:
targets : prerequisites
targets :: prerequisites
第一種形式中,若所需的先決條件(prerequisites)成立則執行下面的指令。第二種形式可以一次在 很多行中指定同樣的目標檔案。兩種形式中,若不加上 prerequisites,則後面的指令一定會執行(只要指定目標即可)。 目標之前不可加上任何 tab 符號(相依行尾端可以加上「;」,再接上要執行的指令;不過,通常指令都是分開放在個別行中,前面加上 tab)。
後置字串規則
以第一個後置字串結尾的檔案要依賴以第二個後置字串結尾的檔案(假設原檔名相同)。下列形 式都可使用:
.suffix.suffix:
.suffix:
第二種形式表示,原檔案必須依賴加 上後置字串的檔案。
指令
指令都放在相依行之下,每行指令之前都加上一個 tab。若指令之前多加上「-」,則 make會忽略其產生的錯誤訊息。若指令前多加上「@」,則不顯示這個指令行。(除非以 -n 選項執行)。
巨集定義行
這些行形式如下:
name = string
等號旁的空格可加可不加。
include 敘述
和 C 的 include 類似,形式如下:
include file
巨集
本節討論的包含內建巨集、格式指定、字串取代和 特殊巨集。
--------------------------------------------------------------------
內建巨集
$? 列出所有比目前目標還要新的 prerequisites。只能在一般描述檔項目中使用,不可在後置字串 規則中使用。
$@ 目前目標名稱,若要製作函式庫時不 可使用。一般項目與後置字串規則中均可使用。
$$@ 目前目標名稱,僅可在相依行的冒號 右邊使用。
$< 比目前目標還要更新的 prerequisite 名稱。只可在 .DEFAULT: 和後置字串規則中使用。
$* 比目前目標還要新的 prerequisite 名稱,不含其後置字串。只可在後置字串規則中使 用。
$% 目前目標為函式庫時,其所對應的 .o 檔案。可在一般行和後置字串規則中使用。
-------------------------------------------------
格式指定
某些 make 的版本不支援格式指定字元
D 除了 $? 以外,取出內建巨集中的目錄名稱部分,用法如 下:
<<<<<
>>>>>
F 除了 $? 以外,取出內建巨集的檔案名稱部分,用法如下:
<<<<<<
>>>>>
-------------------------------------------------
字串取代
有些 make 的版本不支援字串取代
${macros:s1=s2}
先將每個空白或 tab 之前的 s1 取代成 s2,巨集定義結尾處的 s1 也取代成 s2 後,再重新定義這個巨集。
-------------------------------------------------
特殊巨集
SHELL
設定執行指令所使用的 shell。若這個巨集在描述檔中未定義,則看系統而定。有 些 UNIX會使用使用者目前所使用的 shell,有些(如 SVR4)則設定預設 shell 為 /bin/sh。
VPATH
(某些 make 版本不支援)指定一些搜尋目錄,若在目前目錄找不到 requisites 時,則在 VPATH 中尋找。
-------------------------------------------------
特殊目標名稱
.DEFAULT: 若 make 找不到建立指定目標的描述檔或是後置字串規則 時,就會來執行這個目標之後的指令。
.IGNORE: 忽略錯誤代碼,和 -i 選項一樣。
.PRECIOUS: 這個目標所指定的檔案就算用 make 突然中斷或發生錯誤也不會刪除。
.SILENT: 執行指令但不顯示其指令行。和 -s 選項一樣。
.SUFFIXES: 這個目標所指定的後置字串在規則中是有效的。若不在此指定後置字串,則其他後置字串規則視為自動「關閉」。
預設巨集、後置字串和規則範例
<<<
沒有留言:
張貼留言