eamcs 內建會對Makefile有關鍵字變色。
不知道大家有沒有發現,標準的原始碼壓縮包裏,並沒有Makefile這個檔案。
也許大家並不覺得這有什麼奇怪,但是這真是一件很奇怪的事。
那Makefile是怎麼來的呢?是**./configure**執行後的產物。
而程式開發人員不用自己編Makefile,複雜的專案,包著上百個源碼檔,真得可以靠**./configure**產生嗎?它怎麼會那麼聰明??
因為Makefile 不用手編了,所以筆者目前沒有示範編Makefile , 及裏面句子的文法解說。
做為那麼有傳統的make 工具,C語言程式員,如果不是用Visual C(++),或是C++ Builder,有IDE幫忙做掉,自己不會編,要做個大專案,當然是個問題。所以更精確的講,如果專案很大,還是要會手編Makefile, 但是編出來的Makefile不用放到最後發布(Release)的包(Package)裏,純為自己開發測試的用途。
跨平台發展的歷史,幾乎比Kernel還展還早,GCC比kenel還早,因為Linus是用GCC開發Kernel的,可是就像雞生蛋,蛋生雞的問題,沒有OS, 怎麼開發Kernel呢?在最早的時候,沒有Linux, 所以開發者在自己的UNIX-LIKE OS開發,大家雖是大同小異,但是為了小異,從SUN的SOLARIES到HP的unix,也不是說跨就跨得了,所以跨平台的問題發生的很早。
隨著時代的演變,無數的志願者,前扑後繼投入這個議題,在GNU,就產生了AUTO SYSTEM,其中有AUTOMAKE, AUTOCONFIG, LIBTOOL, GNULIB, 這些AUTO BUILD TOOLS 產生。
終於目標,可以產生跨平台的Makefile.
有時候,看到產生出來的Makefile, 真覺得是前人的心血結晶,一般人的Makefile是百行內,只要透過GNU 的 自動建構系統,跑出來的Makefile, 就是數千行。
GNU版的Hello World,講解這方面的GNU CODING STANDARD,http://www.gnu.org/s/hello/,在這個專案裏,
告訴你六個極常用的規範,Automake ,Gnulib(常用的函式庫),Gettext(國際化,多國語言),
getopt_long(GNU 風格命令列工具,傳參數及指定值的做法),Man線上說明,Texinfo (Gnu 手冊)。
而大家是否認為configure 執行指令檔,是手編的嗎?光從它的大小,數千行,可能會猜它也是其他指令產生的,所以,雖然,我們常常用**./configure, make , make install**
,其實它們所根據的指令檔,都不是手編的。
最近一個案例,
rss4linux-0.33(這是讀取rss指令列的工具,網址是http://rss4linux.sourceforge.net/
原作者是手編Makefile,
它寫了一段註解,
CC = gcc
LD = gcc
CFLAGS = -c -g
LDFLAGS = -o rss4linux
# Yes I use the old dependfile until I move to autotools
DEPENDFILE = .depend
# curl options
CFLAGS += `curl-config --cflags`
LDFLAGS += `curl-config --libs`
# libxml options
LDFLAGS += -lxml2
# readline
LDFLAGS+= -lreadline
小結:最近的iphone4s, 有一個人工智慧的語音系統,像是心理醫生,
筆者覺得**./configure** 指令在運行時,也很有這種味道,
檢查作業系統,檢查多執行緒,簡查GCC版本,可支援那些優化,檢查一堆東西…
然後產生Makefile. 怎麼那麼聰明呢??