日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

GNU make中文手冊-第九章:執(zhí)行make

 todaytomo 2006-12-30
GNU make中文手冊-第九章:執(zhí)行make 作者: hew  發(fā)布日期: 2006-3-21    查看數(shù): 163   出自: http://www.
第九章:執(zhí)行make

--------------------------------------------------------------------------------

一般描述整個工程編譯規(guī)則的Makefile可以通過不止一種方式來執(zhí)行。最簡單直接的方法就是使用不帶任何參數(shù)的“make”命令來重新編譯所有過時的文件。通常我們的Makefile就書寫為這種方式。

在某些情況下:

1. 可能需要使用make更新一部分過時文件而不是全部

2. 需要使用另外的編譯器或者重新定義編譯選項

3. 只需要察看那些文件被修改,而不需要重新編譯

為了達到這些特殊的目的,需要使用make的命令行參數(shù)來實現(xiàn)。Make的命令行參數(shù)能實現(xiàn)的功能不僅限于這些,通過make的命令行參數(shù)可以實現(xiàn)更多特殊功能。

另外,make的退出狀態(tài)有三種:

0 — 狀態(tài)為0時,表示執(zhí)行成功。

2 — 執(zhí)行過程出現(xiàn)錯誤,同時會提示錯誤信息。

1 — 在執(zhí)行make時使用了“-q”參數(shù),而且在當(dāng)前存在過時的目標(biāo)文件。



本章的內(nèi)容主要講述如何使用make的命令參數(shù)選項來實現(xiàn)一些特殊的目的。在本章最后會對make的命令行參數(shù)選項進行比較詳細的討論。

9.1 指定makefile文件
本文以前的部分對如何指定makefile文件已經(jīng)有過介紹(參考 Makefile文件的命名 一節(jié))。當(dāng)需要將一個普通命名的文件作為makefile文件時,需要使用make的“-f”、“--file”或者“--makefile”選項。例 如:“make –f altmake”,它的意思是告訴make將文件“altmake”作為makefile文件來解析執(zhí)行。

當(dāng)在make的命令行選項中出現(xiàn)多個“-f”參數(shù)時,所有通過“-f”參數(shù)指定的文件都被作為make解析執(zhí)行的makefile文件。

默認(rèn)情況,在沒有使用“-f”(“--file”或者“--makefile”)指定文件時。make會在工作目錄(當(dāng)前目錄)依次搜索命名為 “GNUmakefile”、“makefile”和“Makefile”的文件,最終解析執(zhí)行的是這三個文件中首先搜索到的哪一個。

9.2 指定終極目標(biāo)
關(guān)于“終極目標(biāo)”的基本概念我們在前面已經(jīng)提到過(參考 make如何工作 一節(jié))。所謂終極目標(biāo)就是make最終所要重建的、Makefile中某個規(guī)則的目標(biāo)(也可以稱之為“最終規(guī)則”)。為了完成對終極目標(biāo)的重建,可能會觸 發(fā)它的依賴或者依賴的依賴文件被重建的過程。

默認(rèn)情況下,終極目標(biāo)就是出現(xiàn)在Makefile中,除以點號“.”(參考 Makefile的特殊目標(biāo) 一節(jié))開始的第一個規(guī)則中的第一個目標(biāo)(如果第一個規(guī)則存在多個目標(biāo))。因此我們的Makefile就書寫為:第一個目標(biāo)的編譯規(guī)則就描述了整個工程或者 程序的編譯過程和規(guī)則。如果在Makefile中的第一個規(guī)則有多個目標(biāo),那么默認(rèn)的終極目標(biāo)是多個目標(biāo)中的第一個。我們在Makefile所在的目錄下 執(zhí)行“make”時,將完成對默認(rèn)終極目標(biāo)的重建。

另外,也可以通過命令行將一個Makefile中的目標(biāo)指定為此次make過程的終極目標(biāo),而不是默認(rèn)的終極目標(biāo)。使用Makefile中目標(biāo)名作為參數(shù) 來執(zhí)行“make”(格式為 “make TARGET_NAME”,如:“make clean”),可以把這個目標(biāo)指定為終極目標(biāo)。使用這種方式,我們也可以同時指定多個多個終極目標(biāo)。

任何出現(xiàn)在Makefile規(guī)則中的目標(biāo)都可以被指定為終極目標(biāo)(不包含以“-”開始的和包含“=”的賦值語句,一般它們也不會作為一個目標(biāo)出現(xiàn)),而且 也可以指定一個Makefile中不存在的目標(biāo)作為終極目標(biāo),前提是存在一個對應(yīng)的隱含規(guī)則能夠?qū)崿F(xiàn)對這個目標(biāo)的make。例如:目錄“src”下存在一 個.c的源文件“foo.c”,在Makefile中不存在目標(biāo)“foo”或者次目錄下就沒有makefile文件,為了編譯“foo.c”生成可執(zhí)行的 “foo”。只需要將“foo”作為make的參數(shù)執(zhí)行:“make foo”就可以實現(xiàn)編譯“foo”的目的。

make執(zhí)行時設(shè)置一個特殊變量“MAKECMDGOALS”,此變量記錄了命令行參數(shù)指定的終極目標(biāo)列表,沒有通過參數(shù)指定終極目標(biāo)時此變量為空。注意:此變量僅限于用在特殊的場合(比如判斷),在Makeifle中最好不要對它進行重新定義!

例如:



sources = foo.c bar.c



ifneq ($(MAKECMDGOALS),clean)

include $(sources:.c=.d)

endif



例子中我們使用了變量“MAKECMDGOALS”來判斷命令行參數(shù)是否指定了終極目標(biāo)為“clean”,如果不是才包含所有源文件對應(yīng)的依賴關(guān)系描述文件。上例避免在“make clean”時make試圖重建所有.d文件的過程。

這種方式主要用在以下幾個方面:

1. 對程序的一部分進行編譯,或者僅僅對某幾個程序進行編譯而不是完整編譯這個工程(也可以在命令行參數(shù)中明確給出原本的默認(rèn)的終極目標(biāo),例如:make all,沒有人會說它是錯誤的。但是大家都會認(rèn)為多此一舉)。例如以下一個Makefile的片段,其中各個文件都有自己的描述規(guī)則:



.PHONY: all

all: size nm ld ar as



僅需要重建“size”文件時,執(zhí)行“make size”就可以了。其它的程序就不會被重建。

2. 指定編譯或者創(chuàng)建那些正常編譯過程不能生成的文件(例如重建一個調(diào)試輸出文件、或者編譯一個調(diào)試版本的程序等),這些文件在Makefile中存在重建規(guī)則,但是它們沒有出現(xiàn)在默認(rèn)終極目標(biāo)目標(biāo)的依賴中。

3. 指定執(zhí)行一個由偽目標(biāo)定義的若干條命令或者一個空目標(biāo)文件。如絕大多數(shù)Makefile中都會包含一個“clean”偽目標(biāo),這個偽目標(biāo)定義了刪除 make過程生成的所有文件的命令,需要刪除這些文件時執(zhí)行“make clean”就可以了。本節(jié)以下列出了一些典型的偽目標(biāo)和空目標(biāo)的名字。

部分標(biāo)準(zhǔn)的偽目標(biāo)和空目標(biāo)命名:

² all

作為Makefile的頂層目標(biāo),一般此目標(biāo)作為默認(rèn)的終極目標(biāo)。

² clean

這個偽目標(biāo)定義了一組命令,這些命令的功能是刪除所有由make創(chuàng)建的文件。

² mostlyclean

和“clean”偽目標(biāo)功能相似。區(qū)別在于它所定義的刪除命令不會全部刪除由make生成的文件。比如說不需要刪除某些庫文件。

² distclean

² realclean

² clobber

同樣類似于偽目標(biāo),只是它們所定義的刪除命令所刪除的文件更多??梢园莔ake創(chuàng)建的文件。例如:編譯之前系統(tǒng)的配置文件、鏈接文件等。

² install

將make成功創(chuàng)建的可執(zhí)行文件拷貝到shell 環(huán)境變量“PATH”指定的某個目錄。典型的,應(yīng)用可執(zhí)行文件被拷貝到目錄“/usr/local/bin”,庫文件拷貝到目錄“/usr/local/lib”目錄下。

² print

打印出所有被更改的源文件列表。

² tar

創(chuàng)建一個tar文件。

² shar

創(chuàng)建一個源代碼的shell文檔(shar文件)。

² dist

為源文件創(chuàng)建發(fā)布的壓縮包,可以使各種壓縮方式的發(fā)布包。

² TAGS

更新一個工程的“tags”列表。

² check

² test

對Makefile最后生成的文件進行檢查。

這些功能和目標(biāo)的對照關(guān)系并不是GNU make規(guī)定的。你可以在Makefile中定義任何命名的偽目標(biāo)。但是以上這些都被作為一個默認(rèn)的規(guī)則,所有開源的工程中這些特殊的目標(biāo)的命名都是按照 這種約定來的。既然絕大多數(shù)程序員都遵循這種約定,自然我們也應(yīng)該按照這種約定來做。否則在別人看來這樣Makefile只能算一個樣例,不能作為正式版 本。

9.3 替代命令的執(zhí)行
書寫Makefile的目的就是為了告訴make一個目標(biāo)是否過期,以及如果重建一個過期的目標(biāo)。但是在某些時候,我們并不希望真正更新那些已經(jīng)過期的目 標(biāo)文件(比如:只是檢查更新目標(biāo)的命令是否正確,或者察看那些目標(biāo)需要更新)。要實現(xiàn)這樣的目的,可以使用一些特定的參數(shù)來指定make所要執(zhí)行的動作。 通過指定的參數(shù),就替代了make默認(rèn)動作的執(zhí)行。因此我們把這種方式稱為:替代命令的執(zhí)行。這些參數(shù)包括:

-n

--just-print

--dry-run

--recon

指定make執(zhí)行空操作(不執(zhí)行規(guī)則的命令),只打印出需要重建目標(biāo)使用的命令(只打印過期的目標(biāo)的重建命令),而不對目標(biāo)進行重建。

-t

--touch

類似于shell下的“touch”命令的功能。更新所有目標(biāo)文件的時間戳(對于過時的目標(biāo)文件不進行內(nèi)容更新,只更新時間戳)。

-q

--question

不執(zhí)行任何命令并且不打印任何輸出信息,只檢查所指定的目標(biāo)是否已經(jīng)是最新更。如果是則返回0,否則返回1。使用“-q”(“--question”)的 目的只是讓make返回指定(沒有指定則時終極目標(biāo))的目標(biāo)當(dāng)前是否是最新的。我們可以根據(jù)它的返回值來判斷是否須要真正的執(zhí)行更新目標(biāo)的動作(返回值時 1的情況)。

-W FILE

--what-if= FILE

--assume-new= FILE

--new-file= FILE

這個參數(shù)需要指定一個文件名。通常是一個存在源文件。make將當(dāng)前系統(tǒng)時間作為這個文件的時間戳(假設(shè)這個文件被修改過,但不真正的更改文件本身的時間 戳)。因此這個文件的時間戳被認(rèn)為最新的,在執(zhí)行時依賴于這個文件的目標(biāo)將會被重建。通過這種方式并結(jié)合“-n”參數(shù),我們可以查看那些目標(biāo)依賴于指定的 文件。

通常“-W”參數(shù)和“-n”參數(shù)一同使用,可以在修改一個文件后來檢查修改會造成那些目標(biāo)需要被更新,但并不執(zhí)行更新的命令,只是打印命令。

“-W”和“-t”參數(shù)配合使用時,make將忽略其它規(guī)則的命令。只對依賴于“-W”指定文件的目標(biāo)執(zhí)行“touch”命令,在沒有使用“-s”時,可 以看到那些文件執(zhí)行了“touch”。需要說明的是,make在對文件執(zhí)行“touch”時不是調(diào)用shell的命令,而是由make直接操作。

“-W”和“-q”參數(shù)配合使用時。由于將當(dāng)前時間作為指定文件的時間戳(目標(biāo)文件相對于系統(tǒng)當(dāng)前時間是過時的),所以make的返回狀態(tài)在沒有錯誤發(fā)生時為1,存在錯誤時為2。

注意:以上三個參數(shù)同時使用時可能會出現(xiàn)錯誤。



總結(jié):

參數(shù)“-n”、“-t”和“-q”不影響之前帶“+”號和包含“$(MAKE)”的命令行的執(zhí)行。就是說如果在規(guī)則的命令行中命令之前使用了“+”或者此命令行是遞歸地make調(diào)用時,無論是否使用了這三個參數(shù)之一,這些命令都得到執(zhí)行。

“-W”參數(shù)有兩個特點:

1. 可以和“-n”或者“-q”參數(shù)配合使用來查看修改所帶來的影響(導(dǎo)致那些目標(biāo)會被重建)。

2. 在不指定“-n”和“-q”參數(shù)、只使用“-W”指定一個文件時,可以模擬這個文件被修改的狀態(tài)。make就會重建依賴于此文件的所有目標(biāo)。

另外“-p”和“-v”參數(shù)可以允許我們輸出Makefille被執(zhí)行的過程信息,相信這一點在很多場合,特別是調(diào)試我們的Makefile是非常有用。



9.4 防止特定文件重建
有些時候當(dāng)修改了工程中的某一個文件后,并不希望重建那些依賴于這個文件的目標(biāo)。比如說我們在給一個頭文件中加入了一個宏定義、或者一個增加的函數(shù)聲明, 這些修改不會對已經(jīng)編譯完成的程序產(chǎn)生任何影響。但在執(zhí)行make時,因為頭文件的改變會導(dǎo)致所有包含它的源文件被重新編譯,當(dāng)然了終極目標(biāo)肯定也會被重 建(除非你的模塊時獨立的,或者說你的Makefile的規(guī)則鏈的定義本身就存在缺陷)。這種情況下,為了避免重新編譯整個工程,我們可以按照下邊的過程 來處理:

第一種:

1. 使用“make”命令對所有需要更新的目標(biāo)進行重建。保證修改某個文件之前所有的目標(biāo)已經(jīng)是最新的。

2. 編輯需要修改的那個源文件(修改的頭文件的內(nèi)容不能對之前的編譯的程序有影響,比如:更改了頭文件中的宏定義。這樣會造成已經(jīng)存在的程序和實現(xiàn)不相符!這里所說的修改指:不改變已經(jīng)存在的任何東西,除非你有特殊的要求)。

3. 使用“make -t”命令來改變已存在的所有的目標(biāo)文件的時間戳,將其最后修改時間修改到當(dāng)前時間。

第一種方式的是現(xiàn)實基于這樣的條件:有需要對未更改頭文件之前的編譯程序進行保存(有點像備份)。通常這種需求還是比較少見的。更多的情況是:修改這個頭 文件之前已經(jīng)修改了很多源文件或者其它的頭文件,并且也沒有執(zhí)行make(缺少了上邊的第一步)。這種方式,有點像有計劃的修改。沒有普遍性,修改通常是 不可預(yù)知的。因此這種方式在實際應(yīng)用中幾乎沒有參考的意義。對于不可預(yù)知的修改所帶來的問題,我們需要另外一種方式。

第二種方式在很大程度上可以滿足我們的需求:

第二種:

1. 執(zhí)行編譯,使用“make –o HEADERFILE”,“HEADERFILE”為需要忽略更改的頭文件,防止那些依賴于這個頭文件的目標(biāo)被重建。忽略多個頭文件的修改可使用多個“- o HEADERFILE”。這樣,除了獨立依賴于頭文件“HEADERFILE”的目標(biāo)不被重建以外,其它的目標(biāo)會根據(jù)規(guī)則來決定是否會被重建。需要注意的 是:“-o”參數(shù)的這種使用方式僅限于頭文件(.h文件),不能使用“-o”來指定源文件。

2. 執(zhí)行“make -t”命令。

9.5 替換變量定義
執(zhí)行make時,一個含有“=”的命令行參數(shù)“V=X”的含義是將變量“V”的值設(shè)置為“X”。通過這種方式定義的變量會替代在Makefile中同名變 量定義(如果存在,并且在Makefile中沒有使用指示符“override”對這個變量進行生命),稱之為命令行參數(shù)定義覆蓋普通變量定義。

通常用這種方式來傳遞一個公共變量給make。例如:在Makefile中,使用變量“CFLAGS”來指定編譯參數(shù),在Makefile中規(guī)則的命令一般都是這么寫的:



cc -c $(CFLAGS) foo.c



這樣就可以通過改變“CFLAGS”的值來控制編譯選項。我們可以在Makefile中為它指定值。例如:



CFLAGS=-g



當(dāng)直接執(zhí)行“make”時,編譯命令是“cc –c –g foo.c”。如果需要改變“CFLAGS”的定義,我們可以在命令行中執(zhí)行“make CFLAGS=’-g –O2’”,此時所執(zhí)行的編譯命令將是“cc –c –g –O2 foo.c”(在參數(shù)中如果包含空格或者shell的特殊字符,則需要將參數(shù)放在引號中)。對變量“CFLAGS”定義追加的功能就是使用這種方式來實現(xiàn) 的。

變量“CFLAGS”可以通過這種方式來實現(xiàn),它是make的隱含變量之一。對于普通變量的定義,也可以通過這種方式來對它進行重新定義(覆蓋Makefile中的定義)、或者實現(xiàn)變量值的追加功能。

通過命令行參數(shù)定義變量時,也存在兩種風(fēng)格的變量定義:遞歸展式定義和直接展開式定義。上例中使用遞歸展開式的定義(使用“=”),也可以是直接展開式的(使用“:=”)。除非在命令行中指定變量的值中包含其它變量或者函數(shù)的引用,否則這兩種方式在這種情況下是等價的。

為了防止命令行參數(shù)的變量定義覆蓋Makefile中的同名變量定義,可以在Makefile中使用指示符“override”聲明這個變量。這一點前邊的章節(jié)不止一次的提到過!

9.6 使用make進行編譯測試
正常情況make在執(zhí)行Makefile過程中,如果出現(xiàn)命令執(zhí)行錯誤,會立即放棄執(zhí)行過程并返回一個非0的狀態(tài)。就是說錯誤發(fā)生點之后的命令將不會被執(zhí)行。一個錯誤的發(fā)生就表明了終極目標(biāo)將不能被重建,make一旦檢查到錯誤就會立刻終止執(zhí)行。

假如我們在修改了一些源文件之后重新編譯工程,當(dāng)然了,我們所希望的是在某一個文件編譯出錯以后能夠繼續(xù)進行后續(xù)文件的編譯。直到最后出現(xiàn)鏈接錯誤時才退 出。這樣的目的是為了了解所修改的文件中那些文件沒有修改正確。在下一次編譯之前能夠?qū)Τ霈F(xiàn)錯誤的所有文件進行改正。而不是編譯一次改正一個文件,或者改 正一個文件再編譯一次。

我了實現(xiàn)我們這個目的,需要使用make的“-k”或者“--keep-going”命令行選項。這個參數(shù)的功能是告訴make當(dāng)出現(xiàn)錯誤時繼續(xù)執(zhí)行,直 到最后出現(xiàn)致命錯誤(無法重建終極目標(biāo))才返回非0并退出。例如:當(dāng)編譯一個.o目標(biāo)文件時出現(xiàn)錯誤,如果使用“make -k”執(zhí)行,make將不會在檢測到這個錯誤時退出(雖然已經(jīng)知道終極目標(biāo)是不可能會重建成功的);只是給出一個錯誤消息,make將繼續(xù)重建其它需要重 建的目標(biāo)文件;直到最后出現(xiàn)致命錯誤才退出。在沒有使用“-k”或者“—keep-going”時,make在檢測到錯誤時會立刻退出。

總之:在通常情況下,make的目的是重建終極目標(biāo)。當(dāng)它在執(zhí)行過程中一旦發(fā)現(xiàn)無法重建終極目標(biāo),就立刻以非0狀態(tài)退出。當(dāng)使用“-k”或者“-- keep-going”參數(shù)時,執(zhí)行的目的是為了測試重建過程,需要發(fā)現(xiàn)存在的所有問題,以便在下一次make之前進行修正。這也是調(diào)試Makefile 或者查找源文件錯誤的一種非常有效的手段。

9.7 make的命令行選項
本節(jié)羅列出了make 所支持的所有命令行參數(shù)(這些參數(shù)可以通過make的man手冊查看):

-b

-m

忽略,提供其它版本make兼容性。

-B

--always-make

強制重建所有的規(guī)則中出現(xiàn)的目標(biāo)文件。

-C DIR

--directory=DIR

在讀取Makefile之前,進入目錄“DIR”,就是切換工作目錄到“DIR”之后執(zhí)行make。存在多個“-C”選項時,make的最終工作目錄是每 一個目錄將是前一個相對路徑。例如:“make –C / -C etc”等價于“make –C /etc”。被用在遞歸地make調(diào)用中。

-d

make執(zhí)行時打印出所有的調(diào)試信息。包括:make認(rèn)為那些文件需要重建;那些文件需要比較它們的最后修改時間、比較的結(jié)果;重建目標(biāo)所要執(zhí)行的命令; 使用的隱含規(guī)則等。使用“-d”選項可以看到make構(gòu)造依賴關(guān)系鏈、重建目標(biāo)過程的所有信息,它等效于“—debug=a”.

—debug[=OPTIONS]

make執(zhí)行時輸出調(diào)試信息。可以使用“OPTIONS”控制調(diào)試信息級別。默認(rèn)是“OPTIONS=b”,“OPTIONS”的可能值為下列這些,首字母有效(all 和 aw等效)。

a(all)

輸出所有類型的調(diào)試信息,等效于“-d”選項。

b(basic)

輸出基本調(diào)試信息。包括:那些目標(biāo)過期、是否重建成功過期目標(biāo)文件。

v(verbose)

“basic”級別之上的輸出信息。包括:解析的makefile文件名,不需要重建文件等。此選項目默認(rèn)打開“basic”級別的調(diào)試信息。

i(implicit)

輸出所有使用到的隱含規(guī)則描述。此選項目默認(rèn)打開“basic”級別的調(diào)試信息。

j(jobs)

輸出所有執(zhí)行命令的子進程,包括命令執(zhí)行的PID等。

m(makefile)

也就是makefile,輸出make讀取makefile,更新makefile,執(zhí)行makefile的信息。

-e

--environment-overrides

使用系統(tǒng)環(huán)境變量的定義覆蓋Makefile中的同名變量定義。



-f=FILE

--file= FILE

--makefile= FILE

指定“FILE”為make執(zhí)行的makefile文件。

-h

--help

打印幫助信息。

-i

--ignore-errors

執(zhí)行過程中忽略規(guī)則命令執(zhí)行的錯誤。

-I DIR

--include-dir=DIR

指定被包含makefile文件的搜索目錄。在Makefile中出現(xiàn)“include”另外一個文件時,將在“DIR”目錄下搜索。多個“-I”指定目錄時,搜索目錄按照指定順序進行。

-j [JOBS]

--jobs[=JOBS]

指定可同時執(zhí)行的命令數(shù)目。在沒有指定“-j”參數(shù)的情況下,執(zhí)行的命令數(shù)目將是系統(tǒng)允許的最大可能數(shù)目。存在多個“-j”參數(shù)時,盡最后一個“-j”指定的數(shù)目(“JOBS”)有效。

-k

--keep-going

執(zhí)行命令錯誤時不終止make的執(zhí)行,make盡最大可能的執(zhí)行所有的命令,直到出現(xiàn)致命錯誤才終止。參考 測試Makeifle 一節(jié)。

-l LOAD

--load-average[=LOAD]

—max-load[=LOAD]

告訴make當(dāng)存在其它任務(wù)在執(zhí)行時,如果系統(tǒng)負荷超過“LOAD”(浮點數(shù)表示的,參考 并發(fā)執(zhí)行命令 一節(jié)),不再啟動新任務(wù)。沒有指定“LOAD”的“-I”選項將取消之前“-I”指定的限制。

-n

--just-print

--dry-run

--recon

只打印出所要執(zhí)行的命令,但不執(zhí)行命令。

-o FILE

--old-file= FILE

--assume-old= FILE

指定文件“FILE”不需要重建,即使相對于它的依賴已經(jīng)過期。因此依賴于文件“FILE”的目標(biāo)也不會被重建。注意:此參數(shù)不會通過變量“MAKEFLAGS”傳遞給子make進程。關(guān)于“-o”參數(shù)的用法可參考 防止特定文件的重建 一節(jié)

-p

--print-data-base

命令執(zhí)行之前,打印出make讀取的Makefile的所有數(shù)據(jù)(包括規(guī)則和變量的值),同時打印出make的版本信息。如果執(zhí)行打印這些數(shù)據(jù)信息(不打 印其他信息、也不執(zhí)行命令)可以使用“make -qp”命令。查看make執(zhí)行前的預(yù)設(shè)規(guī)則和變量,可使用命令“make –p –f /dev/null”。這個選項為我們在復(fù)雜環(huán)境中調(diào)試Makefile提供了手段。

-q

--question

稱為“詢問模式”;不運行任何命令,并且無輸出。make只是返回一個查詢狀態(tài)。返回狀態(tài)為0表示沒有目標(biāo)需要重建,1表示存在需要重建的目標(biāo),2表示有錯誤發(fā)生。

-r

--no-builtin-rules

取消所有make內(nèi)嵌的隱含規(guī)則,可以在Makefile中使用模式規(guī)則來定義一個規(guī)則。同時選項“-r”會取消所有支持后追規(guī)則的隱含后綴列表,同樣我 們也可以在Makefile中使用“.SUFFIXES”定義我們自己的后綴規(guī)則。“-r”選項不會取消make內(nèi)嵌的隱含變量。

-R

--no-builtin-variabes

取消make內(nèi)嵌的隱含變量,當(dāng)然我們可以在Makefile中明確定義某些變量。注意,“-R”選項同時打開“-r”選項。因為沒有了隱含變量,隱含規(guī)則將失去意義(隱含規(guī)則是以內(nèi)嵌的隱含變量為基礎(chǔ)的)。

-s

--silent

--quiet

取消命令執(zhí)行過程的打印。

-S

--no-keep-going

--stop

取消“-k”選項。在遞歸的make過程中子make通過“MAKEFLAGS”變量繼承了上層的命令行選項。我們可以在子make中使用“-S”選項取消上層傳遞的“-k”選項,或者取消系統(tǒng)環(huán)境變量“MAKEFLAGS”中的“-k”選項。

-t

—touch

和Linux的touch命令實現(xiàn)功能相同,更新所有目標(biāo)文件的時間戳到當(dāng)前系統(tǒng)時間。防止make對所有過時目標(biāo)文件的重建。

-v

--version

查看make版本信息。

-w

--print-directory

在make進入一個目錄讀取Makefile之前打印工作目錄。這個選項可以幫助我們調(diào)試Makefile,跟蹤定位錯誤。使用“-C”選項時默認(rèn)打開這個選項。參考本節(jié)前半部分“-C”選項的描述。





--no-print-directory

取消“-w”選項??梢允怯迷谶f歸的make調(diào)用過程中,取消“-C”參數(shù)的默認(rèn)打開“-w”功能。

-W FILE

--what-if= FILE

--new-file= FILE

--assume-file= FILE

設(shè)定文件“FILE”的時間戳為當(dāng)前時間,但不改變文件實際的最后修改時間。此選項主要是為實現(xiàn)了對所有依賴于文件“FILE”的目標(biāo)的強制重建。

--warn-undefined-variables

在發(fā)現(xiàn)Makefile中存在對沒有定義的變量進行引用時給出告警信息。此功能可以幫助我們調(diào)試一個存在多級套嵌變量引用的復(fù)雜Makefile。但是:我們建議在書寫Makefile時盡量避免超過三級以上的變量套嵌引用。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多