亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Linux系統(tǒng)下Autoconf/AutoMake

系統(tǒng) 1871 0

1、autoscan
  autoscan是用來掃描源代碼目錄生成configure.scan文件的。autoscan可以用目錄名做為參數(shù),但如果你不使用參數(shù)的話,那么autoscan將認為使用的是當前目錄。autoscan將掃描你所指定目錄中的源文件,并創(chuàng)建configure.scan文件。

  2、configure.scan
  configure.scan包含了
  系統(tǒng)配置的基本選項,里面都是一些宏定義。我們需要將它改名為configure.in

  3、aclocal
  aclocal是一個perl腳本程序。aclocal根據(jù)configure.in文件的內(nèi)容,自動生成aclocal.m4文件。 aclocal的定義是:"aclocal - create aclocal.m4 by scanning configure.ac"。

  4、autoconf
  autoconf是用來產(chǎn)生configure文件的。configure是一個腳本,它能設置源程序來適應各種不同的操作系統(tǒng)平臺,并且根據(jù)不同的系統(tǒng)來產(chǎn)生合適的Makefile,從而可以使你的源代碼能在不同的操作系統(tǒng)平臺上被編譯出來。

  configure.in文件的內(nèi)容是一些宏,這些宏經(jīng)過autoconf處理后會變成檢查系統(tǒng)特性、環(huán)境變量、軟件必須的參數(shù)的shell腳本。configure.in文件中的宏的順序并沒有規(guī)定,但是你必須在所有宏的最前面和最后面分別加上AC_INIT宏和AC_OUTPUT宏。

  在configure.ini中:

  #號表示注釋,這個宏后面的內(nèi)容將被忽略。

  AC_INIT(FILE)

  這個宏用來檢查源代碼所在的路徑。

  AM_INIT_AUTOMAKE(PACKAGE, VERSION)

  這個宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號:PACKAGE是軟件包的名字,VERSION是版本號。當你使用make dist命令時,它會給你生成一個類似helloworld-1.0.tar.gz的軟件發(fā)行包,其中就有對應的軟件包的名字和版本號。

  AC_PROG_CC

  這個宏將檢查系統(tǒng)所用的C編譯器。

  AC_OUTPUT(FILE)

  這個宏是我們要輸出的Makefile的名字。

  我們在使用automake時,實際上還需要用到其他的一些宏,但我們可以用aclocal來幫我們自動產(chǎn)生。執(zhí)行aclocal后我們會得到aclocal.m4文件。

  產(chǎn)生了configure.in和aclocal.m4兩個宏文件后,我們就可以使用autoconf來產(chǎn)生configure文件了。

  5、Makefile.am
  Makefile.am是用來生成Makefile.in的,需要你手工書寫。Makefile.am中定義了一些內(nèi)容:

  AUTOMAKE_OPTIONS

  這個是automake的選項。在執(zhí)行automake時,它會檢查目錄下是否存在標準GNU軟件包中應具備的各種文件,例如AUTHORS、ChangeLog、NEWS等文件。我們將其設置成foreign時,automake會改用一般軟件包的標準來檢查。

  bin_PROGRAMS

  這個是指定我們所要產(chǎn)生的可執(zhí)行文件的文件名。如果你要產(chǎn)生多個可執(zhí)行文件,那么在各個名字間用空格隔開。

  helloworld_SOURCES

  這個是指定產(chǎn)生"helloworld"時所需要的源代碼。如果它用到了多個源文件,那么請使用空格符號將它們隔開。比如需要 helloworld.h,helloworld.c那么請寫成helloworld_SOURCES= helloworld.h helloworld.c。

  如果你在bin_PROGRAMS定義了多個可執(zhí)行文件,則對應每個可執(zhí)行文件都要定義相對的filename_SOURCES。

  6、automake
  我們使用automake --add-missing來產(chǎn)生Makefile.in。

  選項--add-missing的定義是"add missing standard files to package",它會讓automake加入一個標準的軟件包所必須的一些文件。

  我們用automake產(chǎn)生出來的Makefile.in文件是符合GNU Makefile慣例的,接下來我們只要執(zhí)行configure這個shell腳本就可以產(chǎn)生合適的Makefile文件了。

  7、Makefile
  在符合GNU Makefiel慣例的Makefile中,包含了一些基本的預先定義的操作:

  make

  根據(jù)Makefile編譯源代碼,連接,生成目標文件,可執(zhí)行文件。

  make clean

  清除上次的make命令所產(chǎn)生的object文件(后綴為".o"的文件)及可執(zhí)行文件。

  make install

  將編譯成功的可執(zhí)行文件安裝到系統(tǒng)目錄中,一般為/usr/local/bin目錄。

  make dist

  產(chǎn)生發(fā)布軟件包文件(即distribution package)。這個命令將會將可執(zhí)行文件及相關文件打包成一個tar.gz壓縮的文件用來作為發(fā)布軟件的軟件包。

它會在當前目錄下生成一個名字類似"PACKAGE-VERSION.tar.gz"的文件。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

  make distcheck

  生成發(fā)布軟件包并對其進行測試檢查,以確定發(fā)布包的正確性。這個操作將自動把壓縮包文件解開,然后執(zhí)行configure命令,并且執(zhí)行make,來確認編譯不出現(xiàn)錯誤,最后提示你軟件包已經(jīng)準備好,可以發(fā)布了。

  distclean

  類似make clean,但同時也將configure生成的文件全部刪除掉,包括Makefile。

對于一個UNIX/Linux下C程序員來說,一個比較麻煩的工作就是寫自己的Makefile。
可能你有如下經(jīng)驗:寫一個簡單的C程序,自己多寫幾行gcc命令就把程序變成可執(zhí)行的了;寫一個稍微復雜點的程序,源文件個數(shù)可能在30個左右,還是寫一行行的gcc命令就麻煩了,你可能想到寫個makefile,你可能也在這樣做著;但你某一天會發(fā)現(xiàn)你寫的這個Makefile可能不是一個所有UNIX/Linux類操作系統(tǒng)下通用的Makefile,比如某人下載了你的程序去他自己電腦上可能make不了。

這樣,你就有必要了解并學會運用autoconf和automake了。
autoconf是一個用于生成可以自動地配置軟件源代碼包以適應多種UNIX類系統(tǒng)的shell腳本的工具。由autoconf生成的配置腳本在運行的時候不需要用戶的手工干預;通常它們甚至不需要手工給出參數(shù)以確定系統(tǒng)的類型。相反,它們對軟件包可能需要的各種特征進行獨立的測試。在每個測試之前,它們打印一個單行的消息以說明它們正在進行的檢測,以使得用戶不會因為等待腳本執(zhí)行完畢而焦躁。因此,它們在混合系統(tǒng)或者從各種常見UNIX變種定制而成的系統(tǒng)中工作的很好。你也省了工作,沒必要維護文件以儲存由各個UNIX變種、各個發(fā)行版本所支持的特征的列表。
automake是一個從文件Makefile.am自動生成Makefile.in的工具。每個Makefile.am基本上是一系列make的宏定義(make規(guī)則也會偶爾出現(xiàn))生成的Makefile.in,服從GNU Makefile標準。
為了生成Makefile.in,automake需要perl。但是由automake創(chuàng)建的發(fā)布完全服從GNU標準,并且在創(chuàng)建中不需要perl。

在開始使用autoconf和automake之前,首先確認你的系統(tǒng)安裝有GNU的如下軟件:
1. automake
2. autoconf
3. m4
4. perl
5. 如果你需要產(chǎn)生共享庫(shared library)則還需要GNU Libtool

介紹方法之前大家看一下下面這個圖,先記下autoconf和automake工作的幾個步驟:
Linux系統(tǒng)下Autoconf/AutoMake

步驟解釋如下:
1、由你的源文件通過autoscan命令生成configure.scan文件,然后修改configure.scan文件并重命名為configure.in
2、由aclocal命令生成aclocal.m4
3、由autoconf命令生成configure
4、編輯一個Makefile.am文件并由automake命令生成Makefile.in文件
5、運行configure命令生成Makefile

automake支持三種目錄層次:flat、shallow和deep。
一個flat包指的是所有文件都在一個目錄中的包。為這類包提供的Makefile.am不需要SUBDIRS這個宏。這類包的一個例子是termutils。對應咱們程序員來說:就是所有源文件及自己寫的頭文件都位于當前目錄里面,且沒有子目錄。
一個deep包指的是所有的源代碼都被儲存在子目錄中的包;頂層目錄主要包含配置信息。GNU cpio是這類包的一個很好的例子,GNU tar也是。deep包的頂層Makefile.am將包括宏SUBDIRS,但沒有其它定義需要創(chuàng)建的對象的宏。對應咱們程序員來說:就是所有源文件及自己寫的頭文件都位于當前目錄的一個子目錄里面,而當前目錄里沒有任何源文件。
一個shallow包指的是主要的源代碼儲存在頂層目錄中,而各個部分(典型的是庫)則儲存在子目錄中的包。automake本身就是這類包(GNU make也是如此,它現(xiàn)在已經(jīng)不使用automake)。對應咱們程序員來說:就是主要源文件在當前目錄里,而其它一些實現(xiàn)各部分功能的源文件各自位于不同目錄。

前兩個層次的程序編輯方法非常簡單,按照上述步驟一步步即可。而第三種層次shallow稍微復雜一點,但這是我們經(jīng)常寫程序用到的結構。下面以一個例子說明shallow層次結構的源文件如何自動生成Makefile文件。
例子源程序結構如下:
hello是我們的工作目錄,hello目錄下有main.c源文件和comm、tools、db、network、interface等五個目錄。comm目錄下有comm.c和comm.h源文件及頭文件,tools目錄下有tools.c和tools.h,同樣其它目錄分別有db.c、db.h、network.c、network.h、interface.c、interface.h等一些源文件。

按照如下步驟來自動生成Makefile吧:
1、進入hello目錄,運行autoscan命令,命令如下:
cd hello
autoscan
2、ls會發(fā)現(xiàn)多了一個configure.scan文件。修改此文件,在AC_INIT宏之后加入AM_INIT_AUTOMAKE(hello, 1.0),這里hello是你的軟件名稱,1.0是版本號,即你的這些源程序編譯將生成一個軟件hello-1.0版。然后把configure.scan文件的最后一行AC_OUTPUT宏填寫完整變成AC_OUTPUT(Makefile),表明autoconf和automake最終將生成Makefile文件。最后把configure.scan文件改名為configure.in。最終configure.in文件內(nèi)容如下:

dnl Process this file with autoconf to produce a configure script.
AC_INIT(target.c)
AM_INIT_AUTOMAKE(hello, 1.0)
dnl Checks for programs.
AC_PROG_CC

dnl Checks for libraries.

dnl Checks for header files.

dnl Checks for typedefs, structures, and compiler characteristics.

dnl Checks for library functions.

AC_OUTPUT(Makefile)

3、運行aclocal命令,ls會發(fā)現(xiàn)多了一個aclocal.m4文件。
4、然后運行autoconf命令,ls將發(fā)現(xiàn)生成了一個可執(zhí)行的configure命令。
5、編輯一個Makefile.am文件,文件內(nèi)容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=main.c comm/comm.c comm/comm.h tools/tools.c tools/tools.h db/db.c db/db.h network/network.c network/network.h interface/interface.c interface/interface.h
這表明你最后將通過一個make命令利用上述hello_SOURCES源文件生成一個hello的程序。
6、運行automake --add-missing命令。屏幕提示如下:
automake: configure.in: installing `./install-sh‘
automake: configure.in: installing `./mkinstalldirs‘
automake: configure.in: installing `./missing‘
7、然后你可以運行之前生成的configure命令來生成一個Makefile文件,輸入./configure命令即可。
8、編輯Makefile文件,找到$(LINK)所在的那一行,本來生成的文件內(nèi)容如下:
@rm -f hello
$(LINK) $(hello_LDFLAGS) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)
在這兩行之間增加幾行變成:
@rm -f hello
@mv -f comm.o comm
@mv -f tools.o tools
@mv -f db.o db
@mv -f network.o network
@mv -f interface.o interface
$(LINK) $(hello_LDFLAGS) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)
這是因為默認生成的Makefile將在編譯后把所有目標文件置于當前目錄,而在進行鏈接(link)時又會到各個子目錄去找相應的目標文件。
當然,為了完整,建議各位在clean部分加上如下一些行:
@rm -f comm/comm.o
@rm -f tools/tools.o
@rm -f db/db.o
@rm -f network/network.o
@rm -f interface/interface.o

好了,經(jīng)過上述這些步驟后,現(xiàn)在你可以來編譯生成你自己的可執(zhí)行程序了。輸入一個make all吧,然后就可以運行./hello來看你的程序運行了。

運用autoconf和automake的最大好處是,你的程序以源程序方式發(fā)布后,其它所有人只需要依次輸入
./configure
make
make install
命令就可以把你的程序安裝在自己的電腦上運行了。所有符合GNU標準的UNIX/Linux都不需要再修改Makefile里的任何字符。

Linux系統(tǒng)下Autoconf/AutoMake


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91亚洲在线| 色婷婷久久综合中文久久一本` | 国产欧美另类 | 国产免费人视频在线观看免费 | 亚洲一区二区三区成人 | 91福利社| 久久ww精品w免费人成 | 粗大猛烈进出呻吟声的视频 | 欧美人交性视频在线香蕉 | 极品美女一级毛片 | 天天做天天爱天天爽综合网 | 一级片免费 | 福利视频欧美一区二区三区 | 国产午夜亚洲精品久久999 | 国产男女猛视频在线观看网站 | 五月激激激综合网色播免费 | 亚洲精品久久麻豆蜜桃 | 欧美一级在线毛片免费观看 | 欧美激情一区二区三区中文字幕 | 青青青在线视频播放免费 | 日韩精品首页 | 久久精品视频免费在线观看 | 性做久久久久久久久25的美女 | 国产不卡视频在线 | 国产欧美国产精品第二区 | 久久99久久精品久久久久久 | 久操国产视频 | 国产精品久久久久久久久kt | 一级毛片在线 | 在线a视频| 国内精品久久久久影院日本 | 国产理论精品 | 国产99视频精品免视看7 | 久草视频精品在线 | 精品国产乱码久久久久久浪潮 | 欧美一级高清片在线 | 免费费看的欧亚很色大片 | 乱人伦中文字幕在线看 | 亚洲国产精久久久久久久 | 成年女人毛片免费视频 | 另类综合网 |