Django入門之開(kāi)發(fā)環(huán)境搭建1.1
899
2025-04-04
這個(gè)章節(jié)講述的是 Makefile 的隱含規(guī)則,所謂的隱含規(guī)則就是需要我們做出具體的操作,系統(tǒng)自動(dòng)完成。編寫 Makefile 的時(shí)候,可以使用隱含規(guī)則來(lái)簡(jiǎn)化Makefile 文件編寫。
實(shí)例:
test:test.o
gcc -o test test.o
test.o:test.c
我們可以在 Makefile 中這樣寫來(lái)編譯 test.c 源文件,相比較之前少寫了重建 test.o 的命令。但是執(zhí)行 make,發(fā)現(xiàn)依然重建了 test 和 test.o 文件,運(yùn)行結(jié)果卻沒(méi)有改變。這其實(shí)就是隱含規(guī)則的作用。在某些時(shí)候其實(shí)不需要給出重建目標(biāo)文件的命令,有的甚至可以不需要給出規(guī)則。實(shí)例:
test:test.o
gcc -o test test.o
運(yùn)行的結(jié)果是相同的。
注意:隱含條件只能省略中間目標(biāo)文件重建的命令和規(guī)則,但是最終目標(biāo)的命令和規(guī)則不能省略。
隱含規(guī)則的具體的工作流程:make 執(zhí)行過(guò)程中找到的隱含規(guī)則,提供了此目標(biāo)的基本依賴關(guān)系。確定目標(biāo)的依賴文件和重建目標(biāo)需要使用的命令行。隱含規(guī)則所提供的依賴文件只是一個(gè)基本的(在C語(yǔ)言中,通常他們之間的對(duì)應(yīng)關(guān)系是:test.o 對(duì)應(yīng)的是 test.c 文件)。當(dāng)需要增加這個(gè)文件的依賴文件的時(shí)候要在 Makefile 中使用沒(méi)有命令行的規(guī)則給出。實(shí)例:
test:test.o
gcc -o test test.o
test:test1.h
其實(shí)在有些時(shí)候隱含規(guī)則的使用會(huì)出現(xiàn)問(wèn)題。因?yàn)橛幸粋€(gè) make 的“隱含規(guī)則庫(kù)”。庫(kù)中的每一條隱含規(guī)則都有相應(yīng)的優(yōu)先級(jí)順序,優(yōu)先級(jí)也就會(huì)越高,使用時(shí)也就會(huì)被優(yōu)先使用。
例如在 Makefile 中添加這行代碼:
foo.o:foo.p
我們都知道 .p 文件是 Pascal 程序的源文件,如果書(shū)寫規(guī)則時(shí)不加入命令的話,那么 make 會(huì)按照隱含的規(guī)則來(lái)重建目標(biāo)文件 foo.o。如果當(dāng)前目錄下恰好存在 foo.c 文件的時(shí)候,隱含規(guī)則會(huì)把 foo.c 當(dāng)做是 foo.o 的依賴文件進(jìn)行目標(biāo)文件的重建。因?yàn)榫幾g .c 文件的隱含規(guī)則在編譯 .p 文件之前,顯然優(yōu)先級(jí)也會(huì)越高。當(dāng) make 找到生成 foo.o 的文件之后,就不會(huì)再去尋找下一條規(guī)則。如果我們不想使用隱含規(guī)則,在使用的時(shí)候不僅要聲明規(guī)則,也要添加上執(zhí)行的命令。
這里講的是預(yù)先設(shè)置的隱含規(guī)則。如果不明確的寫下規(guī)則,那么make 就會(huì)自己尋找所需要的規(guī)則和命令。當(dāng)然我們也可以使用 make 選項(xiàng):-r或-n-builtin-rules選項(xiàng)來(lái)取消所有的預(yù)設(shè)值的隱含規(guī)則。當(dāng)然即使是指定了“-r”的參數(shù),某些隱含規(guī)則還是會(huì)生效。因?yàn)橛泻芏嗟碾[含規(guī)則都是使用了后綴名的規(guī)則來(lái)定義的,所以只要隱含規(guī)則中含有“后綴列表”那么隱含規(guī)則就會(huì)生效。默認(rèn)的列表是:
.out、.a、.in、.o、.c、.cc、.C、.p、.f、.F、.r、.y、.l、.s、.S、.mod、.sym、.def、
.h、.info、.dvi、.tex、.texinfo、.texi、.txinfo、.w、.ch、.web、.sh、.elc、.el。
下面是一些常用的隱含規(guī)則:
編譯 C 程序
編譯?C++?程序
編譯 Pascal 程序
編譯 Fortran/Ratfor 程序
預(yù)處理 Fortran/Ratfor 程序
編譯 Modula-2 程序
匯編和需要預(yù)處理的匯編程序
鏈接單一的 object 文件
Yacc C 程序
Lex C 程序時(shí)的隱含規(guī)則
上面的編譯順序都是一些常用的編程語(yǔ)言執(zhí)行隱含規(guī)則的順序,我們?cè)?Makefile 中指定規(guī)則時(shí),可以參考這樣的列表。當(dāng)需要編譯源文件的時(shí)候,考慮是不是需要使用隱含規(guī)則。如果不需要,就要把相應(yīng)的規(guī)則和命令全部書(shū)寫上去。
內(nèi)嵌隱含規(guī)則的命令中,所使用的變量都是預(yù)定義的。我們將這些變量稱為“隱含變量”。這些變量允許修改:可以通過(guò)命令行參數(shù)傳遞或者是設(shè)置系統(tǒng)環(huán)境變量的方式都可以對(duì)它進(jìn)行重新定義。無(wú)論使用哪種方式,只要 make 在運(yùn)行的,這些變量的定義有效。Makefile 的隱含規(guī)則都會(huì)使用到這些變量。
比如我們編譯 .c 文件在我們的 Makefile 中就是隱含的規(guī)則,默認(rèn)使用到的編譯命令時(shí)cc,執(zhí)行的命令時(shí)cc -c我們可以對(duì)用上面的任何一種方式將CC定義為ncc。這樣我們就編譯 .c 文件的時(shí)候就可以用ncc進(jìn)行編譯。
隱含規(guī)則中使用的變量可以分成兩類:
1.代表一個(gè)程序的名字。例如:“CC”代表了編譯器的這個(gè)可執(zhí)行程序。
2.代表執(zhí)行這個(gè)程序使用的參數(shù).例如:變量“CFLAGS”。多個(gè)參數(shù)之間使用空格隔開(kāi)。
下面我們來(lái)列舉一下代表命令的變量,默認(rèn)都是小寫。
AR:函數(shù)庫(kù)打包程序,科創(chuàng)價(jià)靜態(tài)庫(kù) .a 文檔。
AS:應(yīng)用于匯編程序。
CC:C 編譯程序。
CXX:C++編譯程序。
CO:從 RCS 中提取文件的程序。
CPP:C程序的預(yù)處理器。
FC:編譯器和與處理函數(shù) Fortran 源文件的編譯器。
GET:從CSSC 中提取文件程序。
LEX:將Lex語(yǔ)言轉(zhuǎn)變?yōu)?C 或 Ratfo 的程序。
PC:Pascal 語(yǔ)言編譯器。
YACC:Yacc 文法分析器(針對(duì)于C語(yǔ)言)
YACCR:Yacc 文法分析器。
Makefile 匯編語(yǔ)言
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。