autotools工具的使用

    近期項目開發中,因文件較多,後來就改用了autotools來構建整個工程,免去手寫Makefile的麻煩,在此記錄一下autotools工具的使用。
linux

    autotools是一系列工具,它包含了autoscan, aclocal, autoheader, automake, autoconf這些工具。使用流程以下:
shell

    上述圖片是從https://www.ibm.com/developerworks/cn/linux/l-makefile/ 截取的,圖片已經把流程說的很清楚了,本身就懶得去畫了。工具

    使用autotools工具來構建整個工程,最終的目的是可讓咱們在編譯代碼的時候,能夠很方便的執行以下的步驟便可:code

./configure 
make && sudo make install

    在實際的項目構建過程當中,須要咱們編寫的就是Makefile.am文件,而後就是對configure.scan文件進行修改。其餘的步驟只須要執行相應的命令便可。對象

    1. 修改configure.scan文件:遞歸

    1) 修改AC_INIT宏
圖片

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

    把上述的宏中的內容按照本身的項目須要修改便可,如:
開發

AC_INIT(hello, 0.1, wenhaoye@126.com)

    2) 增長AM_INIT_AUTOMAKE宏, 此宏是給automake工具使用的get

AM_INIT_AUTOMAKE(hello, 0.1)

    2.  把configure.scan文件重命名爲configure.in編譯

    3. 編寫Makefile.am文件。咱們要在這個文件中說明咱們須要編譯的目標對象,以及目標對象的依賴和編譯連接參數。能夠認爲這個文件上面須要編寫的東西,大部分也是咱們要在Makefile中定義的。

    先以一個最簡單的hello工程來講明,hello工程的目錄結構以下:

hello
    -- src
        -- hello.c

    首先在src目錄中添加Makefile.am文件,內容以下:

bin_PROGRAMS=hello
hello_SOURCES=hello.c

    而後在項目的頂層目錄下創建Makefile.am,即在hello目錄下,內容以下:

AUTOMAKE_OPTIONS=foreign
SUBDIRS=src

    

    1) bin_PROGRAMS: 定義咱們須要生成的可執行目標,能夠有多個,用空格分開。

    2) xxx_SOURCES: 定義要生成xxx目標須要的源文件,有多個源文件時,用空格分開。

    3) SUBDIRS: 定義項目子模塊的目錄,若是有多個子目錄,用空格分開。表示在處理本目錄前,要遞歸處理哪些子目錄。

    4) AUTOMAKE_OPTIONS: 這個而是automake的選項,在執行automake時,它會去檢測目錄下是否存在標準gnu軟件包中應具有的各類文件,如AUTHORS, README, NEWS, ChangeLog等文件。在此我將其設置爲foreign,automake會改用通常軟件包的標準來檢查。默認就是按照標準gnu軟件包檢查。

    在Makefile中,咱們能夠經過修改CFLAGS, LDFLAGS變量來配置編譯與連接選項,那麼在Makefile,am中,也是能夠配置的,好比咱們上述的hello目標在編譯的時候須要定義DEBUG宏,在連接的時候須要連接pthread庫,能夠這樣子修改src/Makefile.am文件:

bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_CFLAGS= -DDEBUG
hello_LDFLAGS= -lpthread

    若是咱們須要把代碼編譯成庫文件,在Makefile.am文件中定義以下:

lib_LTLIBRARIES=libutils.la
libutils_la_SOURCES= $(libutils_sources)
libutils_la_CFLAGS=-Wall -DDEBUG
libutils_la_LDFLAGS=-lpthread -lrt
libutils_HEADERS=$(libutils_inc)
libutilsdir=$(includedir)/libutils

    libutils使咱們要編譯的庫,其中la表示同時生成動態庫與靜態庫,a則表示只生成靜態庫。

    後面就是分別制定要生成libutils.la目標,依賴的源文件,編譯與連接選項,以及須要安裝的頭文件

    libutils_HEADERS: 表示須要安裝的頭文件

    xxdir: 表示頭文件被安裝的路徑

    此外,還須要修改configure.in文件,增長AC_PROG_LIBTOOL,用來檢查libtool腳本,由於要使用libtool工具來製做、安裝庫。


    Makefile.am文件還有以下可用的全局變量:

    1) INCLUDES: 編譯時須要用到的頭文件,

    2) LDFLAGS: 連接時須要用到的庫文件選項標誌

    3) LDADD: 連接時須要用到的庫


下面把autotools使用的一些步驟進行說明:

  1. 若是咱們須要配置頭文件的模塊config.h.in文件,則須要在aclocal命令完成後,使用autoheader來生成;

  2. 若是咱們須要libtool來製做庫文件,則須要在autoconf以前執行libtoolize --force --copy,生成libtool所須要的文件。這個命令主要功能是生成ltmain.sh,而ltmain,sh是用來產生libtool腳本的。

  3. 執行automake生成Makefile.in文件時,須要automake -a, 這樣子能夠創建須要的腳本。

  4. 在執行configure腳本時,能夠經過--disable-static配置不生成靜態庫,或者--disable-shared配置不生成動態庫。

  5. 最後咱們能夠make checkdist 或者make dist來生成一個發佈軟件包。

相關文章
相關標籤/搜索