天天看點

linux下源碼安裝軟體

在linux下的很多軟體都是通過源碼包方式釋出的,這樣做對于最終使用者而言,雖然相對于二進制軟體包,配置和編譯起來繁瑣點,但是它的可移植性卻好得多,針對不同的體系結構,軟體開發者往往僅需釋出同一份源碼包,不同的最終使用者經過編譯就可以正确運作,這也是非常符合c語言的設計哲學的,一次編寫,到處編譯麼,而常見的二進制包,比如rpm和deb,軟體開發者必須為每種特定的平台定制好專門的軟體包,這個通過rpm檔案的字尾名就可以初見端倪,比如ppc,sparc,i386之類,在這裡不做過多的陳述,其實源碼安裝軟體遠沒有很多朋友想象的那麼複雜,下面我在這裡盡可能詳細的做一些陳述,如有謬誤,歡迎朋友們拍磚!

安裝的具體步驟:

  1. $ tar zxvf XXXX.tar.gz (or tar jxvf XXXX.tar.bz2)
  2. $ cd XXXX
  3. $ ./configure
  4. $ make
  5. # make install

複制代碼

  1. $ make clean

安裝完成後用來清理臨時檔案

  1. # make uninstall

用來解除安裝軟體

解壓:

        最常見源碼包的就兩種(XXXX.tar.gz or XXXX.tar.bz2),其實這些源碼包都是由2個工具壓縮而成的,tar.gz結尾的檔案用到的工具是tar和gunzip,而tar.bz2結尾的檔案所使用的工具是tar和bzip2,之是以這樣做是因為,tar僅僅能夠打包多個檔案但是沒有壓縮的功能,而gz和bz2卻剛好相反,僅能夠壓縮單個檔案,這樣我們常見的源碼包實際上是通過tar先将不同的源檔案打包,然後再通過gunzip或者bzip2壓縮後釋出的,當然這兩個步驟可以通過一條指令實作:

  1. $ tar zcvf XXXX.tar.gz XXXX(or tar jcvf XXXX.tar.bz2 XXXX)

解壓的相關指令如下:

  1. $ tar zxvf XXXX.tar.gz
  2. $ tar jxvf XXXX.tar.bz2

./configure:

        解壓完成就正式開始安裝了(補充一點,開始configure之前,如有必要,請使用patch工具為源碼打上相應的更新檔),首先跳轉到源碼的解壓目錄,衆所周知,開始configure前還是應該仔細閱讀源碼目錄下的README或者INSTALL檔案,好多安裝中的注意事項在這裡都有所羅列,configure實際上是一個腳本檔案,在目前目錄中鍵入"./configure",shell就會運作目前目錄下的configure腳本,有一點必須說明,在整個configure過程,其實編譯尚未進行,configure僅僅是做編譯相關的準備工作,它主要對您目前的工作平台做一些依賴性檢查,比如編譯器是否安裝,連接配接器是否存在,如果在檢測的過程沒有任何錯誤,你很幸運,configure腳本會在目前目錄下生成下一步編譯連結所要用到的另一個檔案Makefile,當然configure支援及其豐富的指令行參數,可以鍵入"./configre --help"擷取具體的資訊,最常用的恐怕就是:

  1. $ ./configure --prefix=/opt/XXX

它用來設定軟體的安裝目錄. 

make:

        如果configure過程正确完成,那麼在源碼目錄,會生成相應的Makefile檔案,Makefile檔案簡單來說包括的是一組檔案依賴關系以及編譯連結的相關步驟,事實上真正的編譯連結工作也不是make所做的,make隻是一個通用的工具,一般情況下,make會根據Makefile中的規則調用合适的編譯器編譯所有與目前軟體相依賴的源碼,生成所有相關的目标檔案,最後再使用連結器生成最終的可執行程式:

make install:

        當上面兩個步驟正确完成,代表着編譯連結過程已經完全結束,最後要做的就是将可執行程式安裝到正确的位置,在這個步驟,普通使用者可能沒有相關目錄的操作權限,臨時切換到root是一個不錯的選擇,"install"隻是Makefile檔案中的一個标号,"make install"代表着make工具執行Makefile檔案中"install"标号下的所有相關操作,如果在configure階段沒有使用"--prefix=/opt/XXX"指定應用程式的安裝目錄,那麼應用程式一般會被預設安裝到/usr/local/bin,如果/usr/local/bin已經存在于您的PATH中,那麼安裝已經基本結束:

  1. #make install

make clean:

make uninstall:

        這兩個步驟隻是安裝的後續操作,有一點必須注意,"clean"和"uninstall"也是Makefile檔案中相應的兩個标号,執行這兩個步驟的時候Makefile檔案必要保留,"make clean"用來清除編譯連接配接過程中的一些臨時檔案,"make uninstall"是解除安裝相關應用程式,與make install類似,make uninstall也需要切換到root執行,不過"uninstall"标号在好多Makefile中都被省略掉了,朋友們完全可以自己在相應的Makefile檔案一探究竟.

Why?

        在這裡我嘗試着解釋一下上面這些步驟存在的理由,從C語言的角度來說,一個程式從源碼到正确生成相關的可執行檔案,下面這些部分必不可少:源檔案,編譯器,彙編器,連接配接器,依賴庫,通過上面幾個步驟,朋友們應該已經知道,真正執行編譯連結操作的步驟隻有一個(make),那其他步驟存在的理由何在?

        有一點是肯定的,我在自己的電腦上使用C語言寫一些自娛自樂的小程式,也沒有用到"configure or make install"之類的指令,頂多自己寫個Makefile管理源檔案的依賴關系,可是軟體開發者不同,他必須考慮到軟體的可移植性,他開發的軟體不能僅僅就在他自己的pc上跑吧?不同的平台可能連硬體體系結構都不同,這樣就導緻了Makefile的不可移植性,為了解決這個問題,開發者通常使用autoconf之類的工具生成相應的configure腳本,而configure腳本就是用來屏蔽相應的平台差異,進而正确生成Makefile檔案,然後make再根據configure的勞動成果(Makefile)完成編譯連結工作.        

        至于"install or clean or uninstall",也隻是對應着Makefile檔案中不同的規則,關于Makefile的詳細資訊,朋友們可以自行查閱相關的文檔.

一個例子

        下面是我在自己的pc機上源碼安裝tar工具的過程,權當做是上面這些步驟的一個具體事例吧:

  1. [root@localhost ~]# head -n 1 /etc/issue
  2. CentOS release 5.4 (Final)
  3. [root@localhost ~]# uname -sr
  4. Linux 2.6.18-164.el5
  5. [root@localhost ~]# gcc --version
  6. gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
  7. Copyright (C) 2006 Free Software Foundation, Inc.

這個是我的系統資訊。

  1. [root@localhost tools]# pwd
  2. /root/tools
  3. [root@localhost tools]# ls
  4. tar-1.23.tar.bz2
  5. [root@localhost tools]# tar jxvf tar-1.23.tar.bz2
  6. ......
  7. tar-1.23  tar-1.23.tar.bz2
  8. [root@localhost tools]# cd tar-1.23
  9. [root@localhost tar-1.23]# ls
  10. ABOUT-NLS     build-aux   configure     gnu      Makefile.am  po       src
  11. acinclude.m4  ChangeLog    configure.ac  INSTALL  Makefile.in  README   tests
  12. aclocal.m4    ChangeLog.1  COPYING       lib      Make.rules   rmt      THANKS
  13. AUTHORS       config.h.in  doc           m4       NEWS         scripts  TODO

解壓原檔案包,可以發現其中包括了configure腳本和README檔案。

  1. [root@localhost tar-1.23]# mkdir -v ~/tar
  2. mkdir: 已建立目錄 “/root/tar”
  3. [root@localhost tar-1.23]# ./configure --prefix=/root/tar
  4. [root@localhost tar-1.23]# echo $?

建立軟體安裝目錄,并configure,檢查configure傳回結果,為0代表運作成功.

  1. [root@localhost tar-1.23]# ls -F
  2. ABOUT-NLS     ChangeLog.1     configure.ac  m4/          po/       tests/
  3. acinclude.m4  config.h        COPYING       Makefile    README    THANKS
  4. aclocal.m4    config.h.in     doc/          Makefile.am  rmt/      TODO
  5. AUTHORS       config.log      gnu/          Makefile.in  scripts/
  6. build-aux/    config.status*  INSTALL       Make.rules   src/
  7. ChangeLog     configure*      lib/          NEWS         stamp-h1

可以看到Makefile檔案已經被成功建立.

  1. [root@localhost tar-1.23]# less Makefile | grep install:
  2.            || { echo "ERROR: files left after uninstall:" ; \
  3. install: install-recursive
  4. uninstall: uninstall-recursive

在建立的Makefile中存在install和uninstall标号

  1. [root@localhost tar-1.23]#make
  2. [root@localhost tar-1.23]#echo &?

make成功

  1. [root@localhost tar-1.23]#make install
  2. [root@localhost tar-1.23]# ls /root/tar
  3. bin  libexec  sbin  share
  4. [root@localhost tar]# cd /root/tar/bin
  5. [root@localhost bin]# ls
  6. tar
  7. [root@localhost bin]# ./tar --help

安裝并簡單測試成功

繼續閱讀