天天看點

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”。這樣的目标被稱為字尾規則的目标,這種定義方式是已經過時的定義隐含規則的方法(目前,這種方式還被用在很多地方)。原則上,如果将其分為兩個部分、并将它們加到字尾清單中,任何目标都可采用這種方式來表示。實際中,字尾通常以“.”開始,是以,以上的這些特别目标同樣是以“.”開始。

繼續閱讀