第十二章 : GNU make的特點

 

第十二章 : GNU make的特點


截至本章爲止,所有關於GNU make使用的討論全部結束。相信大家也能夠獨立、熟練的書寫Makefile,並能夠使用GNU 的make來管理自己的工程。

本章是GNU make特點的總結。主要是和其它版本make得比較。這些特徵都是以4.2 BSD 中的make的爲基準。當需要書寫可移植到不同的類UNIX系統上的Makefile時,應避免使用GNU 版本make自身的一些特徵。

12.1      源自System v的特點

下面所羅列的這些是來自System V版本make的一些特點:

Ø        變量“VPATH”及它的含義(參考 4.5 目錄搜索 一節)。System V版本的make支持,但沒有得到驗證。4.3 BSD 的make支持(據說是對System V的make這一功能的仿照)。

Ø        可包含其它makefile文件(參考 3.3 包含其它makefile文件 一節)。使用指示符“include”可同時包含多個文件是GNU的擴展。

Ø        可使用系統環境變量。參考 6.9 系統環境變量一節

Ø        變量“MAKEFLAGS”。用於make遞歸調用時傳遞命令行選項。參考5.6 make的遞歸調用 一節

Ø        make靜態庫(文檔文件)是“$%”可代表靜態庫成員名。參考 10.5.3 自動化變量 一節

Ø        對自動變量“$@”、“$*”、“$<”、“$%”和“$?”進行了擴展,支持“$(@F)”和“$(@D)”等形式的自動環變量。並以此對自動變量“$^”進行了擴展。參考 10.5.3 自動化變量 一節

Ø        變量引用。參考 6.1變量的引用 一節

Ø        支持使用命令行選項“-b”和“-m”來兼容其它版本的make。System V 的make中,這些選項有實際含義。

Ø        使用變量“MAKE”執行的遞歸調用。可支持“-n”、“-q”和“-t”向子make進程的傳遞。參考  5.6 make的遞歸調用 一節

Ø        支持後綴“.a”(參考 11.4 靜態庫的後綴規則 一節)。不過這個特點在GNU make的新版本中已經被模式規則所取代。

Ø        保持Makefile規則命令行的書寫格式,只是去掉了初始空字符。執行命令的回顯保持Makefile中的書寫格式不變。

12.2      源自其他版本的特點

下面的特點來自於其它版本的make,但每一個特徵來自由哪個版本的make不太清楚:

Ø        模式規則使用模式字符“%”。目前在多個不同版本的make中都有使用“%”。但具體是那個版本的make提出它不甚清楚。關於模式規則參考  10.5 模式規則 一節

Ø        規則鏈以及隱含的中間過程文件。這個特點首次是在Stu Feldman 的make版本中實現,並用於AT&T第八版的Unix研究中。後來AT&T貝爾實驗室的Andrew Hume 在它的mk程序中應用(這裏稱爲“傳遞閉合”)。但不清楚這個特徵是對它們的繼承還是GNU自己的重新實現。參考 10.4 隱含規則鏈 一節

Ø        包含規則所有依賴文件列表的自動化變量“$^”。可以確定這不是GNU創造的,但具體是哪個版本的make創造也不清楚。參考 10.5.3 自動化變量 一節

Ø        命令行的“what if”選項(GNU make的“-W”選項)據說是Andrew Hume 在mk中首次提出的的。參考 9.7 make的命令行選項 一節

Ø        併發執行的觀點,在其它多種版本的make中都有支持。但System V 和BSD 沒有實現此功能。參考 5.3 併發執行命令 一節

Ø        變量的模式替換引用來自SunOS 4。參考 6.3 變量的高級用法 一節。GNU make中,這個功能是在SunOS 4實現之前由函數“patsubst”提供。同一功能的兩種實現,在兩個版本的make中,難以確定是哪一個最早提出這個概念。

Ø        命令行之前使用“+”字符,它有特殊的含義(參考 9.3 替代命令的執行 一節)。這種做法是由IEEE Standard 1003.2-1992 (POSIX.2)定義的。

Ø        變量值追加“+=”的語法來自於SunOS 4 版本的make。參考 6.6 追加變量值 一節

Ø        靜態庫成員列表作爲目標的語法“ARCHIVE(MEM1 MEM2...)”源自SunOS 4 make。參考 11.1 庫成員作爲目標 一節

Ø        使用“-include”包括多個其它的makefile文件,當所包含的文件不存在時不出錯。這個特徵源自SunOS 4 版本的make。(但SunOS 4版本的make不能使用單指示符同時包含多個文件) 。GNU make的這個特徵和SGI make 的指示符“sinclude”相同。GNU make也支持“sinclude”。

12.3      GNU make自身的特點

以下特點是由GNU make本身的:

Ø        命令行選項“-v”或“--version”打印make的版本和版權信息。

Ø        使用“-h”或“--help”列出make支持的所有命令行選項。

Ø        直接展開式變量。參考 6.2 兩種變量定義 一節

Ø        變量“MAKE”支持make遞歸調用時命令行選項的傳遞。參考  5.6 make的遞歸調用 一節

Ø        命令選項“-C”或“--directory”改變make執行的工作目錄。參考 9.7 make的命令行選項 一節

Ø        支持多行變量的定義。參考 6.8 定義多行變量 一節

Ø        使用特殊目標“.PHONY”聲明僞目標。AT&T 貝爾實驗室Andrew Hume 使用不同的語法在它的mk程序中也實現了該功能。兩者幾乎在同時支持。參考 4.6 Makefile僞目標 一節

Ø        支持過個文本處理函數。參考 8.2 文本處理函數 一節

Ø        支持使用“-o”或者“--old-file”選項指定一個文件是未修改文件(告訴make不需要考慮這個文件的時間戳)。參考 9.4 防止特定文件重建 一節

Ø        條件執行。衆多其它版本的make也支持;它似乎是對c語言預處理程序和宏語言的自然擴展,不能算是一個全新的概念。參考 第七章 Makefile的條件判斷 一章

Ø        指定包含makefile文件的搜尋路徑。參考 3.3 包含其它makefile文件 一節

Ø        環境變量“MAKEFILES”指定需要默認讀取的makefile文件。參考 3.4 變量 MAKEFILES 一節

Ø        去除文件名中的“./”,因此“./file”和“file”等價。

Ø        支持在規則依賴中使用“-lNAME”來指定連接庫。參考 4.5 目錄搜索 一節

Ø        允許後綴規則中後綴名可以是任何字符串(參考 10.7 後綴規則 一節)。其它版本make中後綴必須以“.”開始,並且後綴中不能包含斜槓“/”。

Ø        內嵌變量“MAKELEVEL”,這個變量被用來跟蹤make遞歸調用過程調用深度。 參考 5.6 make的遞歸執行 一節

Ø        內嵌變量“MAKECMDGOALS”,這個變量代表了make執行的終極目標。8.2 指定終極目標 一節

Ø        指定靜態模式規則。參考 4.12 靜態模式 一節

Ø        支持選擇性搜索關鍵字“vpath”。參考 4.5 目錄搜索 一節

Ø        支持計算的變量引用。參考 6.3 變量的高級用法 一節

Ø        支持自動重建makefile文件(參考 3.7 makefile文件的重建 一節)。

Ø        多個新的內嵌隱含規則。

Ø        內嵌變量“MAKE_VERSION”代表當前的make版本。

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章