autotools工具使用 good

學習GNU/LINUX開發的編程人員,上手以後不久就會在編譯開源軟件的時候碰到configure腳本,過段時間還會知道configure腳本是 autoconf生成的;可是真正想用起來autoconf,倒是要弄明白config.h,configure.in,Makfile.am等一大堆的 文件,這可能要花些功夫。讓咱們從一個例子開始,爭取爲你們省點力氣。html

咱們用個小程序做例子,計算一個整數的開方,建個工做目錄:sqrt。程序很簡單:
 #include
 #include
 int main()
 {
  int i=0;
  scanf("%d",&i);
  printf("sqrt(%d)=%f\n",i,sqrt(i));
 }
 接下來咱們要編譯這個程序:
 $cc -X -lm -o sqrt sqrt.c
 由於咱們使用了數學庫,因此要給連接器傳遞一個參數-lm。
 程序就完成了。
 咱們想專業一點,給這個程序增長Make文件,不用再輸入那麼長的命令,同時還想讓這個程序成爲可移植的程序。這個時候,咱們就須要用到autotools了。
 autotools包含了幾個部分,最經常使用到的是autoconf和automake。
 咱們先加入autoconf。
 autoconf須要一個configure.ac文件,幸運的是,咱們不須要本身寫這個文件,咱們可使用autoscan來生成這個文件。執行autoscan。
 $autoscan
autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1
錯誤信息先不用管,目錄下多了幾個文件: autoscan.log configure.scan。咱們要關心的是configure.scan,這是一個原始版本的configure.ac。打開這個文件,把下面這一行修改一下:
 AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
 改爲
 AC_INIT([sqrt], [0.1.0], [you@mail.address])
參數的意思一目瞭然,不羅嗦了。接下來將文件另存爲:configure.ac。執行:
 $autoconf
 咱們看到,目錄下又多了一些內容,咱們關心的是configure這個腳本文件,執行一下試試吧!
 不過如今這個configure還沒什麼用,要發揮configure的真正目的——識別編譯環境,配置編譯選項的話,還要進行一些操做。編程

首先編輯configure.ac文件,在咱們以前改動的AC_INIT...一行下面,加入以下一行內容:
AM_INIT_AUTOMAKE 
再執行一次autoconf試試?很不幸,咱們遇到了錯誤:
configure.ac:6: error: possibly undefined macro: AM_INIT_AUTOMAKE...
由於找不到AM_INIT_AUTOMAKE宏,不要擔憂,由於咱們少作了一步,先要把這些宏生成一下,固然是自動的。
$aclocal
$autoconf
如今的autoconf沒有報錯。這個時候再看看目錄下面,發現多了一個aclocal.m4文件,這就是aclocal聲稱的宏命令文件,autoconf會使用它來生成新的configure腳本。
 是否是如今就可以自動搞定Makefile了?咱們如今再執行一下configure,看看輸出:
 configure: error: cannot find install-sh or install.sh in . ./.. ./../..
 和咱們想的有點不一樣,咱們還要用到automake命令作一些其它的事情,咱們先執行一下:
 $automake
 configure.ac: required file `./install-sh' not found
 configure.ac: required file `./missing' not found
 automake: no `Makefile.am' found for any configure output
 咱們注意到最後一行,知道了還須要一個`Makefile.am`文件,這個文件咱們要寫一下,編輯一個文件,增長:
 bin_PROGRAMS = sqrt
 sqrt_SOURCES = sqrt.c
 sqrt_LDADD = $(LIBOJBS)
 執行automake試試?
 configure.ac: required file `./install-sh' not found
configure.ac: required file `./missing' not found
automake: no `Makefile.am' found for any configure output
automake: Did you forget AC_CONFIG_FILES([Makefile]) in configure.ac?
 哦,不行,還要install-sh,missing文件,錯誤信息中,還提到AC_CONFIG_FILES([Makefile]),是的,咱們還要修改一下configure.ac,在最後一行AC_OUTPUT前面增長一行:
 AC_CONFIG_FILES([Makefile])
 如今再執行一次automake吧,可是咱們要加一個參數:
 $automake --add-missing
 configure.ac: installing `./install-sh'
 configure.ac: installing `./missing'
 Makefile.am: installing `./INSTALL'
 Makefile.am: required file `./NEWS' not found
 Makefile.am: required file `./README' not found
 Makefile.am: required file `./AUTHORS' not found
 Makefile.am: required file `./ChangeLog' not found
 Makefile.am: installing `./COPYING'
 configure.ac:8: required file `config.h.in' not found小程序

 

前面缺的四個文件簡單,咱們按照本身的狀況編輯保存便可,config.h.in從哪裏來呢? 如今讓咱們把config.h.in搞出來,這個要用到autoheader,咱們執行命令:
 $autoheader
 config.h.in文件就生成好了。準備好了其它幾個文本文件,咱們再執行一次,此次不用加參數了,不過咱們還要再執行一次autoconf,由於咱們修改了configure.ac以後尚未執行過autoconf。
 $autoconf
 $automake
 咱們再執行一次./configure:
 $./configure
 ...
 config.status: creating Makefile
 config.status: creating config.h
 ...
 讓咱們執行一下make吧。
 $make
 ...
 /home/nevernew/sqrt/sqrt.c:7: undefined reference to `sqrt'
 ...
 是由於咱們沒有把數學庫加入連接,修改Makefile.am,將對應行修改成:
 sqrt_LDADD = $(LIBOBJS) -lm
 更新一下文件:
 $autoconf
 $automake
 $./configure
 $make
 $./sqrt學習

 

http://blog.chinaunix.net/uid-26133817-id-4281323.htmlui

相關文章
相關標籤/搜索