版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
海闊憑魚(yú)躍天高任鳥(niǎo)飛
Autoconf介紹李俊良2010/08/18內(nèi)容大綱學(xué)習(xí)目的Autoconf介紹Autoconf框架圖Autoconf流程Autoconf優(yōu)化Autoconf小結(jié)FAQ學(xué)習(xí)目的如何方便在linux系統(tǒng)上寫(xiě)c/c++等工程的一種技巧,從而提高工程化的能力;方便的閱讀理解開(kāi)源代碼;容易理解掌握整個(gè)工程源碼的架構(gòu);寫(xiě)出優(yōu)秀而漂亮的代碼框架。Autoconf介紹今天我們一起來(lái)了解一下關(guān)于自動(dòng)化編譯的神秘面紗。無(wú)論是在Linux還是在Unix環(huán)境中,make都是一個(gè)非常重要的編譯命令??梢酝ㄟ^(guò)查閱make的幫助文檔來(lái)手工編寫(xiě)Makefile,當(dāng)然我們更愿意自動(dòng)生成Makefile。要想了解更多的自動(dòng)化編譯的知識(shí),不僅僅要熟悉Makefile的語(yǔ)法,還要熟悉m4規(guī)則。實(shí)踐還證明:光靠這些規(guī)則理論是不夠的,我們要學(xué)會(huì)在實(shí)踐中創(chuàng)造規(guī)則、完善理論。Autoconf框架圖Autoconf流程-如何寫(xiě)configure.in在開(kāi)始antoconf之前,了解一下Autoconf依賴于:Bash,Coreutils,Diffutils,Grep,M4,Make,Perl,Sed.autoscan程序可以用來(lái)為軟件包創(chuàng)建configure.in文件。autoscan在以命令行參數(shù)中指定的目錄為根(如果未給定參數(shù),則以當(dāng)前目錄為根)的目錄樹(shù)中檢查源文件。它為通常的輕便問(wèn)題搜索源文件,并且為那個(gè)包創(chuàng)建一個(gè)configure.scan文件,這個(gè)文件就是configure.in的前身。autoscan程序是perl語(yǔ)言寫(xiě)的。將configure.scan文件重命名成configure.in或者configure.ac,并編輯之。configure.in文件中的內(nèi)容都是以AC_INIT開(kāi)頭,以AC_OUTPUT結(jié)束。Autoconf流程-如何寫(xiě)configure.inconfiugre.in文件的一般布局AC_INIT測(cè)試程序測(cè)試函數(shù)庫(kù)測(cè)試頭文件測(cè)試類型定義測(cè)試結(jié)構(gòu)測(cè)試編譯器特性測(cè)試庫(kù)函數(shù)測(cè)試系統(tǒng)調(diào)用AC_OUTPUTAutoconf流程-如何寫(xiě)configure.in宏含義AC_INIT(FILE)用來(lái)檢查源代碼所在的路徑。AM_INIT_AUTOMAKE(PACKAGE,VERSION)這個(gè)宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號(hào):PACKAGE是軟件包的名字,VERSION是版本號(hào)。當(dāng)你使用makedist命令時(shí),它會(huì)給你生成一個(gè)類似helloworld-1.0.tar.gz的軟件發(fā)行包,其中就有對(duì)應(yīng)的軟件包的名字和版本號(hào)。AC_PROG_CC檢查系統(tǒng)所用的C編譯器。AC_CHECK_LIB(library,function,[action-if-found],[action-if-not-found],[other-libraries])該宏用來(lái)檢查lib庫(kù)中是否存在指定的函數(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++語(yǔ)言的支持。AC_PROG_LIBTOOL對(duì)libtool工具的支持。AC_CHECK_HEADERS檢查系統(tǒng)中或環(huán)境路徑中是否存在指定的頭文件,和AC_CHECK_LIB一樣支持條件語(yǔ)句。AC_CHECK_FUNCS檢查libraryfunctions,和AC_CHECK_LIB一樣支持條件語(yǔ)句。Autoconf流程-如何編寫(xiě)m4文件m4是傳統(tǒng)Unix的宏處理的安裝啟動(dòng)的應(yīng)用,其對(duì)應(yīng)的是.m4文件記錄了很多無(wú)法理解的宏。詳細(xì)的介紹見(jiàn)官方網(wǎng)站:/software/m4/M4文件定義的宏一般需要在configure.in文件中調(diào)用,使用aclocal來(lái)進(jìn)行解析aclocal也是一個(gè)perl腳本程序,aclocal根據(jù)configure.in文件的內(nèi)容,自動(dòng)生成aclocal.m4文件。.m4文件很有趣,很多gcc無(wú)法完成的工作,m4可以方便的幫助完成;特別是環(huán)境依賴、系統(tǒng)移植性等方面。Autoconf流程-如何編寫(xiě)m4文件M4文件的寫(xiě)法貌似shell腳本,不過(guò)更多的是宏的寫(xiě)法,比如定義一個(gè)宏:AC_DEFUN其他常用的宏:AC_ARG_ENABLEAC_ARG_WITHAM_CONDITIONALAC_SUBSTAS_IFAutoconf流程-autoheader負(fù)責(zé)生成config.h.in文件。該工具通常會(huì)從“acconfig.h”文件中復(fù)制用戶附加的符號(hào)定義,因此此處沒(méi)有附加符號(hào)定義,所以不需要?jiǎng)?chuàng)建“acconfig.h”文件。Autoconf流程-如何編寫(xiě)automakeautomake要用的腳本配置文件是Makefile.am,用戶需要自己創(chuàng)建相應(yīng)的文件。之后,automake工具轉(zhuǎn)換成Makefile.in。automake有相對(duì)應(yīng)的一些參數(shù)可以配置,比如-a等等可執(zhí)行文件靜態(tài)庫(kù)測(cè)試文件noinst_PROGRAMS=foofoo_SOURCES=foo_LDADD=foo_LDFLAGS=foo_DEPENDENCIES=noinst_LIBRARIES=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流程-如何編寫(xiě)automake目前automake支持三種目錄層次:flat、shallow和deep。Flat指的是所有文件都位于同一個(gè)目錄中就是所有源文件、頭文件以及其他庫(kù)文件都位于當(dāng)前目錄中,且沒(méi)有子目錄。Termutils就是這一類。shallow指的是主要的源代碼都儲(chǔ)存在頂層目錄,其他各個(gè)部分則儲(chǔ)存在子目錄中。就是主要源文件在當(dāng)前目錄中,而其它一些實(shí)現(xiàn)各部分功能的源文件位于各自不同的目錄。Automake本身就是這一類。deep指的是所有源代碼都被儲(chǔ)存在子目錄中;頂層目錄主要包含配置信息。就是所有源文件及自己寫(xiě)的頭文件位于當(dāng)前目錄的一個(gè)子目錄中,而當(dāng)前目錄里沒(méi)有任何源文件。GNUcpio和GNUtar就是這一類。Yahoo的ydm、dcp等工程也屬于這一類。flat類型是最簡(jiǎn)單的,deep類型是最復(fù)雜的。但是實(shí)際工程中我們經(jīng)常用到的是deep類型的。Autoconf流程-如何編寫(xiě)automakeMakefile.am中盡量使用相對(duì)路徑,系統(tǒng)預(yù)定義了兩個(gè)基本路徑:$(top_srcdir)工程最頂層目錄,用于引用源程序;$(top_builddir)定義了生成目標(biāo)文件上最上層目錄,用于引用.o等編譯出來(lái)的目標(biāo)文件。Makefile.am中也類似于m4一樣,定義了很多的宏,比如:includedir頭文件的路徑,等同于-I;也可以使用libfooincludedir指定特定的庫(kù)引用的頭文件路徑;include_HEADERS定義需要安裝的頭文件,也可以libfooinclude_HEADERS來(lái)指定特定的庫(kù)需要安裝的頭文件;一般和libfooincludedir結(jié)合使用;Autoconf流程-如何編寫(xiě)automakedata_DATA需要安裝數(shù)據(jù)文件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è)必須的文件。bin_PROGRAMS或lib_LIBRARIES定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個(gè)執(zhí)行文件,每個(gè)文件名用空格隔開(kāi)。對(duì)于可執(zhí)行文件和靜態(tài)庫(kù)類型,如果只想編譯,不想安裝到系統(tǒng)中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。Autoconf流程-如何編寫(xiě)automakeMakefile.am還可以支持pkgconfig,對(duì)于pc文件也有相應(yīng)的宏的定義:pcdatadirpc文件的安裝目錄pcdata_DATA安裝的pcdata的文件名稱Autoconf流程-如何編寫(xiě)automakeMakefile.am還提供了一些全局變量供所有的目標(biāo)體使用:INCLUDES鏈接時(shí)所需要的頭文件LDADD鏈接時(shí)所需要的庫(kù)文件LDFLAGS鏈接時(shí)所需要的庫(kù)文件選項(xiàng)標(biāo)志EXTRA_DIST源程序和一些默認(rèn)的文件將自動(dòng)打入.tar.gz包,其它文件若要進(jìn)入.tar.gz包可以用這種辦法,比如配置文件,數(shù)據(jù)文件等等。SUBDIRS在處理本目錄之前要遞歸處理哪些子目錄Autoconf流程-如何編寫(xiě)automakeAM_LDFLAGS同LDFLAGS一樣,只是AM_LDFLAGS優(yōu)先加載;AM_CPPFLAGS(AM_CFLAGS)同CPPFLAGS一樣,只是AM_CPPFLAGS優(yōu)先加載;AM_CXXFLAGS同CXXFLAGS一樣,只是AM_CXXFLAGS優(yōu)先加載;CLEANDIRS需要?jiǎng)h除的目錄MOSTLYCLEANFILES需要?jiǎng)h除的文件Autoconf流程—autoconfautoconf是一個(gè)用于生成可以自動(dòng)地配置軟件源碼包,用以適應(yīng)多種UNIX類系統(tǒng)的shell腳本工具,其中autoconf需要用到m4,便于生成腳本。通過(guò)configure.in和aclocal.m4文件,使用autoconf生成configure文件,很復(fù)雜的configure文件吧!運(yùn)行configure文件,生成了我們要的Makefile文件Autoconf優(yōu)化-rpm方案我們知道,創(chuàng)建一個(gè)rpm包,需要用到一個(gè)spec文件,來(lái)注明rpm包的生成信息。在工程項(xiàng)目中一般通常解決方法是在文件的根目錄放一個(gè)*.spec.in(用來(lái)生成spec文件)或spec文件,這里我結(jié)合了.rpmmacros采用了生成spec文件的方式:#definerpmbuildrootRPMBUILDTOPDIR=$(shellunsetRPMBUILDTOPDIR;if[-f${HOME}/.rpmmacros];thenexportRPMBUILDTOPDIR=`grep_topdir${HOME}/.rpmmacros|awk'{print$$2}'`;elseexportRPMBUILDTOPDIR=/usr/src/redhat;fi;echo$${RPMBUILDTOPDIR};)Autoconf優(yōu)化-rpm方案下面的這些有點(diǎn)像Makefile吧,但是這個(gè)是在Makefile.am文件中:.PHONY:rpmrpm: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${RPMBUILDTOPDIR}/SPECS rpmbuild-ba${RPMBUILDTOPDIR}/SPECS/@PACKAGE@.spec這樣就可以通過(guò)makerpm命令來(lái)生成rpm了,值得注意的是如果沒(méi)有在.rpmmacros文件內(nèi)指定_topdir,則需要sudo權(quán)限來(lái)根據(jù)系統(tǒng)變量來(lái)生成rpm。Autoconf小結(jié)-補(bǔ)充Libtool工具添加需要注意libtoolize步驟針對(duì)CFLAGS和CXXFLAGS對(duì)默認(rèn)GNU的編譯選項(xiàng)的更改針對(duì)一個(gè)lib可以拆分成兩個(gè)libdata_DATA需要指定datadir變量的位置AC_HEADER_STDC等宏的合理添加makedist等各種包的打法autoreconf的使用Autoconf小結(jié)-FAQ依賴的其他項(xiàng)目是從代碼編譯的,同時(shí)他們的makefile是自己寫(xiě)的一套其他項(xiàng)目從代碼進(jìn)行編譯的話,可以一次性把編譯好的lib和頭文件放到你工程下的lib和include目錄下,而不是你每次修改自己工程的源文件都需要make一下其他的項(xiàng)目。我們的目的并不是讓別人遵從我們的想法,而是宣揚(yáng)我們的想法是多么的好,甚至你有更好
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 供暖行業(yè)課件教學(xué)課件
- 腦血吸蟲(chóng)病病例分析
- 庫(kù)欣病診治專家共識(shí)
- 2023年香料香精資金籌措計(jì)劃書(shū)
- 踩點(diǎn)點(diǎn)課件教學(xué)課件
- 施工單位安全員述職報(bào)告
- 期末考前安全教育主題班會(huì)
- 安防員個(gè)人述職報(bào)告
- 肛腸科一病一品匯報(bào)
- 猜猜他是誰(shuí)教案及反思
- 危險(xiǎn)源辨識(shí)與風(fēng)險(xiǎn)評(píng)價(jià)全流程講解
- 建筑建筑物改造的防雷接地方案
- 能源與動(dòng)力工程專業(yè)英語(yǔ)詞匯
- 冷縮電纜附件
- 【課件】Unit4 Natural disaster 重點(diǎn)詞匯課件人教版高中英語(yǔ)必修第一冊(cè)
- 生物安全應(yīng)急處置演練記錄
- 【課件】3.1DNA是主要的遺傳物質(zhì)課件高一下學(xué)期生物人教版必修2
- 民族地區(qū)新型城鎮(zhèn)化
- 等邊三角形教案
- 3D數(shù)據(jù)設(shè)計(jì)通用規(guī)范
- 急診科常見(jiàn)預(yù)檢分診流程
評(píng)論
0/150
提交評(píng)論