automake,autoconf使用詳解

做爲Linux下的程序開發人員,你們必定都遇到過Makefile,用make命令來編譯本身寫的程序確實是很方便.通常狀況下,你們都是手工寫一個簡單Makefile,若是要想寫出一個符合自由軟件慣例的Makefile就不那麼容易了.前端

在本文中,將給你們介紹如何使用autoconf和automake兩個工具來幫助咱們自動地生成符合自由軟件慣例的 Makefile,這樣就能夠象常見的 GNU程序同樣,只要使用」./configure」,」make」,」make instal」就能夠把程序安裝到Linux系統中去了.shell

這將特別適合想作開放源代碼軟件的程序開發人員,又或若是你只是本身寫些小的Toy程序,那麼這個文章對你也會有很大的幫助.
 編輯器

一.Makefile介紹

  Makefile是用於自動編譯和連接的 ,一個工程有不少文件組成,每個文件的改變都會致使工程的從新連接,可是不是 全部的文件都須要從新編譯,Makefile中紀錄有文件的信息,在 make時會決定在連接的時候須要從新編譯哪些文件.
 
  Makefile的宗旨就是 :讓編譯器知道要編譯一個文件須要依賴其餘的 哪些文件.當那些依賴文件有了改變,編譯器會自動的發現最終的生成文件已通過時,而從新編譯相應的 模塊.
  
Makefile的 基本結構不是 很複雜,但當一個程序開發人員開始寫Makefile時,常常會懷疑本身寫的 是 否符合慣例,並且本身寫的 Makefile常常和本身的 開發環境相關聯,當系統環境變量或路徑發生了變化後,Makefile可能還要跟着修改.這樣就形成了手工書寫Makefile的 諸多問題,automake剛好能很好地幫助咱們解決這些問題.
  
使用automake,程序開發人員只須要寫一些簡單的 含有預約義宏的 文件,由autoconf根據一個宏文件生成configure,由automake根據另外一個宏文件生成Makefile.in,再使用configure依據Makefile.in來生成一個符合慣例的 Makefile.下面咱們將詳細介紹Makefile的 automake生成方法.
  函數

二.使用的 環境

  本文所提到的 程序是 基於Linux發行版本:Fedora Core release 1,它包含了咱們要用到的 autoconf,automake.工具

  

三.從helloworld入手

  咱們從你們最常使用的 例子程序helloworld開始.測試

  下面的 過程若是簡單地說來就是 :ui

  新建三個文件:this

 
  1.    helloworld.c
  2.    configure.in
  3.    Makefile.am

  而後執行:spa

 
  1. aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld

  就能夠看到Makefile被產生出來,並且能夠將helloworld.c編譯經過.操作系統

  很簡單吧,幾條命令就能夠作出一個符合慣例的 Makefile,感受如何呀.

  如今 開始介紹詳細的 過程:

  1.建目錄

  在 你的 工做目錄下建一個helloworld目錄,咱們用它來存放helloworld程序及相關文件,如在 /home/my/build下:

 
  1. $ mkdir helloword
  2. $ cd helloworld

  2. helloworld.c

  而後用你本身最喜歡的 編輯器寫一個hellowrold.c文件,如命令:vi helloworld.c.使用下面的 代碼做爲helloworld.c的 內容.

 
  1. #include <stdio.h>
  2. int main(int argc, char** argv){
  3.      printf("%s", 'Hello, Linux World!\n");
  4.      return 0;
  5. }

  完成後保存退出.
  如今 在 helloworld目錄下就應該有一個你本身寫的 helloworld.c了.

  3.生成configure

  咱們使用autoscan命令來幫助咱們根據目錄下的 源代碼生成一個configure.in的 模板文件.
  命令:

 
  1. $ autoscan
  2. $ ls
  3. configure.scan helloworld.c

  執行後在 hellowrold目錄下會生成一個文件:configure.scan,咱們能夠拿它做爲configure.in的 藍本.
  如今 將configure.scan更名爲configure.in,而且編輯它,按下面的 內容修改,去掉無關的 語句:

 
  1. ==========================configure.in內容開始=========================================
  2. # -*- Autoconf -*-
  3. # Process this file with autoconf to produce a configure script.
  4. AC_INIT(helloworld.c)
  5. AM_INIT_AUTOMAKE(helloworld, 1.0)
  6. # Checks for programs.
  7. AC_PROG_CC
  8. # Checks for libraries.
  9. # Checks for header files.
  10. # Checks for typedefs, structures, and compiler characteristics.
  11. # Checks for library functions.
  12. AC_OUTPUT(Makefile)
  13. ==========================configure.in內容結束=========================================

  而後執行命令aclocal和autoconf,分別會產生aclocal.m4及configure兩個文件:

 
  1. $ aclocal
  2. $ls
  3. aclocal.m4 configure.in helloworld.c
  4. $ autoconf
  5. $ ls
  6. aclocal.m4 autom4te.cache configure configure.in helloworld.c

  你們能夠看到configure.in內容是 一些宏定義,這些宏經autoconf處理後會變成檢查系統特性.環境變量.軟件必須的 參數的 shell腳本.

  autoconf 是 用來生成自動配置軟件源代碼腳本(configure)的 工具.configure腳本能獨立於autoconf運行,且在 運行的 過程當中,不須要用戶的 干預.

  要生成configure文件,你必須告訴autoconf如何找到你所用的 宏.方式是 使用aclocal程序來生成你的 aclocal.m4.

  aclocal根據configure.in文件的 內容,自動生成aclocal.m4文件.aclocal是 一個perl 腳本程序,它的 定義是 :」aclocal – create aclocal.m4 by scanning configure.ac」.

  autoconf從configure.in這個列舉編譯軟件時所須要各類參數的 模板文件中建立configure.

  autoconf須要GNU m4宏處理器來處理aclocal.m4,生成configure腳本.

  m4是 一個宏處理器.將輸入拷貝到輸出,同時將宏展開.宏能夠是 內嵌的 ,也能夠是 用戶定義的 .除了能夠展開宏,m4還有一些內建的 函數,用來引用文件,執行命令,整數運算,文本操做,循環等.m4既能夠做爲編譯器的 前端,也能夠單獨做爲一個宏處理器.

4.新建Makefile.am
  新建Makefile.am文件,命令:

 
  1. $ vi Makefile.am
  2.   內容以下:
  3. AUTOMAKE_OPTIONS=foreign
  4. bin_PROGRAMS=helloworld
  5. helloworld_SOURCES=helloworld.c

  automake會根據你寫的 Makefile.am來自動生成Makefile.in.

  Makefile.am中定義的 宏和目標,會指導automake生成指定的 代碼.例如,宏bin_PROGRAMS將致使編譯和鏈接的 目標被生成.
  5.運行automake:

 
  1. $ automake --add-missing
  2. configure.in: installing `./install-sh'
  3. configure.in: installing `./mkinstalldirs'
  4. configure.in: installing `./missing'
  5. Makefile.am: installing `./depcomp'

  automake會根據Makefile.am文件產生一些文件,包含最重要的 Makefile.in.

  6.執行configure生成Makefile

 
  1. $./configure
  2. checking for a BSD-compatible install... /usr/bin/install -c
  3. checking whether build environment is sane... yes
  4. checking for gawk... gawk
  5. checking whether make sets $(MAKE)... yes
  6. checking for gcc... gcc
  7. checking for C compiler default output... a.out
  8. checking whether the C compiler works... yes
  9. checking whether we are cross compiling... no
  10. checking for suffix of executables...
  11. checking for suffix of object files... o
  12. checking whether we are using the GNU C compiler... yes
  13. checking whether gcc accepts -g... yes
  14. checking for gcc option to accept ANSI C... none needed
  15. checking for style of include used by make... GNU
  16. checking dependency style of gcc... gcc3
  17. configure: creating ./config.status
  18. config.status: creating Makefile
  19. config.status: executing depfiles commands
  20. $ ls -l Makefile
  21. -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile

你能夠看到,此時Makefile已經產生出來了.

7.使用Makefile編譯代碼

 
  1. $make
  2. if gcc -DPACKAGE_NAME=\"FULL-PACKAGE-NAME\" -DPACKAGE_TARNAME=\"full-package-name\" -DPACKAGE_VERSION=\"VERSION\" -DPACKAGE_STRING=\"FULL-PACKAGE-NAME\ VERSION\" -DPACKAGE_BUGREPORT=\"BUG-REPORT-ADDRESS\" -DPACKAGE=\"helloworld\" -DVERSION=\"1.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STDLIB_H=1 -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" -c -o helloworld.o helloworld.c; \
  3. then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; else rm -f ".deps/helloworld.Tpo"; exit 1; fi
  4. gcc -g -O2 -o helloworld helloworld.o

  運行helloworld

 
  1. $ ./helloworld
  2. Hello, Linux World!

  這樣helloworld就編譯出來了,你若是按上面的 步驟來作的 話,應該也會很容易地編譯出正確的 helloworld文件.你還能夠試着使用一些其餘的 make命令,如make clean,make install,make dist,看看它們會給你什麼樣的 效果.感受如何?本身也能寫出這麼專業的 Makefile,老闆必定會對你另眼相看.

四.深刻淺出

  針對上面提到的 各個命令,咱們再作些詳細的 介紹.

  1. autoscan
  autoscan是 用來掃描源代碼目錄生成configure.scan文件的 .autoscan
能夠用目錄名作爲參數,但若是你不使用參數的 話,那麼autoscan將認爲使用的是當前目錄.
autoscan將掃描你所指定目錄中的 源文件,並建立configure.scan文件.
  2. configure.scan
  configure.scan包含了系統配置的 基本選項,裏面都是 一些宏定義.咱們須要將它更名爲
configure.in
  3. aclocal
  aclocal是 一個perl 腳本程序.aclocal根據configure.in文件的 內容
,自動生成aclocal.m4文件.aclocal的 定義是 :"aclocal - create
aclocal.m4 by scanning configure.ac".
  4. autoconf
  autoconf是 用來產生configure文件的 .configure是 一個腳本,它能設置
源程序來適應各類不一樣的操做系統平臺,而且根據不一樣的 系統來產生合適的 Makefile,從而可使
你的源代碼能在不一樣的操做系統平臺上被編譯出來.
  configure.in文件的 內容是 一些宏,這些宏通過autoconf 處理後會變成檢查系統
特性.環境變量.軟件必須的 參數的 shell腳本.configure.in文件中的 宏的 順序並沒
有規定,可是 你必須在 全部宏的 最前面和最後面分別加上AC_INIT宏和AC_OUTPUT宏.
  在 configure.ini中:
  #號表示註釋,這個宏後面的 內容將被忽略.
  AC_INIT(FILE)
  這個宏用來檢查源代碼所在 的 路徑.
AM_INIT_AUTOMAKE(PACKAGE, VERSION)
   這個宏是 必須的 ,它描述了咱們將要生成的 軟件包的 名字及其版本號:PACKAGE是軟件包
的名字,VERSION是 版本號.當你使用make dist命令時,它會給你生成一個相似
helloworld-1.0.tar.gz的 軟件發行包,其中就有對應的 軟件包的 名字和版本號.
AC_PROG_CC
  這個宏將檢查系統所用的 C編譯器.
AC_OUTPUT(FILE)
  這個宏是 咱們要輸出的 Makefile的 名字.
  咱們在 使用automake時,實際上還須要用到其餘的 一些宏,但咱們能夠用aclocal 來幫
咱們自動產生.執行aclocal後咱們會獲得aclocal.m4文件.
  產生了configure.in和aclocal.m4 兩個宏文件後,咱們就可使用autocon
f來產生configure文件了.
  5. Makefile.am
  Makefile.am是 用來生成Makefile.in的 ,須要你手工書寫.Makefile.
am中定義了一些內容:
AUTOMAKE_OPTIONS
  這個是 automake的 選項.在 執行automake時,它會檢查目錄下是 否存在 標準
GNU軟件包中應具有的各類文件,例如AUTHORS.ChangeLog.NEWS等文件.
咱們將其設置成foreign時,automake會改用通常軟件包的 標準來檢查.
bin_PROGRAMS
  這個是 指定咱們所要產生的 可執行文件的 文件名.若是你要產生多個可執行文件,
那麼在各個名字間用空格隔開.
helloworld_SOURCES
  這個是 指定產生"helloworld"時所須要的 源代碼.若是它用到了多個源文件,
那麼請使用空格符號將它們隔開.好比須要helloworld.h,helloworld.c那麼請寫成:
helloworld_SOURCES= helloworld.h helloworld.c.
  若是你在 bin_PROGRAMS定義了多個可執行文件,則對應每一個可執行文件都要定義相對的
filename_SOURCES.
  6. automake
  咱們使用automake --add-missing來產生Makefile.in.
  選項--add-missing的 定義是 "add missing standard files
 to package",它會讓automake加入一個標準的 軟件包所必須的 一些文件.
  咱們用automake產生出來的 Makefile.in文件是 符合GNU Makefile慣例
的 ,接下來咱們只要執行configure這個shell 腳本就能夠產生合適的 Makefile 文
件了.
  7. Makefile
  在 符合GNU Makefiel慣例的 Makefile中,包含了一些基本的 預先定義的 操做:

make
  根據Makefile編譯源代碼,鏈接,生成目標文件,可執行文件.
make clean
  清除上次的 make命令所產生的 object文件(後綴爲".o"的 文件)及可執行文件.
make install
  將編譯成功的 可執行文件安裝到系統目錄中,通常爲/usr/local/bin目錄.
make dist
  產生髮布軟件包文件(即distribution package).這個命令將會將可執行文件及相關
文件打包成一個tar.gz壓縮的 文件用來做爲發佈軟件的 軟件包.
  它會在 當前目錄下生成一個名字相似"PACKAGE-VERSION.tar.gz"的 文件.PA
CKAGE和VERSION,是 咱們在 configure.in中定義的 AM_INIT_AUTOM
AKE(PACKAGE, VERSION).
make distcheck
  生成發佈軟件包並對其進行測試檢查,以肯定發佈包的正確性.
相關文章
相關標籤/搜索