日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux/Unix環(huán)境下的make命令詳解( 三 )


-d Debug模式,輸出有關(guān)文件和檢測(cè)時(shí)間的詳細(xì)信息 。
Linux下make標(biāo)志位的常用選項(xiàng)與Unix系統(tǒng)中稍有不同,下面我們只列出了不同部分:
-c dir 在讀取 makefile 之前改變到指定的目錄dir 。
-I dir 當(dāng)包含其他 makefile文件時(shí),利用該選項(xiàng)指定搜索目錄 。
-h help文擋,顯示所有的make選項(xiàng) 。
-w 在處理 makefile 之前和之后,都顯示工作目錄 。
通過(guò)命令行參數(shù)中的target,可指定make要編譯的目標(biāo),并且允許同時(shí)定義編譯多個(gè)目標(biāo),操作時(shí)按照從左向右的順序依次編譯target選項(xiàng)中指定的目標(biāo)文件 。如果命令行中沒(méi)有指定目標(biāo),則系統(tǒng)默認(rèn)target指向描述文件中第一個(gè)目標(biāo)文件 。
通常,makefile 中還定義有 clean 目標(biāo),可用來(lái)清除編譯過(guò)程中的中間文件,例如:
clean:
rm -f *.o
運(yùn)行 make clean 時(shí),將執(zhí)行 rm -f *.o 命令,最終刪除所有編譯過(guò)程中產(chǎn)生的所有中間文件 。
隱含規(guī)則
在make 工具中包含有一些內(nèi)置的或隱含的規(guī)則,這些規(guī)則定義了如何從不同的依賴文件建立特定類型的目標(biāo) 。Unix系統(tǒng)通常支持一種基于文件擴(kuò)展名即文件名后綴的隱含規(guī)則 。這種后綴規(guī)則定義了如何將一個(gè)具有特定文件名后綴的文件(例如.c文件),轉(zhuǎn)換成為具有另一種文件名后綴的文件(例如.o文件):

.c:.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
系統(tǒng)中默認(rèn)的常用文件擴(kuò)展名及其含義為:
.o目標(biāo)文件
.cC源文件
.fFORTRAN源文件
.s匯編源文件
.yYacc-C源語(yǔ)法
.lLex源語(yǔ)法
在早期的Unix系統(tǒng)系統(tǒng)中還支持Yacc-C源語(yǔ)法和Lex源語(yǔ)法 。在編譯過(guò)程中,系統(tǒng)會(huì)首先在makefile文件中尋找與目標(biāo)文件相關(guān)的.C文件,如果還有與之相依賴的.y和.l文件,則首先將其轉(zhuǎn)換為.c文件后再編譯生成相應(yīng)的.o文件;如果沒(méi)有與目標(biāo)相關(guān)的.c文件而只有相關(guān)的.y文件,則系統(tǒng)將直接編譯.y文件 。
而GNU make 除了支持后綴規(guī)則外還支持另一種類型的隱含規(guī)則--模式規(guī)則 。這種規(guī)則更加通用,因?yàn)榭梢岳媚J揭?guī)則定義更加復(fù)雜的依賴性規(guī)則 。模式規(guī)則看起來(lái)非常類似于正則規(guī)則,但在目標(biāo)名稱的前面多了一個(gè) % 號(hào),同時(shí)可用來(lái)定義目標(biāo)和依賴文件之間的關(guān)系,例如下面的模式規(guī)則定義了如何將任意一個(gè) file.c 文件轉(zhuǎn)換為 file.o 文件:
%.c:%.o
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
#EXAMPLE#
下面將給出一個(gè)較為全面的示例來(lái)對(duì)makefile文件和make命令的執(zhí)行進(jìn)行進(jìn)一步的說(shuō)明,其中make命令不僅涉及到了C源文件還包括了Yacc語(yǔ)法 。本例選自"Unix Programmer"s Manual 7th Edition, Volume 2A" Page 283-284
下面是描述文件的具體內(nèi)容:
 #Description file for the Make command
 #Send to print
 P=und -3 | opr -r2
 #The source files that are needed by object files
 FILES= Makefile version.c defs main.c donamc.c misc.c file.c
 dosys.c gram.y lex.c gcos.c
 #The definitions of object files
 OBJECTS= vesion.o main.o donamc.o misc.o file.o dosys.o gram.o
 LIBES= -LS
 LINT= lnit -p
 CFLAGS= -O
 make: $(OBJECTS)
 cc $(CFLAGS) $(OBJECTS) $(LIBES) -o make
 size make
 $(OBJECTS): defs
 gram.o: lex.c
 cleanup:
 -rm *.o gram.c
 install:
 @size make /usr/bin/make
 cp make /usr/bin/make ; rm make
 #print recently changed files
 print: $(FILES)
 pr $? | $P
 touch print
 test:
 make -dp | grep -v TIME>1zap
 /usr/bin/make -dp | grep -v TIME>2zap
 diff 1zap 2zap
 rm 1zap 2zap
 lint: dosys.c donamc.c file.c main.c misc.c version.c gram.c
 $(LINT) dosys.c donamc.c file.c main.c misc.c version.c
 gram.c
 rm gram.c
 arch:
 ar uv /sys/source/s2/make.a $(FILES)
通常在描述文件中應(yīng)象上面一樣定義要求輸出將要執(zhí)行的命令 。在執(zhí)行了make命令之后,輸出結(jié)果為:

推薦閱讀