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結尾的文件用到的工具是targunzip,而tar.bz2結尾的文件所使用的工具是tarbzip2,之所以這樣做是因爲,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中的規則調用合適的編譯器編譯所有與當前軟件相依賴的源碼,生成所有相關的目標文件,最後再使用鏈接器生成最終的可執行程序:
  1. $ make

複製代碼

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. [root@localhost tools]# ls

  8. tar-1.23  tar-1.23.tar.bz2

  9. [root@localhost tools]# cd tar-1.23

  10. [root@localhost tar-1.23]# ls

  11. ABOUT-NLS     build-aux   configure     gnu      Makefile.am  po       src

  12. acinclude.m4  ChangeLog    configure.ac  INSTALL  Makefile.in  README   tests

  13. aclocal.m4    ChangeLog.1  COPYING       lib      Make.rules   rmt      THANKS

  14. 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. ......

  5. [root@localhost tar-1.23]# echo $?

  6. 0

複製代碼
建立軟件安裝目錄,並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中存在installuninstall標號
  1. [root@localhost tar-1.23]#make

  2. ......

  3. [root@localhost tar-1.23]#echo &?

  4. 0

複製代碼
make成功
  1. [root@localhost tar-1.23]#make install

  2. ......

  3. [root@localhost tar-1.23]# ls /root/tar

  4. bin  libexec  sbin  share

  5. [root@localhost tar]# cd /root/tar/bin

  6. [root@localhost bin]# ls

  7. tar

  8. [root@localhost bin]# ./tar --help

  9. ......

  10. [root@localhost tar-1.23]#echo &?

  11. 0

複製代碼
安裝並簡單測試成功


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