linux安裝配置CONFIGURE詳解

tar.gz、tar.bz2的是源代碼包,需要編譯之後才能安裝,在編譯過程中你可以指定各種參數以適應你的系統需求,比如安裝位置,優化參數,要哪些功能不要哪些功能等等。
這類源代碼包需要解壓後(tar.gz的用 tar zxvf 解壓,tar.bz2的用 tar jxvf 解壓),進入解壓目錄,一般都有一個 INSTALL 的文本文件,裏面一般都是安裝的詳細說明,可以用vi、nano、pico或X下面的文本編輯器(如gedit,gvim,kedit等)打開查看,安裝一般就是三個步驟:

    1configure,這一步一般用來生成 Makefile,爲下一步的編譯做準備,你可以通過在 configure 後加上參數來對安裝進行控制,比如
代碼:
 
./configure --prefix=/usr

    上面的意思是將該軟件安裝在 /usr 下面,執行文件就會安裝在 /usr/bin (而不是默認的 /usr/local/bin),資源文件就會安裝在 /usr/share(而不是默認的/usr/local/share)。同時一些軟件的配置文件你可以通過指定 --sys-config= 參數進行設定。有一些軟件還可以加上 --with、--enable、--without、--disable 等等參數對編譯加以控制,你可以通過允許 ./configure --help 察看詳細的說明幫助。

    2make ,這一步就是編譯,大多數的源代碼包都經過這一步進行編譯(當然有些perl或python編寫的軟件需要調用perl或python來進行編譯)。如果在 make 過程中出現 error ,你就要記下錯誤代碼(注意不僅僅是最後一行),然後你可以向開發者提交 bugreport(一般在 INSTALL 裏有提交地址),或者你的系統少了一些依賴庫等,這些需要自己仔細研究錯誤代碼。

    3make install,這條命令來進行安裝(當然有些軟件需要先運行 make check 或 make test 來進行一些測試),這一步一般需要你有 root 權限(因爲要向系統寫入文件)。

    安裝完畢後你就可以刪除解壓目錄了。採用源代碼編譯方式來安裝軟件是 Linux 系統下最常見的安裝軟件方法,而且這種方法使你可以更加自由地控制安裝細節,所以提倡大家多使用該方法安裝軟件。


轉自:http://blog.chinaunix.net/uid-24704319-id-2594460.html

本文教你如何使用autoconf、automake等來製作一個以源代碼形式(.tar.gz)發佈的軟件、並可在執行configure時使用自定義參數。

一、概述和基礎知識

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

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

二、我們的“軟件”

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

※說明:
1. configure.in 這是最重要的文檔,整個安裝過程都靠它來主導。
2. Makefile.am automake會根據它來生成Makefile.in,再由./configure 把Makefile.in變成最終的Makefile,一般來說在頂級目錄和各個子目錄都應該有一個Makefile.am
3. acconfig.h autoheader會根據它來生成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)有否被定義,我們只要在編譯前決定要不要定義它,就能實現不同的效果。

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

三、製作流程

請按照以下的執行順序一步一步做:

第一步 編寫configure.in

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

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

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

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

configure.in
dnl 初始化autoconf,參數爲入口函數所在的文件  
AC_INIT(src/tt.c)  
  
dnl 初始化automake,參數爲軟件名稱及版本號  
AM_INIT_AUTOMAKE(tt, 1.0)  
  
dnl 告訴automake我們所用的配置文件,一般爲config.h  
AM_CONFIG_HEADER(config.h)  
  
dnl 這裏是實現自定義參數的部份,見下面的說明  
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的自定義參數有兩種,一種是開關式(--enable-XXX或--disable-XXX),另一種是開放式,即後面要填入一串字符(--with-XXX=yyyy)參數。
  上述代碼中用的是開關式,第一個參數是參數名,第二個是說明(執行"./configure --help"後所顯示出來的內容),最後一個參數是默認值。一般來說默認值和用戶提示應該是互斥的,即默認值是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後會根據configure.in、acconfig.h和系統預設的acconfig.h來生成config.h.in。

第五步 編寫Makefile.am

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

Makefile.am

    AUTOMAKE_OPTIONS = foreign  
    SUBDIRS = src   

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

src/Makefile.am

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

第六步 運行automake

  接著可以執行automake了,在命令行下輸入

  1. automake -a 和 automake -a src/Makefile 

  使用"automake -a"或"automake --add-missing",會自動將install.sh、mkinstalldirs等文件補齊,否則會出錯,切記!

第七步 運行autoconf

  最後,可以執行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

  默認狀態下,我們沒有定義宏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!",執行結果也完全不一樣!

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

五、生成發佈包tarball

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

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

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

附上操作命令:

  1. aclocal   
  2. autoheader  
  3. automake  
  4. automake -a 和 automake -a src/Makefile  
  5. autoconf  
  1. ./configure  
  2. make   
  3. src/tt  
  4. ./configure --help  
  5.   
  6. ./configure --enable-popo  
  7. make   
  8. src/tt  
  9. make distcheck  

源碼下載:











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章