Makefile的特殊目標

2021-06-23 00:28:00 字數 2847 閱讀 3761

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」。這樣的目標被稱為字尾規則的目標,這種定義方式是已經過時的定義隱含規則的方法(目前,這種方式還被用在很多地方)。原則上,如果將其分為兩個部分、並將它們加到字尾列表中,任何目標都可採用這種方式來表示。實際中,字尾通常以「.」開始,因此,以上的這些特別目標同樣是以「.」開始。

makefile中的特殊目標

一 makefile的特殊目標 在 makefile 中,有一些名字,當它們作為規則的目標時,具有特殊含義。它們是一些特殊的目標,gnu make 所支援的特殊的目標有 phony 目標 phony 的所有的依賴被作為偽目標。偽目標時這樣乙個目標 當使用make命令列指定此目標時,這個目標所在規則定...

Makefile中的偽目標

華清遠見嵌入式學院 講師。所謂偽目標就是這樣乙個目標,它不代表乙個真正的檔名,在執行make時可以指定這個目標來執行其所在規則定義的命令,有時我們將乙個偽目標成為標籤。那麼到底什麼是偽目標呢?可能作為初學者還不會在乎這個問題,下面我們來看下我們將在什麼時候需要它。首先來看下面乙個例子 當前目錄下只有...

Makefile 特殊字元的含義

萬用字元,同shell 注釋 忽略錯誤 續行 phony 偽目標。偽目標 並不是乙個檔案,只是乙個標籤,由於 偽目標 不是檔案,所以make無法生成它的依賴關係和決定它是否要執行。我們只有通過顯示地指明這個 目標 才能讓其生效。當然,偽目標 的取名不能和檔名重名,不然其就失去了 偽目標 的意義了。當...