海闊憑魚躍天高任鳥飛Autoconf介紹_第1頁
海闊憑魚躍天高任鳥飛Autoconf介紹_第2頁
海闊憑魚躍天高任鳥飛Autoconf介紹_第3頁
海闊憑魚躍天高任鳥飛Autoconf介紹_第4頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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è)工程源碼的架構(gòu);l寫出優(yōu)秀而漂亮的代碼框架。Autoconf介紹介紹l 今天我們一起來了解一下關(guān)于自動(dòng)化編譯的神秘面紗。l 無論是在Linux還是在Unix環(huán)境中,make都是一個(gè)非常重要的編譯命令。l

2、可以通過查閱make的幫助文檔來手工編寫Makefile,當(dāng)然我們更愿意自動(dòng)生成Makefile。l 要想了解更多的自動(dòng)化編譯的知識(shí),不僅僅要熟悉Makefile的語法,還要熟悉m4規(guī)則。l 實(shí)踐還證明:光靠這些規(guī)則理論是不夠的,我們要學(xué)會(huì)在實(shí)踐中創(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ù),則以當(dāng)前目錄為根)的目錄樹中檢查源文件。它為通常的輕便問題搜索源文件,并且為那個(gè)包創(chuàng)建一個(gè) configure.scan文件,這個(gè)文件就是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 測(cè)試程序 測(cè)試函數(shù)庫 測(cè)試頭文件 測(cè)試類型定義 測(cè)試結(jié)構(gòu) 測(cè)試編譯器特性 測(cè)試庫函數(shù) 測(cè)試系統(tǒng)調(diào)用 AC_OUTPUTAutoconf流程流程-如何寫如何寫configure.in宏宏含義含義AC_INIT(FILE)用來檢查源代碼所在的路徑。AM_INIT_AUTOMAKE(PACKAGE, VERSION)這個(gè)宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號(hào):PACKAGE是軟件包的名字,VERSION是版本號(hào)。當(dāng)你使用make dist命令時(shí),它會(huì)給你生成一個(gè)類似helloworld-1.0.tar.gz的軟件發(fā)行包,其中就有對(duì)應(yīng)的軟件包的名字和版本號(hào)。AC_PROG_C

5、C檢查系統(tǒng)所用的C編譯器。AC_CHECK_LIB (library, function, action-if-found, action-if-not-found, other-libraries)該宏用來檢查lib庫中是否存在指定的函數(shù)。當(dāng)測(cè)試成功時(shí),執(zhí)行shell命令action_if_found或者action_if_found當(dāng)為空時(shí),在輸出變量LIBS中添加-llib。 action_if_not_found把-lother_libs選項(xiàng)傳給link命令。AC_OUTPUT要輸出的Makefile的名字。AC_LANG_CPLUSPLUS對(duì)C+語言的支持。AC_PROG_LIBTO

6、OL對(duì)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的宏處理的安裝啟動(dòng)的應(yīng)用,其對(duì)應(yīng)的是.m4文件記錄了很多無法理解的宏。l 詳細(xì)的介紹見官方網(wǎng)站:/software/m4/l M4文件定義的宏一般需要在configure.in文件中調(diào)用,使用aclocal來進(jìn)行解析l acl

7、ocal也是一個(gè)perl腳本程序,aclocal根據(jù)configure.in文件的內(nèi)容,自動(dòng)生成aclocal.m4文件。l .m4文件很有趣,很多gcc無法完成的工作,m4可以方便的幫助完成;特別是環(huán)境依賴、系統(tǒng)移植性等方面。Autoconf流程流程-如何編寫如何編寫m4文件文件lM4文件的寫法貌似shell腳本,不過更多的是宏的寫法,比如定義一個(gè)宏:AC_DEFUNl其他常用的宏:AC_ARG_ENABLEAC_ARG_WITHAM_CONDITIONALAC_SUBSTAS_IFAutoconf流程流程-autoheaderl負(fù)責(zé)生成config.h.in文件。l該工具通常會(huì)從“acco

8、nfig.h”文件中復(fù)制用戶附加的符號(hào)定義,因此此處沒有附加符號(hào)定義,所以不需要?jiǎng)?chuàng)建“acconfig.h”文件。Autoconf流程流程-如何編寫如何編寫automakel automake要用的腳本配置文件是Makefile.am,用戶需要自己創(chuàng)建相應(yīng)的文件。之后,automake工具轉(zhuǎn)換成Makefile.in。l automake有相對(duì)應(yīng)的一些參數(shù)可以配置,比如-a等等可執(zhí)行文件可執(zhí)行文件靜態(tài)庫靜態(tài)庫測(cè)試文件測(cè)試文件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指的是所有文件都位于同一個(gè)目錄中u就是所有源文件、頭文件以及其他庫文件都位于當(dāng)前目錄中,且沒有子目錄。Termu

10、tils就是這一類。 shallow指的是主要的源代碼都儲(chǔ)存在頂層目錄,其他各個(gè)部分則儲(chǔ)存在子目錄中。u就是主要源文件在當(dāng)前目錄中,而其它一些實(shí)現(xiàn)各部分功能的源文件位于各自不同的目錄。Automake本身就是這一類。 deep指的是所有源代碼都被儲(chǔ)存在子目錄中;頂層目錄主要包含配置信息。u就是所有源文件及自己寫的頭文件位于當(dāng)前目錄的一個(gè)子目錄中,而當(dāng)前目錄里沒有任何源文件。 GNU cpio和GNU tar就是這一類。Yahoo的ydm、dcp等工程也屬于這一類。l flat類型是最簡(jiǎn)單的,deep類型是最復(fù)雜的。但是實(shí)際工程中我們經(jīng)常用到的是deep類型的。Autoconf流程流程-如何編寫

11、如何編寫automakel Makefile.am中盡量使用相對(duì)路徑,系統(tǒng)預(yù)定義了兩個(gè)基本路徑: $(top_srcdir) 工程最頂層目錄,用于引用源程序; $(top_builddir) 定義了生成目標(biāo)文件上最上層目錄,用于引用.o等編譯出來的目標(biā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對(duì)自己發(fā)布的軟件有嚴(yán)格的規(guī)范,比如必須附帶許可證聲明文件COPYING等,否則automake執(zhí)行時(shí)會(huì)報(bào)錯(cuò)。automake提供了三種軟件等級(jí):foreign、gnu和gnits,讓用戶選擇采用,默認(rèn)等級(jí)為gnu。在本例使用foreign等級(jí),它只檢測(cè)必須的文件。l bin_PROGRAMS或lib_LIBRARIES 定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空格隔開。 對(duì)于可執(zhí)行文件和靜態(tài)庫類

13、型,如果只想編譯,不想安裝到系統(tǒng)中,可以用 noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。Autoconf流程流程-如何編寫如何編寫automakelMakefile.am還可以支持pkgconfig,對(duì)于pc文件也有相應(yīng)的宏的定義:lpcdatadirpc文件的安裝目錄lpcdata_DATA安裝的pcdata的文件名稱Autoconf流程流程-如何編寫如何編寫automakel Makefile.am還提供了一些全局變量供所有的目標(biāo)體使用:l INCLUDES 鏈接時(shí)所需要的頭文件l LDADD 鏈接時(shí)所需要的庫

14、文件l LDFLAGS 鏈接時(shí)所需要的庫文件選項(xiàng)標(biāo)志l EXTRA_DIST 源程序和一些默認(rèn)的文件將自動(dòng)打入.tar.gz包,其它文件若要進(jìn)入.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 需要?jiǎng)h除的目錄l MOSTLYCLEANFILES 需要?jiǎng)h除的文件Autoconf流程流程autoconflautoconf是一個(gè)用于生成可以自動(dòng)地配置軟件源碼包,用以適應(yīng)多種UNIX類系統(tǒng)的shell腳本工具,其中autoconf需要用到 m4,便于生成腳本。l通過configure.in和aclocal.m4文件,使用autoconf生成configure文件,很復(fù)雜的configure文件吧!l運(yùn)行configure文件,生成了我們要的Makefile文件Autoconf優(yōu)化優(yōu)化-rpm方案方案l 我們知道,創(chuàng)建一個(gè)rpm包,需要用到一個(gè)spec文件,來注明rpm

16、包的生成信息。l 在工程項(xiàng)目中一般通常解決方法是在文件的根目錄放一個(gè)*.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 下面的這些有點(diǎn)像Makefile吧,但是這個(gè)是在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é)-補(bǔ)充補(bǔ)充lLibtool工具添加需要注意libtoolize步驟l針對(duì)CFLAGS和CXXFLAGS對(duì)默認(rèn)GNU的編譯選項(xiàng)的更改l針對(duì)一個(gè)lib可以拆分成兩個(gè)libldata_DATA需要指定datadir變量的位置lAC_HEADER_STDC等宏的合理添加lmake dist 等各種包的打法lautoreconf的使用Autoconf小結(jié)小結(jié)-FAQl 依賴的其他項(xiàng)目是從代碼編譯的,同時(shí)他們的makefile是自己寫的一套 其他項(xiàng)目從代碼進(jìn)行編譯的話,可以一次性把編譯好的lib和頭文件放到你工程下的lib和include目錄下,而不是你每次修改自己工程的源文件都需要make一下其他的項(xiàng)目。 我們的目

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論