2010年2月7日 星期日

make工具

這篇我也覺得很重要

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:              這個目標所指定的後置字串在規則中是有效的。若不在此指定後置字串,則其他後置字串規則視為自動「關閉」。


預設巨集、後置字串和規則範例

<<<>>>
 

沒有留言:

張貼留言

推到 Twitter!
推到 Plurk!
推到 Facebook!