在Linux系統下開發一個較大的項目,徹底手動創建Makefile是一件費力而又容易出錯的工做。autotools系列工具只需用戶輸入簡單的目標文件、依賴文件、文件目錄等就能夠比較輕鬆地生成Makefile了。linux
這極大地簡化了Makefile的編寫和維護,做者也是剛體驗到其威力,因此將其過程記錄下來。centos
本文以一個簡單的hello.c文件進行驗證。工具
首先須要安裝autotools系列工具,包括aclocal、autoscan、automake、autoheader、autoconf等。ui
若是在centos或redhat系統下能夠經過rpm –qa | grep auto來查看各個應用程序,若是沒有,直接yum install automake便可安裝。this
autoscan #掃面當前目錄、源文件,生成configure.scan文件 aclocal #根據configure.in生成aclocal.m4文件以及autom4te.cache文件夾 autoconf #根據configure.in和aclocal.m4來產生configure文件 autoheader #生成配置頭文件的模板config.h.in touch README NEWS AUTHORS ChangeLog #生成一些聲明性文件 automake --add-missing #生成Makefiel.in和所須要的腳本
make make install make clean make dist #製做發佈的軟件包 make distcheck #檢驗完整性並製做軟件包
將生成configure.scan和autoscan.log文件,它會在給定目錄及其子目錄樹中檢查源文件,若沒有給定目錄,就在當前目錄及其子目錄樹中進行檢查。它會搜索源文件以尋找通常的移植性問題而且建立一個文件configure.scan,經過這個文件咱們能夠建立autoconf須要的模版文件。spa
[root@lzv6 hello]# ls hello.c [root@lzv6 hello]# autoscan [root@lzv6 hello]# ls autoscan.log configure.scan hello.c
mv configure.scan configure.in #將上步生成的configure.scan更改成autoconf須要的文件模版configure.in
在configure.in中增長如下內容:.net
AC_INIT([hello], [0.1], [lizhenghn@gmail.com]) AM_INIT_AUTOMAKE(hello,1.0) AC_PROG_CXX AC_PROG_LIBTOOL AC_CONFIG_FILES(Makefile)
修改後的configure.in內容以下:debug
1 # -*- Autoconf -*- 2 # Process this file with autoconf to produce a configure script. 3 4 AC_PREREQ([2.63]) 5 AC_INIT([hello], [0.1], [lizhenghn@gmail.com]) #用來定義軟件的名字、版本,以及郵箱地址信息 6 #AC_INIT([hello], [0.1]) 7 AM_INIT_AUTOMAKE(hello,0.1) #必須添加此行,描述了要生成的軟件包的名字及其版本號 8 AC_CONFIG_SRCDIR([hello.c]) #用來偵測所指定的源碼文件是否存在 9 AC_CONFIG_HEADERS([config.h]) 10 11 # Checks for programs. 12 AC_PROG_CC #檢測系統所用的C編譯器 13 AC_PROG_CXX 14 15 # Checks for libraries. 16 #AC_PROG_RANLIB #須要須要靜態庫 17 AC_PROG_LIBTOOL #若是須要動態庫 18 19 # Checks for header files. 20 21 # Checks for typedefs, structures, and compiler characteristics. 22 23 # Checks for library functions. 24 AC_CONFIG_FILES(Makefile) 25 AC_OUTPUT
configure.in 裏面包含了一系列的宏命令,運行aclocal的目的是把工程須要的宏命令展開。aclocal.m4 就是configure.in中用到的宏定義。本步會生成aclocal.m4文件和autom4te.cache文件夾。code
[root@lzv6 hello]# aclocal [root@lzv6 hello]# ls aclocal.m4 autom4te.cache autoscan.log configure.in hello.c
生成配置頭文件的模板config.h.in文件。blog
[root@lzv6 hello]# autoheader [root@lzv6 hello]# ls aclocal.m4 autom4te.cache autoscan.log config.h.in configure.in hello.c
此處建立一些聲明性,但非必須的文件,文件內容能夠暫時都爲空。
[root@lzv6 hello]# touch README NEWS AUTHORS ChangeLog
[root@lzv6 hello]# autoconf [root@lzv6 hello]# ls aclocal.m4 AUTHORS autom4te.cache autoscan.log ChangeLog config.h.in configure configure.in hello.c NEWS README
以下是一個簡單的Makefile.am
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=hello hello_SOURCES=hello.c
說明:AUTOMAKE_OPTIONS爲設置automake的選項。automake提供了3種軟件等級:foreign、gnu、gnits,默認等級是gnu。此處使用的foreign表示只是檢測必要的文件。
bin_PROGRAMS定義了要產生的執行文件名。若是產生多個可執行文件,每一個文件名用空格隔開。
file_SOURCES定義file這個執行程序的依賴文件。一樣的,對於多個執行文件,那就要定義相應的file_SOURCES。
生成Makefiel.in和所須要的腳本,其中add-missing選項會讓automake自動添加一些必須的腳本文件。
[root@lzv6 hello]# automake --add-missing configure.in:16: installing `./config.guess' configure.in:16: installing `./config.sub' configure.in:7: installing `./install-sh' configure.in:16: required file `./ltmain.sh' not found configure.in:7: installing `./missing' Makefile.am: installing `./depcomp' [root@lzv6 hello]# libtoolize --automake --copy --debug --force #注意此處步驟!!! [root@lzv6 hello]# automake --add-missing [root@lzv6 hello]# ls aclocal.m4 autom4te.cache ChangeLog config.h.in configure depcomp install-sh Makefile.am missing README AUTHORS autoscan.log config.guess config.sub configure.in hello.c ltmain.sh Makefile.in NEWS
說明:第一次運行時報錯,此時運行命令libtoolize --automake --copy --debug --force便可解決。
至此該工程的Makefile就配置完成了。
在之後的使用中進行編譯時能夠直接運行命令:
[root@lzv6 hello]# ./configure [root@lzv6 hello]# make [root@lzv6 hello]# make install #默認安裝在/usr/local/bin/
[root@lzv6 hello]# make dist #打包,會在當前目前下生成hello-0.1.tar.gz
當你增長代碼文件時,其實主須要修改Makefile.am便可,這裏就再也不詳述了。
這裏附上一張整個步驟的流程圖:
http://www.ibm.com/developerworks/cn/linux/l-makefile/