? ? 在研發(fā)的過(guò)程中我們常常需要安裝一些程序,其中一種重要的按照方式便是從源碼安裝。像Redis,mysql,php, nginx這些開(kāi)源的程序都可以從源碼。在我們下載到源碼之后,在README文檔中常常告訴我們執(zhí)行以下命令即可安裝:
./configure
make 或者make install
一直很好奇這是怎么樣的一個(gè)過(guò)程。一番研究之后終于知道了些眉目。在這里總結(jié)一下。
? ? 首先,我們看看這個(gè)configure 是什么,vim打開(kāi)他,這是個(gè)shell腳本。他的作用是用來(lái)生成Makefile文件的。
? ? 然后,我們看看make這個(gè)命令是干什么的,用man make 查看幫助,發(fā)現(xiàn)它是gnu回來(lái)維護(hù)一組程序的工具。直白的講,就是用來(lái)根據(jù)源碼生成可執(zhí)行文件的工具。很好奇,這個(gè)工具咋就知道按照什么樣的步驟將我們的源碼編譯成可執(zhí)行文件呢?其實(shí)是根據(jù)./configure 生成的Makefile 來(lái)生成的。
? ? 到這兒,我們可能已經(jīng)明白了個(gè)大概。但是這次好奇心再次拷問(wèn)我:./configure 是這么生成Makefilede 呢。于是我打開(kāi)./configure 文件,沒(méi)讀幾行,發(fā)現(xiàn)這簡(jiǎn)直是個(gè)天書(shū)。很想知道作者是怎么寫(xiě)成的。
? ? 經(jīng)過(guò)一番google+baidu,一個(gè)主要的脈絡(luò)出來(lái)了:./configure 是可用手工編寫(xiě),但對(duì)于大型項(xiàng)目,各種依賴相當(dāng)復(fù)雜,加上不同平臺(tái)上的posix接口差異,人工編寫(xiě)的難度極大。于是有人就開(kāi)發(fā)了一系列的工具來(lái)生成這個(gè)文件。
? ? 了解到這個(gè)背景之后,我們可以想象,如果是我們自己編寫(xiě)這樣的一套工具會(huì)怎么做呢,首先我們要知道這些源碼都是什么,有一些什么樣的兼容性需要處理。因此需要掃描代碼,于是第一個(gè)神器autoscan出現(xiàn)了。man autoscan,生成一個(gè)configure.scan 文件。目前離我們的./configure 還很遠(yuǎn),在網(wǎng)上一番查詢之后,aclocal,automake,autoconf 一系列神器相繼出現(xiàn)。下面我們就來(lái)看看這些神奇是如何制造出configure文件的。
? ? 1.將configure.scan 重命名為configure.ac,修改其中的一寫(xiě)配置,添加AM_INIT_AUTOMAKE() 宏,作為aclocal的輸入生成aclocal.m4 文件。m4文件的內(nèi)容就是一系列的宏。
? ? 2.執(zhí)行autoconf,? autoheader 把a(bǔ)clocal.m4 轉(zhuǎn)換成config.h config.h.in
? ? 3.編寫(xiě)Makefile.ac 配置可執(zhí)行文件名稱,代碼等,通過(guò)automake -a 命令,生成configure。
到此大功告成。