Makefile的特殊目標

Makefile的特殊目標

在Makefile中,有一些名字,當它們作爲規則的目標時,具有特殊含義。它們是一些特殊的目標,GNU make所支持的特殊的目標有:

.PHONY

目標“.PHONY”的所有的依賴被作爲僞目標。僞目標時這樣一個目標:當使用make命令行指定此目標時,這個目標所在規則定義的命令、無論目標文件是否存在都會被無條件執行。

.SUFFIXES:

特殊目標“SUFFIXES”的所有依賴指出了一系列在後綴規則中需要檢查的後綴名(就是當前make需要處理的後綴)。

.DEFAULT

Makefile中,目標“.DEFAULT”所在規則定義的命令,被用在重建那些沒有具體規則的目標(明確規則和隱含規則)。就是說一個文件作爲某個規 則的依賴,但卻不是另外一個規則的目標時。Make程序無法找到重建此文件的規則,此種情況時就執行“.DEFAULT”所指定的命令。

.PRECIOUS

目標“.PRECIOUS”的所有依賴文件在make過程中會被特殊處理:當命令在執行過程中被中斷時,make不會刪除它們。而且如果目標的依賴文件是 中間過程文件,同樣這些文件不會被刪除。這一點目標“.PRECIOUS”和目標“.SECONDAY”實現的功能相同。

另外,目標“.PRECIOUS”的依賴文件也可以是一個模式,例如“%.o”。這樣可以保留有規則創建的中間過程文件。

.INTERMEDIATE

目標“.INTERMEDIATE”的依賴文件在make時被作爲中間過程文件對待。沒有任何依賴文件的目標“.INTERMEDIATE”沒有意義。

.SECONDARY

目標“.SECONDARY”的依賴文件被作爲中間過程文件對待。但這些文件不會被自動刪除。

沒有任何依賴文件的目標“.SECONDARY”的含義是:將所有的文件作爲中間過程文件(不會自動刪除任何文件)。

.DELETE_ON_ERROR

如果在Makefile中存在特殊目標“.DELETE_ON_ERROR”,make在執行過程中,如果規則的命令執行錯誤,將刪除已經被修改的目標文件。

.IGNORE

如果給目標“.IGNORE”指定依賴文件,則忽略創建這個文件所執行命令的錯誤。給此目標指定命令是沒有意義的。當此目標沒有依賴文件時,將忽略所有命令執行的錯誤。

.LOW_RESOLUTION_TIME

目標“.LOW_RESOLUTION_TIME”的依賴文件被make認爲是低分辨率時間戳文件。給目標“.LOW_RESOLUTION_TIME”指定命令是沒有意義的。

通常文件的時間輟都是高分辨率的,make在處理依賴關係時、對規則目標-依賴文件的高分辨率的時間戳進行比較,判斷目標是否過期。但是在系統中並沒有提 供一個修改文件高分辨率時間輟的機制(方式),因此類似“cp-p”這樣的命令在根據源文件創建目的文件時,所產生的目的文件的高分辨率時間輟的細粒度部分被丟棄(來源於源文件)。這樣可能會造成目的文件的時間戳和 源文件的相等甚至不及源文件新。處理此類命令創建的文件時,需要將命令創建的文件作爲目標“.LOW_RESOLUTION_TIME”的依賴,聲明這個 文件是一個低分辨率時間輟的文件。例如:

.LOW_RESOLUTION_TIME: dst

dst: src

cp -p src dst

首先規則的命令“cp –p src dst”,所創建的文件“dst”在時間戳上稍稍比“src”晚(因爲命令不能更新文件“dst”的細粒度時間)。因此make在判斷文件依賴關係時會出 現誤判,將文件作爲目標“.LOW_RESOLUTION_TIME”的依賴後,只要規則中目標和依賴文件的時間戳中的初始時間相等,就認爲目標已經過 期。這個特殊的目標主要作用是,彌補系統在沒有提供修改文件高分辨率時間戳機制的情況下,某些命令在make中的一些缺陷。

對於靜態庫文件(文檔文件)成員的更新也存在這個問題。make在創建或者更新靜態庫時,會自動將靜態庫的所有成員作爲目標“.LOW_RESOLUTION_TIME”的依賴。

.SILENT

出現在目標“.SILENT”的依賴列表中的文件,make在創建這些文件時,不打印出重建此文件所執行的命令。同樣,給目標“.SILENT”指定命令行是沒有意義的。

沒有任何依賴文件的目標“.SILENT”告訴make在執行過程中不打印任何執行的命令。現行版本make支持目標“.SILENT”的這種功能和用法 是爲了和舊版本的兼容。在當前版本中如果需要禁命令執行過程的打印,可以使用make的命令行參數“-s”或者“--silent”。

.EXPORT_ALL_VARIABLES

此目標應該作爲一個簡單的沒有依賴的目標,它的功能含義是將之後所有的變量傳遞給子make進程。

.NOTPARALLEL

Makefile中,如果出現目標“.NOPARALLEL”,則所有命令按照串行方式執行,即使存在make的命令行參數“-j”。但在遞歸調用的字make進程中,命令可以並行執行。此目標不應該有依賴文件,所有出現的依賴文件將被忽略。

所有定義的隱含規則後綴作爲目標出現時,都被視爲一個特殊目標,兩個後綴串聯起來也是如此,例如“.c.o”。這樣的目標被稱爲後綴規則的目標,這種定義方式是已經過時的定義隱含規則的方法(目前,這種方式還被用在很多地方)。原則上,如果將其分爲兩個部分、並將它們加到後綴列表中,任何目標都可採用這種方式來表示。實際中,後綴通常以“.”開始,因此,以上的這些特別目標同樣是以“.”開始。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章