目錄
一、隱含規(guī)則使用的變量
1、關(guān)于命令的變量。
2、關(guān)于命令參數(shù)的變量
二、隱含規(guī)則鏈
一、隱含規(guī)則使用的變量
????????在隱含規(guī)則中的命令中,基本上都是使用了一些預(yù)先設(shè)置的變量。你可以在你的 makefile 中改變這些變量的值,或是在 make 的命令行中傳入這些值,或是在你的環(huán)境變量 中設(shè)置這些值,無論怎么樣,只要設(shè)置了這些特定的變量,那么其就會對隱含規(guī)則起作用。 當(dāng)然,你也可以利用 make 的“-R”或“--no–builtin-variables”參數(shù)來取消你所定義的 變量對隱含規(guī)則的作用。
????????例如,第一條隱含規(guī)則——編譯 C 程序的隱含規(guī)則的命令是“$(CC) –c $(CFLAGS) $(CPPFLAGS)”。Make 默認的編譯命令是“cc”,如果你把變量“$(CC)”重定義成“gcc”, 把變量“$(CFLAGS)”重定義成“-g”,那么,隱含規(guī)則中的命令全部會以“gcc –c -g $(CPPFLAGS)”的樣子來執(zhí)行了。
????????我們可以把隱含規(guī)則中使用的變量分成兩種:一種是命令相關(guān)的,如“CC”;一種是參 數(shù)相的關(guān),如“CFLAGS”。下面是所有隱含規(guī)則中會用到的變量:
1、關(guān)于命令的變量。
AR
函數(shù)庫打包程序。默認命令是“ar”。
AS
匯編語言編譯程序。默認命令是“as”。
CC
C 語言編譯程序。默認命令是“cc”。
CXX
C++語言編譯程序。默認命令是“g++”。
CO
從 RCS 文件中擴展文件程序。默認命令是“co”。
CPP
C 程序的預(yù)處理器(輸出是標準輸出設(shè)備)。默認命令是“$(CC) –E”。
FC
Fortran 和 Ratfor 的編譯器和預(yù)處理程序。默認命令是“f77”。
GET
從 SCCS 文件中擴展文件的程序。默認命令是“get”。
LEX
Lex 方法分析器程序(針對于 C 或 Ratfor)。默認命令是“l(fā)ex”。
PC
Pascal 語言編譯程序。默認命令是“pc”。 YACC Yacc 文法分析器(針對于 C 程序)。默認命令是“yacc”。
YACCR
Yacc 文法分析器(針對于 Ratfor 程序)。默認命令是“yacc –r”。
MAKEINFO
轉(zhuǎn)換 Texinfo 源文件(.texi)到 Info 文件程序。默認命令是“makeinfo”。
TEX
從 TeX 源文件創(chuàng)建 TeX DVI 文件的程序。默認命令是“tex”。
TEXI2DVI
從 Texinfo 源文件創(chuàng)建軍 TeX DVI 文件的程序。默認命令是“texi2dvi”。
WEAVE
轉(zhuǎn)換 Web 到 TeX 的程序。默認命令是“weave”。
CWEAVE
轉(zhuǎn)換 C Web 到 TeX 的程序。默認命令是“cweave”。
TANGLE
轉(zhuǎn)換 Web 到 Pascal 語言的程序。默認命令是“tangle”。
CTANGLE
轉(zhuǎn)換 C Web 到 C。默認命令是“ctangle”。
RM
刪除文件命令。默認命令是“rm –f”。
2、關(guān)于命令參數(shù)的變量
????????下面的這些變量都是相關(guān)上面的命令的參數(shù)。如果沒有指明其默認值,那么其默認值都 是空。
ARFLAGS
函數(shù)庫打包程序 AR 命令的參數(shù)。默認值是“rv”。
ASFLAGS
匯編語言編譯器參數(shù)。(當(dāng)明顯地調(diào)用“.s”或“.S”文件時)。
CFLAGS
C 語言編譯器參數(shù)。
CXXFLAGS
C++語言編譯器參數(shù)。
COFLAGS
RCS 命令參數(shù)。
CPPFLAGS
C 預(yù)處理器參數(shù)。( C 和 Fortran 編譯器也會用到)。
FFLAGS
Fortran 語言編譯器參數(shù)。
GFLAGS
SCCS “get”程序參數(shù)。
LDFLAGS
鏈接器參數(shù)。(如:“l(fā)d”)
LFLAGS
Lex 文法分析器參數(shù)。
PFLAGS
Pascal 語言編譯器參數(shù)。
RFLAGS
Ratfor 程序的 Fortran 編譯器參數(shù)。
YFLAGS
Yacc 文法分析器參數(shù)。
二、隱含規(guī)則鏈
????????有些時候,一個目標可能被一系列的隱含規(guī)則所作用。例如,一個[.o]的文件生成,可 能會是先被 Yacc 的[.y]文件先成[.c],然后再被 C 的編譯器生成。我們把這一系列的隱含 規(guī)則叫做“隱含規(guī)則鏈”。
????????在上面的例子中,如果文件[.c]存在,那么就直接調(diào)用 C 的編譯器的隱含規(guī)則,如果沒 有[.c]文件,但有一個[.y]文件,那么 Yacc 的隱含規(guī)則會被調(diào)用,生成[.c]文件,然后, 再調(diào)用 C 編譯的隱含規(guī)則最終由[.c]生成[.o]文件,達到目標。
????????我們把這種[.c]的文件(或是目標),叫做中間目標。不管怎么樣,make 會努力自動推 導(dǎo)生成目標的一切方法,不管中間目標有多少,其都會執(zhí)著地把所有的隱含規(guī)則和你書寫的 規(guī)則全部合起來分析,努力達到目標,所以,有些時候,可能會讓你覺得奇怪,怎么我的目 標會這樣生成?怎么我的 makefile 發(fā)瘋了?
????????在默認情況下,對于中間目標,它和一般的目標有兩個地方所不同:第一個不同是除非 中間的目標不存在,才會引發(fā)中間規(guī)則。第二個不同的是,只要目標成功產(chǎn)生,那么,產(chǎn)生 最終目標過程中,所產(chǎn)生的中間目標文件會被以“rm -f”刪除。
???????? 通常,一個被 makefile 指定成目標或是依賴目標的文件不能被當(dāng)作中介。然而,你可 以明顯地說明一個文件或是目標是中介目標,你可以使用偽目標“.INTERMEDIATE”來強制 聲明。(如:.INTERMEDIATE : mid )
???????? 你也可以阻止 make 自動刪除中間目標,要做到這一點,你可以使用偽目標 “.SECONDARY”來強制聲明(如:.SECONDARY : sec)。你還可以把你的目標,以模式的方 式來指定(如:%.o)成偽目標“.PRECIOUS”的依賴目標,以保存被隱含規(guī)則所生成的中間 文件。
???????? 在“隱含規(guī)則鏈”中,禁止同一個目標出現(xiàn)兩次或兩次以上,這樣一來,就可防止在 make 自動推導(dǎo)時出現(xiàn)無限遞歸的情況。文章來源:http://www.zghlxwxcb.cn/news/detail-797400.html
????????Make 會優(yōu)化一些特殊的隱含規(guī)則,而不生成中間文件。如,從文件“foo.c”生成目標 程序“foo”,按道理,make 會編譯生成中間文件“foo.o”,然后鏈接成“foo”,但在實 際情況下,這一動作可以被一條“cc”的命令完成(cc –o foo foo.c),于是優(yōu)化過的規(guī) 則就不會生成中間文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-797400.html
到了這里,關(guān)于第十一部分 隱含規(guī)則(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!