久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    使用autoconf、automake等來制作一個以源代碼形式(.tar.gz)發(fā)布的軟件

     天邢者 2011-06-27
    本文教你如何使用autoconf、automake等來制作一個以源代碼形式(.tar.gz)發(fā)布的軟件、并可在執(zhí)行configure時使用自定義參數(shù)。
    一、概述和基礎知識

      在Linux下得到一個以源代碼形式發(fā)布的包(一般為.tar.gz或.tar.bz2格式),我們可以用 ./confiugure、make、make install來編譯安裝,其中在運行./configure的時候還可以根據(jù)自己的需要加入不同的參數(shù)(可用./configure --help來查看參數(shù)表)。

      先說說執(zhí)行./configure后會生成什么東西?運行后系統(tǒng)會根據(jù)用戶的實際情況生成config.h和多個Makefile。其中Makefile是運行make時所用的模板;而config.h則會以宏(Marco)的形式記錄用戶的自定義參數(shù),編譯器可以根據(jù)config.h來對源代碼進行預編譯(pre-compile),從而生成個性化的執(zhí)行檔。


    二、我們的“軟件”

      現(xiàn)在我們可以動手設計一個自己的“軟件”了,為了更切合實際,將使用多個源程序,首先建立一個目錄tt,用來放我們的東西,然后在tt下建立一個src目錄,一般來說源代碼都放在src中(好像已經成為一個不成文的規(guī)矩了:P)。整體架構如下:
      <tt>
       |-configure.in
       |-Makefile.am
       |-acconfig.h
       |-<src>
         |-tt.c
         |-qq.c
         |-qq.h
         |-Makefile.am

    ※說明:
    1. configure.in 這是最重要的文檔,整個安裝過程都靠它來主導。
    2. Makefile.am automake會根據(jù)它來生成Makefile.in,再由./configure 把Makefile.in變成最終的Makefile,一般來說在頂級目錄和各個子目錄都應該有一個Makefile.am
    3. acconfig.h autoheader會根據(jù)它來生成config.h.in,再由./configure 把config.h.in變成最終的config.h
    4. tt.c qq.c qq.h 這是我們的源程序。

    ※源代碼內容:

    tt.c

    #include <stdio.h>
    #include <qq.h>

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    int main(void)
    {
    int a = 23;

    printf( "Hello, I am teacher(%d), pls tell me your names!\n", a );

    #ifdef POPO
    printf("My name is PoPo!\n");
    #endif

    qq();

    return 0;
    }



    qq.c

    #include <stdio.h>
    #include <qq.h>

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    void qq(void)
    {
    printf("My name is QQ\n");

    #ifdef POPO
    printf("QQ: Hey PoPo, long time no see.\n");
    #endif
    }



    qq.h

    #ifndef __QQ__
    #define __QQ__

    void qq(void);

    #endif




    ※運行流程:
     1. 首先老師來點名。
     2. 如果PoPo有來的話,將會報出自己的名字。
     3. 接著輪到QQ報到,如果PoPo有來的話,QQ會向PoPo問好。

      顯然易見,PoPo是否出席,完全取決于POPO這個宏(Macro)有否被定義,我們只要在編譯前決定要不要定義它,就能實現(xiàn)不同的效果。

      如果config.h存在的話,編譯時Makefile會把宏HAVE_CONFIG_H傳給編譯器,所以如果沒有定義HAVE_CONFIG_H 的話,我們的程序不應該把config.h include進去。


    三、制作流程

    請按照以下的執(zhí)行順序一步一步做:

    第一步 編寫configure.in

      生成configure.in的方法有兩個,一個是自己從零開始寫,另一個方法是用autoscan,執(zhí)行autoscan后會生成configure.scan,其中包含了一些模板內容,使用時只要把名字改成.in就可以。

      configure.in中使用的命令有兩種,一種是以AC開頭,表示是由autoconf提供,另一種是以AM開頭,代表由automake提供。

      在configure.in我們可以完成很多檢測動作,比如檢查編譯所需的程式、頭文件、庫等等,總之功能是十分強大,不過我們這里只檢測了編譯器和頭文件,詳細用法請看 GNU Manuals Online

      以"dnl"為首的行為注釋行(代碼中綠色部份)。


    configure.in

    dnl 初始化autoconf,參數(shù)為入口函數(shù)所在的文件
    AC_INIT(src/tt.c)

    dnl 初始化automake,參數(shù)為軟件名稱及版本號
    AM_INIT_AUTOMAKE(tt, 0.1.0)

    dnl 告訴automake我們所用的配置文件,一般為config.h
    AM_CONFIG_HEADER(config.h)

    dnl 這里是實現(xiàn)自定義參數(shù)的部份,見下面的說明
    AC_ARG_ENABLE(popo, [ --enable-popo PoPo is present],,enable_popo=no)
    if test "$enable_popo" = yes ; then
    echo "PoPo is here!"
    AC_DEFINE(POPO)
    else
    echo "PoPo isn't here!"
    fi

    dnl 檢測編譯器
    AC_PROG_CC

    dnl 檢測Standard C的頭文件
    AC_HEADER_STDC

    dnl 輸出文件,一般來說頂級目錄和各子目錄都應有Makefile輸出
    AC_OUTPUT(Makefile src/Makefile)




      ./configure的自定義參數(shù)有兩種,一種是開關式(--enable-XXX或--disable-XXX),另一種是開放式,即后面要填入一串字符(--with-XXX=yyyy)參數(shù)。
      上述代碼中用的是開關式,第一個參數(shù)是參數(shù)名,第二個是說明(執(zhí)行"./configure --help"后所顯示出來的內容),最后一個參數(shù)是默認值。一般來說默認值和用戶提示應該是互斥的,即默認值是no的話,應提示用戶用enable進行修改,反之亦然。
      從上面的代碼中可以看到,如果$enable_popo為yes的話,就用AC_DEFINE來定義POPO這個宏(Macro),否則就不定義,我們在這里所使用到的宏,一定要在acconfig.h中聲明。

    第二步 運行aclocal 在tt目錄下運行aclocal,將會生成aclocal.m4。

    第三步 編寫acconfig.h

      在configure.in中使用到的宏(Macro),都應該在這個文件聲明,一般用#undef來聲明。

    acconfig.h

    #undef POPO




    第四步 運行autoheader

      運行autoheader后會根據(jù)configure.in、acconfig.h和系統(tǒng)預設的acconfig.h來生成config.h.in。

    第五步 編寫Makefile.am

      一般來說,在頂級目錄和各子目錄都應有一個Makefile.am。


    Makefile

    AUTOMAKE_OPTIONS = foreign
    SUBDIRS = src



      第一行是告訴automake不要檢測目錄中是否存在AUTHORS、README等文件。
      第二行是告訴automake處理src這個子目錄。


    src/Makefile

    AUTOMAKE_OPTIONS = foreign
    bin_PROGRAMS = tt
    tt_SOURCES = tt.c qq.c qq.h



      第一行作用同前。
      第二行是目標執(zhí)行檔的名稱。
      第三行是生成tt這個執(zhí)行檔所需的所有源程序和頭文件名稱。

    第六步 運行automake

      接著可以執(zhí)行automake了,在命令行下輸入
        automake -a 和
        automake -a src/Makefile
      使用"automake -a"或"automake --add-missing",會自動將install.sh、mkinstalldirs等文件補齊,否則會出錯,切記!

    第七步 運行autoconf

      最后,可以執(zhí)行autoconf了,完成后將會生成最終的configure!


    四、編譯&測試

      用默認值編譯:
    [root@chiosoft tt]# ./configure
    Checking for ......
    PoPo isn't here!
    Checking for ......

    [root@chiosoft tt]# make
    ......

    [root@chiosoft tt]# src/tt
    Hello, I am teacher(23), pls tell me your names!
    My name is QQ



      默認狀態(tài)下,我們沒有定義宏POPO,所以./configure時輸出"PoPo isn't here!",運行時也只有QQ來報到。

      再看看這個:
    [root@chiosoft tt]# ./configure --help
    ......
    --enable and --with options recognized:
     --enable-popo PoPo is present

    [root@chiosoft tt]# ./configure --enable-popo
    Checking for ......
    PoPo is here!
    Checking for ......

    [root@chiosoft tt]# make
    ......

    [root@chiosoft tt]# src/tt
    Hello, I am teacher(23), pls tell me your names!
    My name is PoPo!
    My name is QQ
    QQ: Hey PoPo, long time no see.



      可以看到./configure時輸出"PoPo is here!",執(zhí)行結果也完全不一樣!

      此外,我們也可以用make install來安裝,預設是安裝至/usr/local/bin下,當然,這些都是可以修改的。


    五、生成發(fā)布包tarball

      好了,至今為止,我們的小軟件已經測試完畢,可以發(fā)布了,在tt下有很多文件,有的是我們自己寫的,也有些是編譯時生成的臨時檔案,到底哪些需要打包到發(fā)行包中呢?當然你可以自己一個一個文件挑選,但用automake生成的Makefile提供了幾個極方便的功能給我們。

      我們可以用make dist或make distcheck來生成相應的tarball,其中后者還會幫我們測試發(fā)布包能否正常工作,所以個人推薦使用make distcheck。

      看到了吧?發(fā)布包tt-0.1.0.tar.gz已經放到tt下了,有沒有留意,這里用的軟件名及版本號正是 configure.in中AM_INIT_AUTOMAKE所帶的兩個參數(shù)!現(xiàn)在你可以試試把它解壓安裝了。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日日躁夜夜躁狠狠躁超碰97| 精品无码久久久久成人漫画| 国产在线午夜不卡精品影院| 午夜免费国产体验区免费的| 又粗又黑又大的吊AV| 久久天天躁狠狠躁夜夜婷| 人妻丰满熟AV无码区HD| 亚洲精品香蕉一区二区| 日韩国产精品无码一区二区三区 | 婷婷色香五月综合缴缴情香蕉| 国产AV无码专区亚洲AV潘金链| 在线看片无码永久免费视频| 日韩在线视频线观看一区| 久久超碰97人人做人人爱| 无码专区 人妻系列 在线| 亚洲AV日韩精品久久久久久久| 人妻少妇偷人无码视频| 欧美人妻在线一区二区| 老司机67194精品线观看| 少妇扒开毛茸茸的B自慰| 午夜DY888国产精品影院| 中文字幕在线观看| 欧美肥老太牲交大战| 国自产偷精品不卡在线| 国产在线亚州精品内射| 老师扒下内裤让我爽了一夜| 日日摸夜夜添夜夜添无| 亚洲国产成人综合精品| 日本公与熄乱理在线播放| 人妻中文字幕精品一页| 欧美黑人又大又粗XXXXX| 5D肉蒲团之性战奶水欧美| 欧美人与动人物牲交免费观看久久| 国产精品VA在线观看丝瓜影院| 亚洲精品国自产拍在线观看| 国产亚洲999精品AA片在线爽| 四虎在线播放亚洲成人| 午夜男女爽爽爽影院在线视频| 嫩草成人AV影院在线观看| 国产国产午夜福利视频| 中文无码熟妇人妻AV在线 |