加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 3.6  使用autotools
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

Linux下C編程基礎(chǔ)之:使用autotools

2013/09/13
閱讀需 24 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

?

3.6??使用autotools

在上一小節(jié),讀者已經(jīng)了解到了make項目管理器的強大功能。的確,makefile可以幫助make完成它的使命,但要承認的是,編寫makefile確實不是一件輕松的事,尤其對于一個較大的項目而言更是如此。那么,有沒有一種輕松的手段生成makefile而同時又能讓用戶享受make的優(yōu)越性呢?本節(jié)要講的autotools系列工具正是為此而設(shè)的,它只需用戶輸入簡單的目標文件、依賴文件、文件目錄等就可以輕松地生成makefile了,這無疑是廣大用戶所希望的。另外,這些工具還可以完成系統(tǒng)配置信息的收集,從而可以方便地處理各種移植性的問題。也正是基于此,現(xiàn)在Linux上的軟件開發(fā)一般都用autotools來制作makefile,讀者在后面的講述中就會了解到。

3.6.1??autotools使用流程

正如前面所言,autotools是系列工具,讀者首先要確認系統(tǒng)是否裝了以下工具(可以用which命令進行查看)。

n aclocal

n autoscan

n autoconf

n autoheader

n automake

使用autotools主要就是利用各個工具的腳本文件以生成最后的makefile。其總體流程是這樣的。

n 使用aclocal生成一個“aclocal.m4”文件,該文件主要處理本地的宏定義;

n 改寫“configure.scan”文件,并將其重命名為“configure.in”,并使用autoconf文件生成configure文件。

接下來,筆者將通過一個簡單的hello.c例子帶領(lǐng)讀者熟悉autotools生成makefile的過程,由于在這過程中會涉及較多的腳本文件,為了更清楚地了解相互之間的關(guān)系,強烈建議讀者實際動手操作以體會其整個過程。

1.a(chǎn)utoscan

它會在給定目錄及其子目錄樹中檢查源文件,若沒有給出目錄,就在當(dāng)前目錄及其子目錄樹中進行檢查。它會搜索源文件以尋找一般的移植性問題并創(chuàng)建一個文件“configure.scan”,該文件就是接下來autoconf要用到的“configure.in”原型。如下所示:

[root@localhost?automake]#?autoscan

autom4te:?configure.ac:?no?such?file?or?directory

autoscan:?/usr/bin/autom4te?failed?with?exit?status:?1

[root@localhost?automake]#?ls

autoscan.log??configure.scan??hello.c

由上述代碼可知autoscan首先會嘗試去讀入“configure.ac”(同configure.in的配置文件)文件,此時還沒有創(chuàng)建該配置文件,于是它會自動生成一個“configure.in”的原型文件“configure.scan”。

2.a(chǎn)utoconf

configure.in是autoconf的腳本配置文件,它的原型文件“configure.scan”如下所示:

#???????????????????????????????????????????????-*-?Autoconf?-*-

#?Process?this?file?with?autoconf?to?produce?a?configure?script.

AC_PREREQ(2.59)

#The?next?one?is?modified?by?david

#AC_INIT(FULL-PACKAGE-NAME,VERSION,BUG-REPORT-ADDRESS)

AC_INIT(hello,1.0)

#?The?next?one?is?added?by?david

AM_INIT_AUTOMAKE(hello,1.0)

AC_CONFIG_SRCDIR([hello.c])

AC_CONFIG_HEADER([config.h])

#?Checks?for?programs.

AC_PROG_CC

#?Checks?for?libraries.

#?Checks?for?header?files.

#?Checks?for?typedefs,?structures,?and?compiler?characteristics.

#?Checks?for?library?functions.

AC_CONFIG_FILES([makefile])

AC_OUTPUT

下面對這個腳本文件進行解釋。

n 以“#”號開始的行是注釋。

n AC_PREREQ宏聲明本文件要求的autoconf版本,如本例使用的版本2.59。

n AC_INIT宏用來定義軟件的名稱和版本等信息,在本例中省略了BUG-REPORT-ADDRESS,一般為作者的E-mail。

n AM_INIT_AUTOMAKE是筆者另加的,它是automake所必備的宏,使automake自動生成makefile.in,也同前面一樣,PACKAGE是所要產(chǎn)生軟件套件的名稱,VERSION是版本編號。

n AC_CONFIG_SRCDIR宏用來檢查所指定的源碼文件是否存在,以及確定源碼目錄的有效性。在此處源碼文件為當(dāng)前目錄下的hello.c。

n AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。

n AC_CONFIG_FILES宏用于生成相應(yīng)的makefile文件。

n 中間的注釋之間可以分別添加用戶測試程序、測試函數(shù)庫、測試頭文件等宏定義。

接下來首先運行aclocal,生成一個“aclocal.m4”文件,該文件主要處理本地的宏定義。如下所示:

[root@localhost?automake]#?aclocal

再接著運行autoconf,生成“configure”可執(zhí)行文件。如下所示:

[root@localhost?automake]#?autoconf

[root@localhost?automake]#?ls

aclocal.m4??autom4te.cache??autoscan.log??configure??configure.in??hello.c

3.a(chǎn)utoheader

接著使用autoheader命令,它負責(zé)生成config.h.in文件。該工具通常會從“acconfig.h”文件中復(fù)制用戶附加的符號定義,因為這里沒有附加符號定義,所以不需要創(chuàng)建“acconfig.h”文件。如下所示:

[root@localhost?automake]#?autoheader

4.a(chǎn)utomake

這一步是創(chuàng)建makefile很重要的一步,automake要用的腳本配置文件是makefile.am,用戶需要自己創(chuàng)建相應(yīng)的文件。之后,automake工具轉(zhuǎn)換成makefile.in。在該例中,筆者創(chuàng)建的文件為makefile.am,如下所示:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=?hello

hello_SOURCES=?hello.c

?

下面對該腳本文件的對應(yīng)項進行解釋。

n 其中的AUTOMAKE_OPTIONS為設(shè)置automake的選項。GNU對自己發(fā)布的軟件有嚴格的規(guī)范,比如必須附帶許可證聲明文件COPYING等,否則automake執(zhí)行時會報錯。automake提供了3種軟件等級:foreign、gnu和gnits,讓用戶選擇采用,默認等級為gnu。在本示例中采用foreign等級,它只檢測必須的文件。

n bin_PROGRAMS定義要產(chǎn)生的執(zhí)行文件名。如果要產(chǎn)生多個執(zhí)行文件,每個文件名用空格隔開。

n hello_SOURCES定義“hello”這個執(zhí)行程序所需要的原始文件。如果“hello”這個程序是由多個原始文件所產(chǎn)生的,則必須把它所用到的所有原始文件都列出來,并用空格隔開。例如:若目標體“hello”需要“hello.c”、“david.c”、“hello.h”三個依賴文件,則定義hello_SOURCES=hello.c?david.c?hello.h。要注意的是,如果要定義多個執(zhí)行文件,則對每個執(zhí)行程序都要定義相應(yīng)的file_SOURCES。

接下來可以使用automake命令來生成“configure.in”文件,在這里使用選項“-a”(或者“—adding-missing”)可以讓automake自動添加一些必需的腳本文件。如下所示:

[root@localhost?automake]#?automake?–a(或者automake?--add-missing)

configure.in:?installing?'./install-sh'

configure.in:?installing?'./missing'

makefile.am:?installing?'depcomp'

[root@localhost?automake]#?ls

aclocal.m4??????autoscan.log??configure.in??hello.c?????makefile.am??missing

autom4te.cache??configure?????depcomp????install-sh??makefile.in??config.h.in

可以看到,在automake之后就可以生成configure.in文件。

5.運行configure

在這一步中,通過運行自動配置設(shè)置文件configure,把makefile.in變成了最終的makefile。如下所示:

[root@localhost?automake]#?./configure

checking?for?a?BSD-compatible?install...?/usr/bin/install?-c

checking?whether?build?environment?is?sane...?yes

checking?for?gawk...?gawk

checking?whether?make?sets?$(MAKE)...?yes

checking?for?gcc...?gcc

checking?for?C?compiler?default?output?file?name...?a.out

checking?whether?the?C?compiler?works...?yes

checking?whether?we?are?cross?compiling...?no

checking?for?suffix?of?executables...

checking?for?suffix?of?object?files...?o

checking?whether?we?are?using?the?GNU?C?compiler...?yes

checking?whether?gcc?accepts?-g...?yes

checking?for?gcc?option?to?accept?ANSI?C...?none?needed

checking?for?style?of?include?used?by?make...?GNU

checking?dependency?style?of?gcc...?gcc3

configure:?creating?./config.status

config.status:?creating?makefile

config.status:?executing?depfiles?commands

可以看到,在運行configure時收集了系統(tǒng)的信息,用戶可以在configure命令中對其進行方便的配置。在./configure的自定義參數(shù)有兩種,一種是開關(guān)式(--enable-XXX或--disable-XXX),另一種是開放式,即后面要填入一串字符(--with-XXX=yyyy)參數(shù)。讀者可以自行嘗試其使用方法。另外,讀者可以查看同一目錄下的“config.log”文件,以方便調(diào)試之用。

到此為止,makefile就可以自動生成了?;貞浾麄€步驟,用戶不再需要定制不同的規(guī)則,而只需要輸入簡單的文件及目錄名即可,這樣就大大方便了用戶的使用。autotools生成makefile的流程如圖3.9所示。

圖3.9??autotools生成makefile的流程圖

?

3.6.2??使用autotools所生成的makefile

autotools生成的makefile除具有普通的編譯功能外,還具有以下主要功能(感興趣的讀者可以查看這個簡單的hello.c程序的makefile)。

1.make

鍵入make默認執(zhí)行“make?all”命令,即目標體為all,其執(zhí)行情況如下所示:

[root@localhost?automake]#?make

if?gcc?-DPACKAGE_NAME=""?-DPACKAGE_TARNAME=""?-DPACKAGE_VERSION=""?-DPACKAGE_STRING=""?-DPACKAGE_BUGREPORT=""?-DPACKAGE="hello"?-DVERSION="1.0"??-I.?-I.?????-g?-O2?-MT?hello.o?-MD?-MP?-MF?".deps/hello.Tpo"?-c?-o?hello.o?hello.c;?

then?mv?-f?".deps/hello.Tpo"?".deps/hello.Po";?else?rm?-f?".deps/hello.Tpo";?exit?1;?fi

gcc??-g?-O2???-o?hello??hello.o

此時在本目錄下就生成了可執(zhí)行文件“hello”,運行“./hello”能出現(xiàn)正常結(jié)果,如下所示:

[root@localhost?automake]#?./hello

Hello!Autoconf!

2.make?install

此時,會把該程序安裝到系統(tǒng)目錄中去,如下所示:

[root@localhost?automake]#?make?install

if?gcc?-DPACKAGE_NAME=""?-DPACKAGE_TARNAME=""?-DPACKAGE_VERSION=""?-DPACKAGE_STRING=""?-DPACKAGE_BUGREPORT=""?-DPACKAGE="hello"?-DVERSION="1.0"??-I.?-I.?????-g?-O2?-MT?hello.o?-MD?-MP?-MF?".deps/hello.Tpo"?-c?-o?hello.o?hello.c;?

then?mv?-f?".deps/hello.Tpo"?".deps/hello.Po";?else?rm?-f?".deps/hello.Tpo";?exit?1;?fi

gcc??-g?-O2???-o?hello??hello.o

make[1]:?Entering?directory?'/root/workplace/automake'

test?-z?"/usr/local/bin"?||?mkdir?-p?--?"/usr/local/bin"

??/usr/bin/install?-c?'hello'?'/usr/local/bin/hello'

make[1]:?Nothing?to?be?done?for?'install-data-am'.

make[1]:?Leaving?directory?'/root/workplace/automake'

此時,若直接運行hello,也能出現(xiàn)正確結(jié)果,如下所示:

[root@localhost?automake]#?hello

Hello!Autoconf!

3.make?clean

此時,make會清除之前所編譯的可執(zhí)行文件及目標文件(object?file,?*.o),如下所示:

[root@localhost?automake]#?make?clean

test?-z?"hello"?||?rm?-f?hello

rm?-f?*.o

4.make?dist

此時,make將程序和相關(guān)的文檔打包為一個壓縮文檔以供發(fā)布,如下所示:

[root@localhost?automake]#?make?dist

[root@localhost?automake]#?ls?hello-1.0-tar.gz

hello-1.0-tar.gz

可見該命令生成了一個hello-1.0-tar.gz壓縮文件。

由上面的講述讀者不難看出,autotools是軟件維護與發(fā)布的必備工具,鑒于此,如今GUN的軟件一般都是由automake來制作的。

想一想

對于automake制作的這類軟件,應(yīng)如何安裝呢?

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

華清遠見(www.farsight.com.cn)是國內(nèi)領(lǐng)先嵌入師培訓(xùn)機構(gòu),2004年注冊于中國北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營分公司。華清遠見除提供嵌入式相關(guān)的長期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負責(zé)嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實驗平臺的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開出版70余本嵌入式/移動開發(fā)/物聯(lián)網(wǎng)相關(guān)圖書。企業(yè)理念:專業(yè)始于專注 卓識源于遠見。企業(yè)價值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。