版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、海闊憑魚躍海闊憑魚躍 天高任鳥飛天高任鳥飛 Autoconf Autoconf介紹介紹李俊良2010/08/18內(nèi)容大綱內(nèi)容大綱l學(xué)習(xí)目的lAutoconf介紹lAutoconf框架圖lAutoconf流程lAutoconf優(yōu)化lAutoconf小結(jié)lFAQ學(xué)習(xí)目的學(xué)習(xí)目的l如何方便在linux系統(tǒng)上寫c/c+等工程的一種技巧,從而提高工程化的能力;l方便的閱讀理解開源代碼;l容易理解掌握整個工程源碼的架構(gòu);l寫出優(yōu)秀而漂亮的代碼框架。Autoconf介紹介紹l 今天我們一起來了解一下關(guān)于自動化編譯的神秘面紗。l 無論是在Linux還是在Unix環(huán)境中,make都是一個非常重要的編譯命令。l
2、可以通過查閱make的幫助文檔來手工編寫Makefile,當然我們更愿意自動生成Makefile。l 要想了解更多的自動化編譯的知識,不僅僅要熟悉Makefile的語法,還要熟悉m4規(guī)則。l 實踐還證明:光靠這些規(guī)則理論是不夠的,我們要學(xué)會在實踐中創(chuàng)造規(guī)則、完善理論。Autoconf框架圖框架圖Autoconf流程流程-如何寫如何寫configure.inl 在開始antoconf之前,了解一下Autoconf依賴于: Bash, Coreutils, Diffutils, Grep, M4, Make, Perl, Sed.l autoscan程序可以用來為軟件包創(chuàng)建configure.in
3、文件。autoscan在以命令行參數(shù)中指定的目錄為根(如果未給定參數(shù),則以當前目錄為根)的目錄樹中檢查源文件。它為通常的輕便問題搜索源文件,并且為那個包創(chuàng)建一個 configure.scan文件,這個文件就是configure.in的前身。l autoscan程序是perl語言寫的。l 將configure.scan文件重命名成configure.in或者configure.ac,并編輯之。l configure.in文件中的內(nèi)容都是以AC_INIT開頭,以AC_OUTPUT結(jié)束。Autoconf流程流程-如何寫如何寫configure.inl confiugre.in文件的一般布局 AC_I
4、NIT 測試程序 測試函數(shù)庫 測試頭文件 測試類型定義 測試結(jié)構(gòu) 測試編譯器特性 測試庫函數(shù) 測試系統(tǒng)調(diào)用 AC_OUTPUTAutoconf流程流程-如何寫如何寫configure.in宏宏含義含義AC_INIT(FILE)用來檢查源代碼所在的路徑。AM_INIT_AUTOMAKE(PACKAGE, VERSION)這個宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號:PACKAGE是軟件包的名字,VERSION是版本號。當你使用make dist命令時,它會給你生成一個類似helloworld-1.0.tar.gz的軟件發(fā)行包,其中就有對應(yīng)的軟件包的名字和版本號。AC_PROG_C
5、C檢查系統(tǒng)所用的C編譯器。AC_CHECK_LIB (library, function, action-if-found, action-if-not-found, other-libraries)該宏用來檢查lib庫中是否存在指定的函數(shù)。當測試成功時,執(zhí)行shell命令action_if_found或者action_if_found當為空時,在輸出變量LIBS中添加-llib。 action_if_not_found把-lother_libs選項傳給link命令。AC_OUTPUT要輸出的Makefile的名字。AC_LANG_CPLUSPLUS對C+語言的支持。AC_PROG_LIBTO
6、OL對libtool工具的支持。AC_CHECK_HEADERS檢查系統(tǒng)中或環(huán)境路徑中是否存在指定的頭文件,和AC_CHECK_LIB一樣支持條件語句。AC_CHECK_FUNCS檢查library functions,和AC_CHECK_LIB一樣支持條件語句。Autoconf流程流程-如何編寫如何編寫m4文件文件l m4是傳統(tǒng)Unix的宏處理的安裝啟動的應(yīng)用,其對應(yīng)的是.m4文件記錄了很多無法理解的宏。l 詳細的介紹見官方網(wǎng)站:/software/m4/l M4文件定義的宏一般需要在configure.in文件中調(diào)用,使用aclocal來進行解析l acl
7、ocal也是一個perl腳本程序,aclocal根據(jù)configure.in文件的內(nèi)容,自動生成aclocal.m4文件。l .m4文件很有趣,很多gcc無法完成的工作,m4可以方便的幫助完成;特別是環(huán)境依賴、系統(tǒng)移植性等方面。Autoconf流程流程-如何編寫如何編寫m4文件文件lM4文件的寫法貌似shell腳本,不過更多的是宏的寫法,比如定義一個宏:AC_DEFUNl其他常用的宏:AC_ARG_ENABLEAC_ARG_WITHAM_CONDITIONALAC_SUBSTAS_IFAutoconf流程流程-autoheaderl負責(zé)生成config.h.in文件。l該工具通常會從“acco
8、nfig.h”文件中復(fù)制用戶附加的符號定義,因此此處沒有附加符號定義,所以不需要創(chuàng)建“acconfig.h”文件。Autoconf流程流程-如何編寫如何編寫automakel automake要用的腳本配置文件是Makefile.am,用戶需要自己創(chuàng)建相應(yīng)的文件。之后,automake工具轉(zhuǎn)換成Makefile.in。l automake有相對應(yīng)的一些參數(shù)可以配置,比如-a等等可執(zhí)行文件可執(zhí)行文件靜態(tài)庫靜態(tài)庫測試文件測試文件noinst_PROGRAMS = foofoo_SOURCES =foo_LDADD =foo_LDFLAGS =foo_DEPENDENCIES =noinst_LIB
9、RARIES = libfoo.afoo_a_SOURCES =foo_a_LDADD =foo_a_LIBADD =foo_a_LDFLAGS = check_PROGRAMS = dofoodofoo_SOURCES = dofoo_LDADD =TESTS_ENVIRONMENT = TESTS = $(check_PROGRAMS)Autoconf流程流程-如何編寫如何編寫automakel 目前automake支持三種目錄層次:flat、shallow和deep。 Flat指的是所有文件都位于同一個目錄中u就是所有源文件、頭文件以及其他庫文件都位于當前目錄中,且沒有子目錄。Termu
10、tils就是這一類。 shallow指的是主要的源代碼都儲存在頂層目錄,其他各個部分則儲存在子目錄中。u就是主要源文件在當前目錄中,而其它一些實現(xiàn)各部分功能的源文件位于各自不同的目錄。Automake本身就是這一類。 deep指的是所有源代碼都被儲存在子目錄中;頂層目錄主要包含配置信息。u就是所有源文件及自己寫的頭文件位于當前目錄的一個子目錄中,而當前目錄里沒有任何源文件。 GNU cpio和GNU tar就是這一類。Yahoo的ydm、dcp等工程也屬于這一類。l flat類型是最簡單的,deep類型是最復(fù)雜的。但是實際工程中我們經(jīng)常用到的是deep類型的。Autoconf流程流程-如何編寫
11、如何編寫automakel Makefile.am中盡量使用相對路徑,系統(tǒng)預(yù)定義了兩個基本路徑: $(top_srcdir) 工程最頂層目錄,用于引用源程序; $(top_builddir) 定義了生成目標文件上最上層目錄,用于引用.o等編譯出來的目標文件。l Makefile.am中也類似于m4一樣,定義了很多的宏,比如:l includedir 頭文件的路徑,等同于-I;也可以使用libfooincludedir指定特定的庫引用的頭文件路徑;l include_HEADERS 定義需要安裝的頭文件,也可以libfooinclude_HEADERS來指定特定的庫需要安裝的頭文件;一般和lib
12、fooincludedir結(jié)合使用;Autoconf流程流程-如何編寫如何編寫automakel data_DATA 需要安裝數(shù)據(jù)文件l AUTOMAKE_OPTIONS 由于GNU對自己發(fā)布的軟件有嚴格的規(guī)范,比如必須附帶許可證聲明文件COPYING等,否則automake執(zhí)行時會報錯。automake提供了三種軟件等級:foreign、gnu和gnits,讓用戶選擇采用,默認等級為gnu。在本例使用foreign等級,它只檢測必須的文件。l bin_PROGRAMS或lib_LIBRARIES 定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個執(zhí)行文件,每個文件名用空格隔開。 對于可執(zhí)行文件和靜態(tài)庫類
13、型,如果只想編譯,不想安裝到系統(tǒng)中,可以用 noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。Autoconf流程流程-如何編寫如何編寫automakelMakefile.am還可以支持pkgconfig,對于pc文件也有相應(yīng)的宏的定義:lpcdatadirpc文件的安裝目錄lpcdata_DATA安裝的pcdata的文件名稱Autoconf流程流程-如何編寫如何編寫automakel Makefile.am還提供了一些全局變量供所有的目標體使用:l INCLUDES 鏈接時所需要的頭文件l LDADD 鏈接時所需要的庫
14、文件l LDFLAGS 鏈接時所需要的庫文件選項標志l EXTRA_DIST 源程序和一些默認的文件將自動打入.tar.gz包,其它文件若要進入.tar.gz包可以用這種辦法,比如配置文件,數(shù)據(jù)文件等等。l SUBDIRS 在處理本目錄之前要遞歸處理哪些子目錄Autoconf流程流程-如何編寫如何編寫automakel AM_LDFLAGS 同LDFLAGS一樣,只是AM_ LDFLAGS優(yōu)先加載;l AM_CPPFLAGS(AM_CFLAGS) 同CPPFLAGS一樣,只是AM_CPPFLAGS優(yōu)先加載;l AM_CXXFLAGS 同CXXFLAGS一樣,只是AM_CXXFLAGS優(yōu)先加載;
15、l CLEANDIRS 需要刪除的目錄l MOSTLYCLEANFILES 需要刪除的文件Autoconf流程流程autoconflautoconf是一個用于生成可以自動地配置軟件源碼包,用以適應(yīng)多種UNIX類系統(tǒng)的shell腳本工具,其中autoconf需要用到 m4,便于生成腳本。l通過configure.in和aclocal.m4文件,使用autoconf生成configure文件,很復(fù)雜的configure文件吧!l運行configure文件,生成了我們要的Makefile文件Autoconf優(yōu)化優(yōu)化-rpm方案方案l 我們知道,創(chuàng)建一個rpm包,需要用到一個spec文件,來注明rpm
16、包的生成信息。l 在工程項目中一般通常解決方法是在文件的根目錄放一個*.spec.in(用來生成spec文件)或spec文件,這里我結(jié)合了.rpmmacros采用了生成spec文件的方式: # define rpm build root RPMBUILDTOPDIR = $(shell unset RPMBUILDTOPDIR; if -f $HOME/.rpmmacros ; then export RPMBUILDTOPDIR=grep _topdir $HOME/.rpmmacros|awk print $2; else export RPMBUILDTOPDIR=/usr/src/re
17、dhat; fi; echo $RPMBUILDTOPDIR;)Autoconf優(yōu)化優(yōu)化-rpm方案方案l 下面的這些有點像Makefile吧,但是這個是在Makefile.am文件中: .PHONY: rpm rpm: dist PACKAGE.spec$(RM) $RPMBUILDTOPDIR/SOURCES/$(distdir).tar.gz$(RM) $RPMBUILDTOPDIR/SPECS/PACKAGE.spec$(LN_S) pwd/$(distdir).tar.gz $RPMBUILDTOPDIR/SOURCES$(LN_S) pwd/PACKAGE.spec $RPMBUI
18、LDTOPDIR/SPECSrpmbuild -ba $RPMBUILDTOPDIR/SPECS/PACKAGE.specl 這樣就可以通過make rpm命令來生成rpm了,值得注意的是如果沒有在.rpmmacros文件內(nèi)指定_topdir,則需要sudo權(quán)限來根據(jù)系統(tǒng)變量來生成rpm。Autoconf小結(jié)小結(jié)-補充補充lLibtool工具添加需要注意libtoolize步驟l針對CFLAGS和CXXFLAGS對默認GNU的編譯選項的更改l針對一個lib可以拆分成兩個libldata_DATA需要指定datadir變量的位置lAC_HEADER_STDC等宏的合理添加lmake dist 等各種包的打法lautoreconf的使用Autoconf小結(jié)小結(jié)-FAQl 依賴的其他項目是從代碼編譯的,同時他們的makefile是自己寫的一套 其他項目從代碼進行編譯的話,可以一次性把編譯好的lib和頭文件放到你工程下的lib和include目錄下,而不是你每次修改自己工程的源文件都需要make一下其他的項目。 我們的目
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)財務(wù)個人工作總結(jié)15篇
- 競選部長演講稿集合九篇
- 鄉(xiāng)鎮(zhèn)學(xué)校安全工作總結(jié)
- 土木工程實習(xí)日記3篇
- 影響和制約寧遠教育發(fā)展的突出問題
- 部編版歷史九年級上冊第五單元 第16課《早期殖民掠奪》說課稿
- 五年級數(shù)學(xué)(小數(shù)除法)計算題專項練習(xí)及答案匯編
- 雇傭車輛免責(zé)協(xié)議書(2篇)
- 2025二級注冊建造師繼續(xù)教育機電工程考試題庫及答案
- 南京工業(yè)大學(xué)浦江學(xué)院《通信原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年二年級上學(xué)期數(shù)學(xué)期中模擬試卷(蘇教版)(含答案解析)
- 入團志愿書(2016版本)(可編輯打印標準A4) (1)
- (完整word版)拼音練習(xí)jqx和ü、üe的相拼
- 醫(yī)療質(zhì)量檢查分析、總結(jié)、反饋5篇
- 桅桿工藝技術(shù)及施工要求
- (完整版)六年級下冊體育教學(xué)計劃與教案
- 幼兒園教育和家庭教育的有效結(jié)合研究
- 集團公司兩金管理評價辦法
- 電影的聲音分析PPT課件
- “三措一案”實施規(guī)范標準
- 【全面解讀《國有建設(shè)用地使用權(quán)出讓地價評估技術(shù)規(guī)范【2018】4號文》
評論
0/150
提交評論