#
演示目標(biāo)體,依賴體和命令的簡單makefile文件
howdy: howdy.o helper.o helper.h
gcc howdy.o
helper.o -o howdy
helper.o: helper.c helper.h
gcc -c
helper.c
howdy.o: howdy.c
gcc -c howdy.c
hello: hello.c
gcc
hello.c -o hello
all: howdy hello
clean:
rm howdy hello
*.o
這個(gè)makefile文件包含6條規(guī)則.第一個(gè)目標(biāo)體howdy稱為默認(rèn)(default)目標(biāo)體--這是make要?jiǎng)?chuàng)建的文件.howdy有3個(gè)依賴體,分別為howdy.o,helper.o和helper.h;要編譯生成howdy,必須要有這3個(gè)文件.
第二行調(diào)用編譯器的命令供make執(zhí)行來創(chuàng)建howdy.把頭文件helper.h作為一個(gè)依賴體列入是為了避免編譯器調(diào)用未聲明的函數(shù)產(chǎn)生出錯(cuò)信息.
接下來的兩條規(guī)則告訴make怎樣生成單個(gè)目標(biāo)文件,helper.o和howdy.o.這些規(guī)則使用了gcc的-c選項(xiàng),只創(chuàng)建目標(biāo)文件但跳過鏈接.如果只想生成兩個(gè)目標(biāo)文件而不生成howdy本身,可以使用下面兩條命令:
$make
helper.o
$make howdy.o
更簡潔一點(diǎn),只需使用
$make helper.o howdy.o
makefile是一個(gè)文本形式的數(shù)據(jù)庫文件,其中包含一些規(guī)則告訴make編譯哪些文件,怎樣編譯以及在什么條件下去編譯.每條規(guī)則包含以下內(nèi)容:
.一個(gè)"目標(biāo)體"(target),即make最終需要?jiǎng)?chuàng)建的東西.
.包含一個(gè)或多個(gè)"依賴體"(dependency)的列表,依賴體通常是編譯目標(biāo)體需要的其他文件.
.為了從指定的依賴體創(chuàng)建出目標(biāo)體所需執(zhí)行的"命令"(command)的列表.
雖然目標(biāo)體通常是程序,但它們可以是諸如文本文件,手冊(cè)頁面等任何東西.目標(biāo)體甚至能測試和設(shè)置環(huán)境變量.類似地,也可以定義依賴體以確保編譯開始前存在
某個(gè)特殊的環(huán)境變量.最后,makefile中的命令可以是編譯器的命令或shell命令,它們能設(shè)置環(huán)境變量,刪除文件,或者任何命令行所能完成的功
能,如從FTP站點(diǎn)下載文件等.GNU
make被調(diào)用后會(huì)順序查找名為GNUmakefile,makefile或Makefile的文件.出于某種原因,可能只是習(xí)慣和長期形成的約定吧,大
多數(shù)Linux程序員使用最后一種形式Makefile.
Makefile規(guī)則有下列通用形式:
target
: dependency [dependency [...]]
command
command
[...]
假設(shè)有下面這樣的一個(gè)makefile:
OBJS = editor.o screen.o keyboard.o
edit :
$(OBJS)
cc -o editor $(OBJS)
.PHONY : clean
clean
:
rm editor
$(OBJS)
此時(shí),make就使用所謂的隱式規(guī)則,實(shí)際上,對(duì)每一個(gè)名為somefile.o的目標(biāo)(object)文件,make首先找到與之相應(yīng)的源代碼somefile.c,并且用gcc
-c somefile.c -o somefile.o
編譯生產(chǎn)這個(gè)目標(biāo)文件.
實(shí)際的機(jī)制比這個(gè)所描述的要全面.目標(biāo)文件(.o)可以從c,Pascal和Fortran等源代碼中生產(chǎn),所以make也應(yīng)去查找符合實(shí)際情況的相關(guān)文件.
通過定義用戶自己的隱式規(guī)則,模式規(guī)則提供了開展make的隱式規(guī)則的一種方法.模式規(guī)則類似于普通規(guī)則,但是它們的目標(biāo)必定含有符號(hào)"%".這個(gè)符號(hào)可以與任何非空字符串匹配:為與目標(biāo)中的"%"匹配,這個(gè)規(guī)則的相關(guān)文件部分也必須使用"%".例如,下面的規(guī)則:
%.o
:
%.c
告訴make所有形為somename.o的目標(biāo)(object)文件都應(yīng)從源文件somename.c編譯而來.
與隱式規(guī)則一樣,make預(yù)定義了一些模式規(guī)則:
%.o
: %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
???????????????????????
常用的make命令行選項(xiàng) 選項(xiàng)?????????????? 說明 -f
file????????????指定makefile的文件名 -n????????????????
打印將需要執(zhí)行的命令,但實(shí)際上并不執(zhí)行這些命令 -Idirname??????????指定被包含的makefile所在的目錄 -s????????????????
在執(zhí)行時(shí)不打印命令名 -w???????????????? 如果make在執(zhí)行時(shí)改變目錄,打印當(dāng)前目錄名 -Wfile????????????
如果文件已修改,則使用-n來顯示make將要執(zhí)行的命令 -r????????????????
禁止使用所有make的內(nèi)置規(guī)則 -d???????????????? 打印調(diào)試信息 -i????????????????
忽略makefile規(guī)則中的命令執(zhí)行后返回的非零錯(cuò)誤碼,此時(shí),即使某個(gè)命令返回非零的退出狀態(tài)值,make仍將繼續(xù)執(zhí)行. -k????????????????
如果某個(gè)目標(biāo)編譯失敗,繼續(xù)編譯其他目標(biāo).通常,make在一個(gè)目標(biāo)編譯失敗后終止 -jN????????????????每次運(yùn)行N個(gè)命令,這里N是非零整數(shù) |
如果在使用make時(shí)遇到問題,-d選項(xiàng)能夠使make在執(zhí)行命令時(shí)打印打量的額外調(diào)試信息.其中包括如下信息:
.在重新編譯時(shí)make需要檢查的文件
.被比較的文件以及比較的結(jié)果
.需要被重新生產(chǎn)的文件
.make想要使用的隱式規(guī)則
.make實(shí)際使用的隱式規(guī)則以及所執(zhí)行的命令
.No rule to make target 'target'.Stop
makefile中沒有包含創(chuàng)建指定的target所需要的規(guī)則,而且也沒有合適的默認(rèn)規(guī)則可用.
.'target' is up to date 指定
target 的相關(guān)文件沒有變化.
.Target 'target' not remade because of errors
在編譯target時(shí)出錯(cuò),這一消息僅在使用make的-k選項(xiàng)時(shí)才會(huì)出現(xiàn).
.command: Command not found make
找不到命令.通常是因?yàn)槊畋黄磳戝e(cuò)誤或者不在路徑$PATH下.
.Illegal option - option
在調(diào)用make時(shí)包含了不能被make識(shí)別的選項(xiàng).
出了clean的目標(biāo),外編寫makefile時(shí)還有一些常用的目標(biāo).
名為install的目標(biāo)把最終的二進(jìn)制,所支持的庫文件或shell腳本,以及相關(guān)的文檔移動(dòng)到文件系統(tǒng)中與之相應(yīng)的最終位置,并適當(dāng)設(shè)置文件的權(quán)限和屬主.
uninstall目標(biāo)則刪除由install目標(biāo)所安裝的那些文件.
dist目標(biāo)可以用來生產(chǎn)準(zhǔn)備發(fā)布的軟件包.最低限度,dist目標(biāo)將刪除編譯工作目標(biāo)中舊的二進(jìn)制文件和目標(biāo)文件并創(chuàng)建一個(gè)歸檔文件(如普通的壓縮包),以便上載到萬維網(wǎng)頁或FTP站點(diǎn).
indent能夠按照許多預(yù)先定義好的或者自定義的標(biāo)準(zhǔn)調(diào)整源代碼以及代碼縮進(jìn)的格式以達(dá)到所需的風(fēng)格.tags程序(它在emacs上的對(duì)應(yīng)程序,
etags)生成的文件能夠增強(qiáng)編輯器瀏覽和分析源代碼的能力.lclint程序是在編譯源代碼之前做個(gè)快速語法檢查.它能檢查代碼,找出大量問題,包括
未聲明的變量和函數(shù),可能的內(nèi)存破壞(memory corruption),當(dāng)然它能檢查的問題不僅僅就這幾種.
網(wǎng)上這類工具中最好的資源是"動(dòng)態(tài)存儲(chǔ)分配和內(nèi)存管理信息庫"(Dynamic Store
Allocation and Memory Management Information Repository),它的Web地址為 http://www.cs.colorado.edu/~zorn/DSA.html/.
|