AutoTools 使用方法示例


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

我們用個小程序作例子,計算一個整數的開方,建個工作目錄:sqrt。程序很簡單:
#include<stdio.h>
#include<math.h>
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], [[email protected]])
參數的意思一目瞭然,不羅嗦了。接下來將文件另存爲: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

以後的路,可以自己走了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章