一個專案一個原始檔?
剛開始寫程式,常會參考網路的範例,或是學校教授上課,電腦書的例題,大半全部程式就是一個檔案。久了以後,大家也普遍認為一個專案,由一個程式全部完成,是一件很正常的事。
但如果把目光放遠,到網路下載一些開放源碼專案的原始檔(如SDCC這個C51編譯器),當會發現多數較具分量的專案,幾乎都是由多個原始檔案構成的。
單一檔案的編譯動作單純,可在DOS視窗的命令行上輸入:SDCC main.c 即可,顯然超過一個檔案的專案無法用這種方式處理,業界對於複數檔案的專案,通常會寫一個類似以下的makefile檔案,用來管理專案的編譯動作。
SDCCCFLAGS = --model-small
ASLINKFLAGS = --code-loc 0x20 --data-loc 0x30 --xram-loc 0x00
%.rel : %.a51
sdas8051 -l -o -s $^
main.hex : main.c begin.rel
sdcc $(SDCCCFLAGS) $(ASLINKFLAGS) $^
packihx main.ihx > main.hex
del -f *.asm *.rst *.sym
複數檔案專案的管理
Makefile檔案的作用,主要在管理專案的執行,以目前的專案為例,專案中有兩個原始碼檔案,一個是C原始程式碼,由SDCC負責編譯,另一個檔案為BEGIN.A51,是一組合語言原始程式碼,編譯程式則為SDAS8051,兩個不同屬性的原始檔購成一個專案。Makefile用來安排什麼時候用什麼編譯器,使用編譯器時要輸入什麼編譯參數。在目前的makefile,於sdcc編譯時,須要輸入的參數為:
SDCCCFLAGS = --model-small
ASLINKFLAGS = --code-loc 0x20 --data-loc 0x30 --xram-loc 0x00
Makefile的作用不只是讓使用者減少鍵盤上的指令輸入,還有管理的作用,比如專案中的BRGIN.A51先前已經編譯過了,但main.c則剛經過修改,須要重新編譯和聯結,此時makefile就可以發揮作用,以減少程式編譯所須要的工作和時間。
此類makefile,有一個專有名詞叫作script(劇本),專案該包括那幾個檔案,該如何編譯,劇本中都會詳加說明。Makefile只是一個簡單的文字檔,有專有的程式讀取makefile,然後按makefile中的說明,處理複雜的編譯動作。
很多傳統程式開發系統都有自己的劇本處理程式,像微軟就有一個imake.exe,作者所用的則是著名GNU所開發的make.exe,此類程式功能和原理都差不多,想了解此類程式的用法,網路上很容易就可以搜尋和下載。