學習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