Makefile入門(八):make運(yùn)行

make 的運(yùn)行

一般來(lái)說(shuō)佩耳,最簡(jiǎn)單的就是直接在命令行下輸入make命令遂蛀,make命令會(huì)找當(dāng)前目錄的makefile來(lái)執(zhí)行,一切都是自動(dòng)的干厚。但也有時(shí)你也許只想讓make重編譯某些文件李滴,而不是整個(gè)工程,而又有的時(shí)候你有幾套編譯規(guī)則蛮瞄,你想在不同的時(shí)候使用不同的編譯規(guī)則所坯,等等。本章節(jié)就是講述如何使用 make命令的挂捅。

make的退出碼

make命令執(zhí)行后有三個(gè)退出碼:

0 —— 表示成功執(zhí)行芹助。

1 —— 如果make運(yùn)行時(shí)出現(xiàn)任何錯(cuò)誤,其返回1闲先。

2 —— 如果你使用了make的“-q”選項(xiàng)状土,并且make使得一些目標(biāo)不需要更新,那么返回2伺糠。

Make的相關(guān)參數(shù)我們會(huì)在后續(xù)章節(jié)中講述蒙谓。

指定Makefile

前面我們說(shuō)過,GNU make找尋默認(rèn)的Makefile的規(guī)則是在當(dāng)前目錄下依次找三個(gè)文件——“GNUmakefile”训桶、“makefile”和“Makefile”彼乌。其按順序找這三個(gè)文件泻肯,一旦找到,就開始讀取這個(gè)文件并執(zhí)行慰照。

當(dāng)然灶挟,我們也可以給make命令指定一個(gè)特殊名字的Makefile。要達(dá)到這個(gè)功能毒租,我們要使用make的“-f”或是“--file”參數(shù)(“--makefile”參數(shù)也行)稚铣。例如,我們有個(gè)makefile的名字是“hchen.mk”墅垮,那么惕医,我們可以這樣來(lái)讓make來(lái)執(zhí)行這個(gè)文件:

make –f hchen.mk

如果在make的命令行是,你不只一次地使用了“-f”參數(shù)算色,那么抬伺,所有指定的makefile將會(huì)被連在一起傳遞給make執(zhí)行。

指定目標(biāo)

一般來(lái)說(shuō)灾梦,make的最終目標(biāo)是makefile中的第一個(gè)目標(biāo)峡钓,而其它目標(biāo)一般是由這個(gè)目標(biāo)連帶出來(lái)的。這是make的默認(rèn)行為若河。當(dāng)然能岩,一般來(lái)說(shuō),你的makefile中的第一個(gè)目標(biāo)是由許多個(gè)目標(biāo)組成萧福,你可以指示make拉鹃,讓其完成你所指定的目標(biāo)。要達(dá)到這一目的很簡(jiǎn)單鲫忍,需在make命令后直接跟目標(biāo)的名字就可以完成(如前面提到的“make clean”形式)

任何在makefile中的目標(biāo)都可以被指定成終極目標(biāo)膏燕,但是除了以“-”打頭,或是包含了“=”的目標(biāo)悟民,因?yàn)橛羞@些字符的目標(biāo)煌寇,會(huì)被解析成命令行參數(shù)或是變量。甚至沒有被我們明確寫出來(lái)的目標(biāo)也可以成為make的終極目標(biāo)逾雄,也就是說(shuō)阀溶,只要make可以找到其隱含規(guī)則推導(dǎo)規(guī)則,那么這個(gè)隱含目標(biāo)同樣可以被指定成終極目標(biāo)鸦泳。

有一個(gè)make的環(huán)境變量叫“MAKECMDGOALS”银锻,這個(gè)變量中會(huì)存放你所指定的終極目標(biāo)的列表,如果在命令行上做鹰,你沒有指定目標(biāo)击纬,那么,這個(gè)變量是空值钾麸。這個(gè)變量可以讓你使用在一些比較特殊的情形下更振。比如下面的例子:

sources = foo.c bar.c

ifneq ( $(MAKECMDGOALS),clean)

include $(sources:.c=.d)

endif

基于上面的這個(gè)例子炕桨,只要我們輸入的命令不是“make clean”,那么makefile會(huì)自動(dòng)包含“foo.d”和“bar.d”這兩個(gè)makefile肯腕。

使用指定終極目標(biāo)的方法可以很方便地讓我們編譯我們的程序献宫,例如下面這個(gè)例子:

.PHONY: all

all: prog1 prog2 prog3 prog4

從這個(gè)例子中,我們可以看到实撒,這個(gè)makefile中有四個(gè)需要編譯的程序——“prog1”姊途, “prog2”, “prog3”和 “prog4”知态,我們可以使用“make all”命令來(lái)編譯所有的目標(biāo)(如果把a(bǔ)ll置成第一個(gè)目標(biāo)捷兰,那么只需執(zhí)行“make”),我們也可以使用 “make prog2”來(lái)單獨(dú)編譯目標(biāo)“prog2”负敏。

即然make可以指定所有makefile中的目標(biāo)贡茅,那么也包括“偽目標(biāo)”,于是我們可以根據(jù)這種性質(zhì)來(lái)讓我們的makefile根據(jù)指定的不同的目標(biāo)來(lái)完成不同的事其做。在Unix世界中顶考,軟件發(fā)布時(shí),特別是GNU這種開源軟件的發(fā)布時(shí)庶柿,其makefile都包含了編譯村怪、安裝秽浇、打包等功能浮庐。我們可以參照這種規(guī)則來(lái)書寫我們的makefile中的目標(biāo)。

<dl style="font-size: 12.6667px; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">

<dt>“all”</dt>

<dd>這個(gè)偽目標(biāo)是所有目標(biāo)的目標(biāo)柬焕,其功能一般是編譯所有的目標(biāo)审残。</dd>

<dt>clean”</dt>

<dd>這個(gè)偽目標(biāo)功能是刪除所有被make創(chuàng)建的文件。</dd>

<dt>“install”</dt>

<dd>這個(gè)偽目標(biāo)功能是安裝已編譯好的程序斑举,其實(shí)就是把目標(biāo)執(zhí)行文件拷貝到指定的目標(biāo)中去搅轿。</dd>

<dt>print”</dt>

<dd>這個(gè)偽目標(biāo)的功能是例出改變過的源文件。</dd>

<dt>“tar”</dt>

<dd>這個(gè)偽目標(biāo)功能是把源程序打包備份富玷。也就是一個(gè)tar文件璧坟。</dd>

<dt>“dist”</dt>

<dd>這個(gè)偽目標(biāo)功能是創(chuàng)建一個(gè)壓縮文件,一般是把tar文件壓成Z文件赎懦∪妇椋或是gz文件。</dd>

<dt>TAGS”</dt>

<dd>這個(gè)偽目標(biāo)功能是更新所有的目標(biāo)励两,以備完整地重編譯使用黎茎。</dd>

<dt>“check”和“test”</dt>

<dd>這兩個(gè)偽目標(biāo)一般用來(lái)測(cè)試makefile的流程。</dd>

</dl>

當(dāng)然一個(gè)項(xiàng)目的makefile中也不一定要書寫這樣的目標(biāo)当悔,這些東西都是GNU的東西傅瞻,但是我想踢代,GNU搞出這些東西一定有其可取之處(等你的 UNIX下的程序文件一多時(shí)你就會(huì)發(fā)現(xiàn)這些功能很有用了),這里只不過是說(shuō)明了嗅骄,如果你要書寫這種功能胳挎,最好使用這種名字命名你的目標(biāo),這樣規(guī)范一些掸读,規(guī)范的好處就是——不用解釋串远,大家都明白。而且如果你的makefile中有這些功能儿惫,一是很實(shí)用澡罚,二是可以顯得你的makefile很專業(yè)(不是那種初學(xué)者的作品)。

檢查規(guī)則

有時(shí)候肾请,我們不想讓我們的makefile中的規(guī)則執(zhí)行起來(lái)留搔,我們只想檢查一下我們的命令,或是執(zhí)行的序列铛铁。于是我們可以使用make命令的下述參數(shù):

“-n” “--just-print” “--dry-run” “--recon” 不執(zhí)行參數(shù)隔显,這些參數(shù)只是打印命令,不管目標(biāo)是否更新饵逐,把規(guī)則和連帶規(guī)則下的命令打印出來(lái)括眠,但不執(zhí)行,這些參數(shù)對(duì)于我們調(diào)試makefile很有用處倍权。

“-t” “--touch” 這個(gè)參數(shù)的意思就是把目標(biāo)文件的時(shí)間更新掷豺,但不更改目標(biāo)文件。也就是說(shuō)薄声,make假裝編譯目標(biāo)当船,但不是真正的編譯目標(biāo),只是把目標(biāo)變成已編譯過的狀態(tài)默辨。

“-q” “--question” 這個(gè)參數(shù)的行為是找目標(biāo)的意思德频,也就是說(shuō),如果目標(biāo)存在缩幸,那么其什么也不會(huì)輸出壹置,當(dāng)然也不會(huì)執(zhí)行編譯,如果目標(biāo)不存在表谊,其會(huì)打印出一條出錯(cuò)信息钞护。

“-W <file>;” “--what-if=<file>;” “--assume-new=<file>;” “--new-file=<file>;” 這個(gè)參數(shù)需要指定一個(gè)文件。一般是是源文件(或依賴文件)铃肯,Make會(huì)根據(jù)規(guī)則推導(dǎo)來(lái)運(yùn)行依賴于這個(gè)文件的命令患亿,一般來(lái)說(shuō),可以和“-n”參數(shù)一同使用,來(lái)查看這個(gè)依賴文件所發(fā)生的規(guī)則命令步藕。

另外一個(gè)很有意思的用法是結(jié)合“-p”和“-v”來(lái)輸出makefile被執(zhí)行時(shí)的信息(這個(gè)將在后面講述)惦界。

make的參數(shù)

下面列舉了所有GNU make 3.80版的參數(shù)定義。其它版本和產(chǎn)商的make大同小異咙冗,不過其它產(chǎn)商的make的具體參數(shù)還是請(qǐng)參考各自的產(chǎn)品文檔沾歪。

“-b” “-m” 這兩個(gè)參數(shù)的作用是忽略和其它版本make的兼容性。

“-B” “--always-make” 認(rèn)為所有的目標(biāo)都需要更新(重編譯)雾消。

“-C <dir>” “--directory=<dir>” 指定讀取makefile的目錄灾搏。如果有多個(gè)“-C”參數(shù),make的解釋是后面的路徑以前面的作為相對(duì)路徑立润,并以最后的目錄作為被指定目錄狂窑。如:“make –C ~hchen/test –C prog”等價(jià)于“make –C ~hchen/test/prog”。

“—debug[=<options>]” 輸出make的調(diào)試信息桑腮。它有幾種不同的級(jí)別可供選擇泉哈,如果沒有參數(shù),那就是輸出最簡(jiǎn)單的調(diào)試信息破讨。下面是<options>的取值:

a —— 也就是all丛晦,輸出所有的調(diào)試信息。(會(huì)非常的多)

b —— 也就是basic提陶,只輸出簡(jiǎn)單的調(diào)試信息烫沙。即輸出不需要重編譯的目標(biāo)。

v —— 也就是verbose隙笆,在b選項(xiàng)的級(jí)別之上锌蓄。輸出的信息包括哪個(gè)makefile被解析,不需要被重編譯的依賴文件(或是依賴目標(biāo))等仲器。

i —— 也就是implicit煤率,輸出所有的隱含規(guī)則仰冠。

j —— 也就是jobs乏冀,輸出執(zhí)行規(guī)則中命令的詳細(xì)信息,如命令的PID洋只、返回碼等辆沦。

m —— 也就是makefile,輸出make讀取makefile识虚,更新makefile肢扯,執(zhí)行makefile的信息。

“-d” 相當(dāng)于“--debug=a”担锤。

“-e” “--environment-overrides” 指明環(huán)境變量的值覆蓋makefile中定義的變量的值蔚晨。

“-f=<file>” “--file=<file>” “--makefile=<file>” 指定需要執(zhí)行的makefile。

“-h” “--help” 顯示幫助信息。

“-i” “--ignore-errors” 在執(zhí)行時(shí)忽略所有的錯(cuò)誤铭腕。

“-I <dir>” “--include-dir=<dir>” 指定一個(gè)被包含makefile的搜索目標(biāo)银择。可以使用多個(gè)“-I”參數(shù)來(lái)指定多個(gè)目錄累舷。

“-j [<jobsnum>]” “--jobs[=<jobsnum>]” 指同時(shí)運(yùn)行命令的個(gè)數(shù)浩考。如果沒有這個(gè)參數(shù),make運(yùn)行命令時(shí)能運(yùn)行多少就運(yùn)行多少被盈。如果有一個(gè)以上的“-j”參數(shù)析孽,那么僅最后一個(gè)“-j”才是有效的。(注意這個(gè)參數(shù)在MS-DOS中是無(wú)用的)

“-k” “--keep-going” 出錯(cuò)也不停止運(yùn)行只怎。如果生成一個(gè)目標(biāo)失敗了袜瞬,那么依賴于其上的目標(biāo)就不會(huì)被執(zhí)行了。

“-l <load>” “--load-average[=<load]” “—max-load[=<load>]” 指定make運(yùn)行命令的負(fù)載身堡。

“-n” “--just-print” “--dry-run” “--recon” 僅輸出執(zhí)行過程中的命令序列吞滞,但并不執(zhí)行。

“-o <file>” “--old-file=<file>” “--assume-old=<file>” 不重新生成的指定的<file>盾沫,即使這個(gè)目標(biāo)的依賴文件新于它裁赠。

“-p” “--print-data-base” 輸出makefile中的所有數(shù)據(jù),包括所有的規(guī)則和變量赴精。這個(gè)參數(shù)會(huì)讓一個(gè)簡(jiǎn)單的makefile都會(huì)輸出一堆信息佩捞。如果你只是想輸出信息而不想執(zhí)行makefile,你可以使用“make -qp”命令蕾哟。如果你想查看執(zhí)行makefile前的預(yù)設(shè)變量和規(guī)則一忱,你可以使用 “make –p –f /dev/null”。這個(gè)參數(shù)輸出的信息會(huì)包含著你的makefile文件的文件名和行號(hào)谭确,所以帘营,用這個(gè)參數(shù)來(lái)調(diào)試你的 makefile會(huì)是很有用的,特別是當(dāng)你的環(huán)境變量很復(fù)雜的時(shí)候逐哈。

“-q” “--question” 不運(yùn)行命令芬迄,也不輸出。僅僅是檢查所指定的目標(biāo)是否需要更新昂秃。如果是0則說(shuō)明要更新禀梳,如果是2則說(shuō)明有錯(cuò)誤發(fā)生。

“-r” “--no-builtin-rules” 禁止make使用任何隱含規(guī)則肠骆。

“-R” “--no-builtin-variabes” 禁止make使用任何作用于變量上的隱含規(guī)則算途。

“-s” “--silent” “--quiet” 在命令運(yùn)行時(shí)不輸出命令的輸出。

“-S” “--no-keep-going” “--stop” 取消“-k”選項(xiàng)的作用蚀腿。因?yàn)橛行r(shí)候嘴瓤,make的選項(xiàng)是從環(huán)境變量“MAKEFLAGS”中繼承下來(lái)的。所以你可以在命令行中使用這個(gè)參數(shù)來(lái)讓環(huán)境變量中的“-k”選項(xiàng)失效。

“-t” “--touch” 相當(dāng)于UNIX的touch命令廓脆,只是把目標(biāo)的修改日期變成最新的畏浆,也就是阻止生成目標(biāo)的命令運(yùn)行。

“-v” “--version” 輸出make程序的版本狞贱、版權(quán)等關(guān)于make的信息刻获。

“-w” “--print-directory” 輸出運(yùn)行makefile之前和之后的信息。這個(gè)參數(shù)對(duì)于跟蹤嵌套式調(diào)用make時(shí)很有用瞎嬉。

“--no-print-directory” 禁止“-w”選項(xiàng)蝎毡。

“-W <file>” “--what-if=<file>” “--new-file=<file>” “--assume-file=<file>” 假定目標(biāo)<file>;需要更新,如果和“-n”選項(xiàng)使用氧枣,那么這個(gè)參數(shù)會(huì)輸出該目標(biāo)更新時(shí)的運(yùn)行動(dòng)作沐兵。如果沒有“-n”那么就像運(yùn)行UNIX的“touch”命令一樣,使得<file>;的修改時(shí)間為當(dāng)前時(shí)間便监。

“--warn-undefined-variables” 只要make發(fā)現(xiàn)有未定義的變量扎谎,那么就輸出警告信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載烧董,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者毁靶。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逊移,隨后出現(xiàn)的幾起案子预吆,更是在濱河造成了極大的恐慌,老刑警劉巖胳泉,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拐叉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扇商,警方通過查閱死者的電腦和手機(jī)凤瘦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)案铺,“玉大人蔬芥,你說(shuō)我怎么就攤上這事『烨遥” “怎么了坝茎?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵涤姊,是天一觀的道長(zhǎng)暇番。 經(jīng)常有香客問我,道長(zhǎng)思喊,這世上最難降的妖魔是什么壁酬? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上舆乔,老公的妹妹穿的比我還像新娘岳服。我一直安慰自己,他們只是感情好希俩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布吊宋。 她就那樣靜靜地躺著,像睡著了一般颜武。 火紅的嫁衣襯著肌膚如雪璃搜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天鳞上,我揣著相機(jī)與錄音这吻,去河邊找鬼。 笑死篙议,一個(gè)胖子當(dāng)著我的面吹牛唾糯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鬼贱,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼移怯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了这难?” 一聲冷哼從身側(cè)響起芋酌,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雁佳,沒想到半個(gè)月后脐帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糖权,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年堵腹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片星澳。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疚顷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禁偎,到底是詐尸還是另有隱情腿堤,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布如暖,位于F島的核電站笆檀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盒至。R本人自食惡果不足惜酗洒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一士修、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧樱衷,春花似錦棋嘲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至侄榴,卻和暖如春阔籽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牲蜀。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工笆制, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涣达。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓在辆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親度苔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匆篓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • makefile 介紹 make命令執(zhí)行時(shí),需要一個(gè) makefile 文件寇窑,以告訴make命令如何去編譯和鏈接程...
    Stan_Z閱讀 1,622評(píng)論 2 15
  • 來(lái)自陳浩的一片老文鸦概,但絕對(duì)營(yíng)養(yǎng)。 示例工程:3 個(gè)頭文件*.h甩骏,和 8 個(gè) C 文件*.c窗市。 初 編譯過程,源文件...
    周筱魯閱讀 4,696評(píng)論 0 17
  • makefile關(guān)系到整個(gè)工程的編譯規(guī)則饮笛,一個(gè)工程中的源文件不計(jì)其數(shù)咨察,按其類型、功能福青、模塊分別放在若干的目錄當(dāng)中摄狱,...
    Joe_HUST閱讀 1,879評(píng)論 0 3
  • 眾所周知只有持續(xù)提高成長(zhǎng)率的生意才是創(chuàng)業(yè),那如何持續(xù)提高成長(zhǎng)率呢无午!從三方面一起來(lái)討論下: 1.概念產(chǎn)生價(jià)值觀 概念...
    李澤義閱讀 267評(píng)論 2 3
  • 時(shí)間像是在指間溜走的沙粒媒役,即使雙手握得再緊也只能眼睜睜看著它溜走。 三月的關(guān)鍵詞是“破局”宪迟,因?yàn)樵谌吕锿瓿闪艘恢?..
    我叫邦尼閱讀 197評(píng)論 1 2