iT邦幫忙

DAY 13
2

emacs的30天學習筆記系列 第 13

emacs 做中學第十三天:關於make及Makefile

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

Yes I use the old dependfile until I move to autotools(是的,我仍然使用舊的dependfile 直到我移轉到autotools上去),這是個未滿一年的專案,看得出作者還蠻利害的,用一些主流的,很受歡迎的網路工具。但是對autotools也不是很熟悉。

小結:最近的iphone4s, 有一個人工智慧的語音系統,像是心理醫生,
筆者覺得**./configure** 指令在運行時,也很有這種味道,
檢查作業系統,檢查多執行緒,簡查GCC版本,可支援那些優化,檢查一堆東西…
然後產生Makefile. 怎麼那麼聰明呢??


上一篇
emacs 做中學第十二天:xml dtd 的一個小測試
下一篇
emacs 做中學第十四天:談套件管理:mingw-get
系列文
emacs的30天學習筆記38

尚未有邦友留言

立即登入留言