大型項目使用Automake/Autoconf完成編譯配置(1)——提綱挈領
大型項目使用Automake/Autoconf完成編譯配置
使用過開源C/C++項目的同學們都知道,標準的編譯過程已經變成了簡單的三部曲:configure/make/make install, 使用起來很方便,不像平時自己寫代碼,要手寫一堆複雜的Makefile,而且換個編譯環境,Makefile還需要修改(Eclipse也是這樣)。
這麼好的東東當然要拿來用了,但GNU的Autotool係列博大精深,工具數量又多,涉及的語言也多,要是自己從頭看到尾,黃花菜都涼了,項目估計早就結束了;上網搜樣例倒是有一大堆,但都是“hello world”的樣例,離真正完成大型項目的目標還差得遠。
沒有辦法,對照網上的樣例,再找幾個開源的源碼,然後參考各種Autotools的手冊,花了2天時間,終於完成了一個基本可用的Autotools。為了避免其他XDJM也浪費時間,因此將過程總結下來,就算是新年禮物,送給大家!!
提綱挈領:使用Autotools其實很簡單
大家不要看到那麼多工具,其實使用起來很簡單,總結起來就是兩部分:
1) 按照順序調用各個工具;
2)修改或者添加3個文件;
聽到我這麼講,大家是否覺得有信心了?好的,下麵我們來看具體如何操作:
1. 源碼根目錄調用autoscan腳本,生成configure.scan文件,然後將此文件重命名為configure.ac(或configure.in,早期使用.in後綴)
2. 【修改】configure.ac,利用autoconf提供的各種M4宏,配置項目需要的各種自動化探測項目
3. 調用aclocal收集configure.ac中用到的各種非Autoconf的宏,包括【自定義宏】
4. 調用autoheader,掃描configure.ac(configure.in)、acconfig.h(如果存在),生成config.h.in宏定義文件,裏麵主要是根據configure.ac中某些特定宏(如AC_DEFINE)生成的#define和#undefine宏,configure在將根據實際的探測結果決定這些宏是否定義(具體見後麵例子)。
5. 按照automake規定的規則和項目的目錄結構,【編寫】一個或多個Makefile.am(Makefile.am數目和存放位置和源碼目錄結構相關),Makefile.am主要寫的就是編譯的目標及其源碼組成。
6. 調用automake,將每個Makefile.am轉化成Makefile.in,同時生成滿足GNU編碼規範的一係列文件(帶-a選項自動添加缺少的文件,但有幾個仍需要自己添加,在執行automake前需執行touch NEWS README AUTHORS ChangeLog)。如果configure.ac配置了使用libtool(定義了AC_PROG_LIBTOOL宏(老版本)或LT_INIT宏),需要在此步驟前先在項目根目錄執行libtoolize --automake --copy --force,以生成ltmain.sh,供automake和config.status調用。
7. 調用autoconf,利用M4解析configure.ac,生成shell腳本configure。以上幾步完成後,開發者的工作就算完成了,後麵的定製就由開源軟件的用戶根據需要給configure輸入不同的參數來完成。
8. 開源用戶調用configure,生成Makefile,然後make && make install。
整個過程步驟有8步,但其中有5步你隻需要簡單的敲一個命令即可,隻有剩下的三步需要你動手寫一些東西,對應上麵步驟中的藍色黑體字部分,下一篇博文將重點講述如何在大型項目中完成這三歩。
最後更新:2017-04-02 06:51:36
上一篇:
fopen fclose 函數練習
下一篇:
javascript:驗證郵箱、電話、QQ的正則表達式
智慧城市技術指導專家組成立
System.Runtime.InteropServices.COMException (0x8004E00F): COM+ 無法與 Microsoft 分布式事務協調程序交談 (異常來自 HRESU
MySQL 8.0.2起UNDO表空間管理更靈活
JavaScript函數及其參數數組簡介
我深入學習C語言的三個目的
Linux服務器數據庫(MySQL、ORACLE)簡單的異地備份方案
??????50????????????????????????????????????AI?????????????????????-??????-????????????-?????????
經典的NIM-poj-2975-Nim
WordPress Gravatar國內加載緩慢解決辦法
tcp流控的一個實例:無法發送數據!