因爲一直對些makefile比較頭疼,直到最近要學習LDD的時候才決定要簡單的看看MAKEFILE。不然真是沒法學了。
一個簡單的makefile組成可以如下:
target : request
cmdline
........
target: 規則的目標,通常是最後需要生成的文件名或者爲了實現這個目的而必須的中間過程名字。也可以是僞目標 如clean。它是make要執行的一個動作。(Makefile 中把那些沒有任何依賴只有執行動作的目標稱爲“僞目標”)
request:生成規則目標所需要的文件名列表。諸如.c ,.h的文件........
cmdline:在cmdline之前必須加上TAB,cmdline就是命令行。make執行的動作。
簡單的makefile的例子:
edit: main.o result.o lost.o cool.o visual.o
[tab]cc -o edit main.o result.o lost.o cool.o visual.o
main.o:main.c main.h
[tab]cc -c main.c
result.o:result.c result.h
[tab]cc -c result.c
lost.o: lost.c defs.c cool.c lost.h
[tab]cc -c lost.c
cool.o: cool.c cool.h msfd.c msfd.h
[tab]cc -c cool.c
visual.o:visual.c visual.h cannon.c cannon.h
[tab]cc -c visual.c
clean:
[tab]rm edit main.o result.o lost.o cool.o visual.o
其中edit是最終需要生成的應用程序,編譯edit時需要main.o result.o等依賴文件,而這些.o文件也依賴於其他.c.h的文件。在默認情況下
make執行的是Makefile中的第一個規則。此規則的第一個目標稱之爲 最終目的。edit目標是該makefile中第一個目標,因此他是終極目標。
在上述的例子中,edit做爲最終目標,其依賴於其他.o文件.makefile在執行最終目標的命令前,首先處理依賴文件的更新規則
目標.o文件不存在,則用其描述規則創建它
目標.o文件村則時,目標.o文件比它的任何一個依賴文件的.c源文件,.h文件"更新"則什麼也不做,否則重新編譯該.o文件。
完成了.o文件的創建後對edit進行編譯:
當edit不存在時,創建edit
當edit存在時,則檢查更新。
在上述的例子中可以發現,一旦依賴文件過多的時候,尤其是edit ,有衆多的.o文件,而且需要寫兩次,容易出錯。因此使用變量代替這些衆多的文件,這樣顯得更簡潔:
objects = main.o result.o lost.o cool.o visual.o
edit:$(objects)
cc-c edit $(objects)
.....
makefile本身存在一個默認規則,可以省去許多榮譽。在makefile中,我們只需要給出需要重建的目標文件名,make會自動將這個.o文件尋找合適的依賴文件(對應的.c文件,.o的文件名與.c的文件名一樣)
上述例子可以寫成:
objects = main.o ........
edit:$(objects)
main.o: main.h
result.o: result.h
lost.o: lost.h ..
........