




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、讀書(shū)破萬(wàn)卷下筆如有神Makefile 語(yǔ)法學(xué)習(xí)有稍稍在Linux下碰過(guò)程序設(shè)計(jì)的開(kāi)發(fā)者應(yīng)該會(huì)知道,make是用來(lái)將程序代碼、函式庫(kù)、頭文件及其它資源文件build成最終成果(即:最終的應(yīng)用程序)的超強(qiáng)力輔助工具。當(dāng)然了,并不是非得動(dòng)用到make才能build程序,或許有什么程序設(shè)計(jì)魔人喜歡什么都自己手動(dòng)進(jìn)行;但利用 make及其參考檔(輸入檔案)Make巾le將會(huì)讓整個(gè)編譯工作輕松許多。若您曾經(jīng)打包過(guò)Debian Package ,那么應(yīng)該會(huì)發(fā)現(xiàn)debuan/rule 這個(gè)檔案的語(yǔ)法和Makefile幾乎是一模一樣,所以學(xué)習(xí)Make巾le的語(yǔ)法對(duì)于 Debian PackageMaintain
2、er而言也是一門(mén)必要的功課。Makefile 語(yǔ)法:以下為Makefile的基本語(yǔ)法,批注:以#開(kāi)頭的即為批注。變量宣告:(有人稱(chēng)之為宏)語(yǔ)法:MACRO = value注意到,在=前后必須加上空白,而變量名稱(chēng)為大小寫(xiě)相異。利用MACRO =來(lái)取消該變數(shù)。在慣例上,Makefile內(nèi)部使用的變量名稱(chēng)使用 小寫(xiě);而使用者很可能從命令行自行另外指 定數(shù)值的變量,像是CFLAGS ,則是使用大寫(xiě)。在Makefile 中,可利用 $(MACRO) 或$MACRO來(lái)存取已定義的變量。例:tragets = foo$(targets): common.hgcc -o $(targets) foo.c效果等
3、同:foo: common.h gcc -o foo foo.c:=語(yǔ)法注意到,make會(huì)將整個(gè) Makefile展開(kāi)后,再?zèng)Q定變數(shù)的值。也就是說(shuō),變量的值將會(huì)是 整個(gè)MacMle中最后被指定的值。例:x = fooy = $(x) barx = xyz# y的值為xyz bar在上例中,y的值將會(huì)是 xyz bar ,而不是 foo bar。您可以利用:=來(lái)避開(kāi)這個(gè)問(wèn)題。:=表示變量的值決定于它在Make巾le中的位置,而不是整個(gè)Makefile展開(kāi)后最終的值。x := fooy := $(x) barx := xyz# y的值為foo bar在上例中,y的值將會(huì)是 foo bar ,而不是
4、xyz bar 了。?二語(yǔ)法:?二是一個(gè)簡(jiǎn)化的語(yǔ)法:若變量未定義,則替它指定新的值。否則,采用原有的值。例:FOO ?= bar若FOO 未定義,則 FOO = bar ;若FOO 已定義,則 FOO 的值維持不變。+=語(yǔ)法:例:CFLAGS = -Wall -gCFLAGS += -O2此時(shí) CFLAGS 的值就變成 -Wall-g -O2 了。define 語(yǔ)法:使用define語(yǔ)法的唯一優(yōu)點(diǎn)是它可以讓變量直接使用斷行。例:define foouname -aecho $SHELLendef all:$(foo)上例可以視同于:foo = uname -a; echo $SHELLall:
5、$(foo)注意到在上例中使用了$,讓$'能傳到Shell中。在target里另外指定變量的值可以在target里另外指定變量的值。例:foo = abcall: foo = xyzall:echo $(foo)#此時(shí),foo的值為 xyz以下的語(yǔ)法提供了和上例相同的功能:all: override foo = xyzall: export foo = xyzmake也可以存取環(huán)境變量。例:all:echo $(CFLAGS)在上例中,雖然在 Makefile里雖然沒(méi)有指定 CFLAGS 的值,但 make會(huì)試圖以環(huán)境變 量來(lái)代出 CFLAGS 的值??纱钆?wildcard指令在變量
6、里展開(kāi)* ?等通配符。例:objects=$(wildcard *.o)規(guī)則:(Rule)指示 make如何進(jìn)行編譯。主要語(yǔ)法:target: dependencies <Tab>Commands或target: dependencies; Commands<Tab>CommandsRule指示了 make如何建立target ;及何時(shí)要重新建立target。target :所要建立的檔案dependencies :相依項(xiàng)目。make 會(huì)據(jù)此決定是否要重新編譯target。Commands :建立 target 的指令。在Makefile 里并沒(méi)有限定 Rule的先后順
7、序。但默認(rèn)上,make會(huì)參考all這個(gè)目標(biāo)項(xiàng)目,并依據(jù)它的 dependencies 來(lái)決定要建立哪些項(xiàng)目。若沒(méi)有 all項(xiàng)目,則會(huì)采用 Makefile 里的第一個(gè)項(xiàng)目。target :(目標(biāo)項(xiàng)目)這個(gè)項(xiàng)目所要建立的檔案,必須以:結(jié)尾。例:foo.o: common.hgcc -c foo.c其中,foo.o是這個(gè)項(xiàng)目要建立的檔案;common.h 是相依性的項(xiàng)目/檔案;而 gcc -c foo.c則為要產(chǎn)生這個(gè)項(xiàng)目所要執(zhí)行的指令。make在編譯時(shí),若發(fā)現(xiàn) target比較新,也就是 dependencies者B比target舊,那么將 不會(huì)重新建立target ,如此可以避免不必要的編譯動(dòng)
8、作。若該項(xiàng)目并非檔案,則為fake項(xiàng)目。如此一來(lái)將不會(huì)建立target檔案。但為了避免 make有時(shí)會(huì)無(wú)去判斷 target是否為檔案或 fake項(xiàng)目,建議利用.PHONY 來(lái)指定該項(xiàng)目為 fake項(xiàng)目。例:.PHONY: cleanclean:rm *.o在上例中,若不使用.PHONY 來(lái)指定clean為fake項(xiàng)目的話,若目錄中同時(shí)存在了一 個(gè)名為clean的檔案,則clean這個(gè)項(xiàng)目將被視為 要建立clean這個(gè)檔案,但clean這 個(gè)項(xiàng)目卻又沒(méi)有任何的dependencies ,也因此,clean項(xiàng)目將永遠(yuǎn)被視為up-to-date ,永遠(yuǎn)不會(huì)被執(zhí)行。因?yàn)槔昧?.PHONY 來(lái)指定c
9、lean為fake項(xiàng)目,所以 make不會(huì)去檢查目錄中是否存 在了一個(gè)名為 clean的檔案。如此也可以提升make的執(zhí)行效率。其它類(lèi)以.PHONY 的語(yǔ)法請(qǐng)參考:GNU 'make': 4.9 Special Built-in Target Names另外,如果某個(gè)非fake 項(xiàng)目里的 dependencies 包含了 fake項(xiàng)目的話,因?yàn)?make 一定會(huì)執(zhí)行fake項(xiàng)目,這樣一來(lái),這個(gè)非 fake項(xiàng)目一定也會(huì)被執(zhí)行。這可能不是理想的做 法。dependencies :(相依性項(xiàng)目,以空白間隔)dependencies 是指定在建立 target之前,必須先檢查的項(xiàng)目。可
10、以不指定。例: foo.o: common.hgcc -c foo.c上例中是指:檢查 common.h 。如果它的建立日期比 foo.o新,就執(zhí)行 gcc -c foo.c 來(lái)重 新產(chǎn)生foo.o。也就是說(shuō),可以依需求建立 dependencies ,即使它和target 一點(diǎn)關(guān)系也沒(méi) 有。相依性項(xiàng)目可以是Makefile中其它的target。也因此,在建立該target之前,它會(huì)先檢查在 dependencies 里所指定的所有 target。Commands :(即為要執(zhí)行的 Shell指令)必須以Tab開(kāi)頭。使用 Shell Script 語(yǔ)法。在 Makefile 里,只要以 Tab
11、開(kāi)頭都將 會(huì)被視為Shell Script 執(zhí)行。每條法則必須寫(xiě)在同一行。每條 Command 會(huì)啟動(dòng)一個(gè)新的Shell ,預(yù)設(shè)為/bin/sh。若執(zhí) 行完某條Command但傳回了錯(cuò)誤值,make就會(huì)中斷執(zhí)行。因?yàn)槊織lCommand 會(huì)啟動(dòng)一個(gè)新的Shell ,所以有時(shí)執(zhí)行的指令必須寫(xiě)在同一行,像是 使用if來(lái)進(jìn)行條件判斷,此時(shí)可以用;來(lái)分隔指令。例:all:if -f foo ; then rm foo;fi而以下是錯(cuò)誤示范:all:cd subdir; $(MAKE)這時(shí)因?yàn)閙ake只會(huì)檢查最后一個(gè)指令的傳回值,所以在以上指令中,即使 subdir不存 在,但make并不會(huì)因而中斷執(zhí)行,
12、并會(huì)繼續(xù)執(zhí)行$(MAKE)指令,而產(chǎn)生了不可預(yù)期的結(jié)果。為了避免這個(gè)問(wèn)題,可以利用 &&來(lái)檢查其中某個(gè)指令是否成功執(zhí)行,再?zèng)Q定是否執(zhí)行下 個(gè)指令。例:all:cd subdir && $(MAKE)特別字符: :不要顯示執(zhí)行的指令。-:表示即使該行指令出錯(cuò),也不會(huì)中斷執(zhí)行。例:.PHONY: cleanclean:echo "Clean."-rm *.o因?yàn)閙ake會(huì)一行一行將正在執(zhí)行的Commands 顯示在屏幕上,但您可以利用 來(lái)暫時(shí)關(guān)閉這個(gè)功能。而make只要遇到任何錯(cuò)誤就會(huì)中斷執(zhí)行。但像是在進(jìn)行clean時(shí),也許根本沒(méi)有任何檔案可以c
13、lean ,因而rm會(huì)傳回錯(cuò)誤值,因而導(dǎo)致 make中斷執(zhí)行。我們可以利用-來(lái)關(guān)閉錯(cuò)誤中斷功能,讓 make不會(huì)因而中斷。隱性法則:在上例中的:foo.o: common.hgcc -c foo.c由于產(chǎn)生foo.o的指令就是 gcc -c foo.c ,因此在 Makefile 里可以將其簡(jiǎn)化為:foo.o: common.h此時(shí) make會(huì)依據(jù)target的擴(kuò)展名來(lái)猜測(cè)該如何編譯target。如此可以讓 Makefile更為簡(jiǎn)潔。您可以利用【空白指令】來(lái)避免 make依據(jù)隱性法則而進(jìn)行編譯。例:foo.o: common.h<Tab>內(nèi)部變數(shù):代表已被更新的 dependenc
14、ies 的值。$?:也就是 dependencies 中,比 tragets 還新的值。$:代表tragets的值。$<:代表第一個(gè) dependencies 的值。$* : 代表tragets所指定的檔案,但不包含擴(kuò)展名。例:print: foo1.c foo2.c foo3.c lpr -p $?touch print這樣會(huì)將fool.c foo2.c foo3.c中已有更新的內(nèi)容印至打印機(jī)。內(nèi)部函數(shù):您可以在Make巾le使用make所支持的一些內(nèi)部函數(shù)。詳情請(qǐng)參考:GNU 'make': 8 Functions for Transforming Text條件判斷:
15、可以在Makefile中使用以下的條件判斷語(yǔ)法。但由于它們不是rule ,所以不可以 <Tab>開(kāi)頭;但其后要執(zhí)行的指令則必須以<Tab>開(kāi)頭,make才會(huì)視其為 Shell指令。ifeq :(檢查 value1, value2 是否相等)ifeq (value1, value2) else endif ifneq :(提供和ifeq相反的功能)ifneq (value1, value2) else endififdef :(檢查 variable變量是否為空的)ifdef variable.else.endififndef:(提供和ifdef相反的功能)ifdef v
16、ariable.else.endif引入檔案:將外部檔案引入Makefile中??梢砸暈橹苯釉诖藢⒃摍n案全數(shù)插入Makefile中。例:include foo.in將foo.in的內(nèi)容全數(shù)引入Make巾le 里??梢酝瑫r(shí)引入多個(gè)檔案、使用變量$(MACRO)或是使用通配符(* ?或.)。例:include foo.in common*.in $(MAKEINCS)子目錄:如果該項(xiàng)目有多個(gè)目錄,且每一個(gè)目錄中都有Makefile ,則利用以下指令來(lái)進(jìn)入子目錄并進(jìn)行編譯:cd dir;$(MAKE)例:SUBDIRS = diri dir2 dir3all:for i in $(SUBDIRS); do(cd $i; make); doneclean:for i in $(SUBDIRS); do(cd $i; make clean); doneinstall:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)快餐盒行業(yè)市場(chǎng)全景監(jiān)測(cè)及投資前景展望報(bào)告
- 武漢綠色建材項(xiàng)目申請(qǐng)報(bào)告模板參考
- 2025年中國(guó)壓力式噴霧造粒干燥機(jī)市場(chǎng)前景預(yù)測(cè)及投資規(guī)劃研究報(bào)告
- 中國(guó)家電連鎖行業(yè)市場(chǎng)全景評(píng)估及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 2025年中國(guó)電纜附件行業(yè)發(fā)展運(yùn)行現(xiàn)狀及投資潛力預(yù)測(cè)報(bào)告
- 2024-2029年中國(guó)椰子汁行業(yè)市場(chǎng)需求與投資規(guī)劃分析報(bào)告
- 綿陽(yáng)特種電器項(xiàng)目可行性研究報(bào)告
- 2022-2027年中國(guó)克拉霉素分散片行業(yè)發(fā)展前景及投資戰(zhàn)略咨詢(xún)報(bào)告
- 2021-2026年中國(guó)太陽(yáng)能恒溫閥行業(yè)市場(chǎng)運(yùn)行態(tài)勢(shì)與投資戰(zhàn)略咨詢(xún)報(bào)告
- 高精度寬幅超硬合金鋁板項(xiàng)目可行性研究報(bào)告申請(qǐng)立項(xiàng)
- 《小型混凝土預(yù)制件標(biāo)準(zhǔn)化生產(chǎn)管理辦法》
- 六年級(jí)上冊(cè)英語(yǔ)教案-Culture 2 Going Green 第二課時(shí) 廣東開(kāi)心英語(yǔ)
- 警察叔叔是怎樣破案的演示文稿課件
- 青年教師個(gè)人成長(zhǎng)檔案
- 2021譯林版高中英語(yǔ)選擇性必修三課文翻譯
- 2022年華中科技大學(xué)博士研究生英語(yǔ)入學(xué)考試真題
- 《網(wǎng)店運(yùn)營(yíng)與管理》整本書(shū)電子教案全套教學(xué)教案
- 打印版 《固體物理教程》課后答案王矜奉
- CAD術(shù)語(yǔ)對(duì)照表
- 中考《紅星照耀中國(guó)》各篇章練習(xí)題及答案(1-12)
- Q∕GDW 11612.43-2018 低壓電力線高速載波通信互聯(lián)互通技術(shù)規(guī)范 第4-3部分:應(yīng)用層通信協(xié)議
評(píng)論
0/150
提交評(píng)論