2007-02-04

用 checkinstall 替代 make install

現在使用 GNU/LINUX 是幸福的,不像從前,要安裝某個軟體時,幾乎都要自行下載原始程式(source),再自行編譯。

不過即使號稱最 friendly 的 UBUNTU 來說,如果碰到以下情況,也只有自行下載原始程式編譯了。

1. 程式在 UBUNTU 的套件庫中沒洧收錄
2. 雖然在在 UBUNTU 中有收錄,但版本太舊,不符使用

先談談一般的編譯方式。

● 編譯程式三步曲

自行編譯程式時,也有所謂的三步曲,想先強調的是,這些步驟不是絕對的。在下載一個原始檔時,請先參考一下所附的 README,或是 INSTALL 說明,一般在這些檔案內都有相關的編譯資訊。在作者網站上也會有一些編譯資料,不妨先參考一下。

當我們取得原始檔案時,大多是一個 tarball(使用 tar 加上 gzip 或是 bzip2 壓縮過的檔案),我們必需先使用 tar xzvf(解 gzip 檔)或是 tar xjvf(解 bzip2 檔),解開壓縮檔會產生一個目錄,我們必需進入這個目錄完成編譯。

所謂的編譯三步曲,就是:

① ./configure

目的是檢查一些相關的依附檔案,像是一些 library、含入檔之類的。如果出錯的話,會顯示在過程中的最後面。

比較難掌握的是由於一些 library 在各個 GNU/LINUX 套件有著不同的名字,碰到這個問題,我的經驗是使用:

# apt-cache search [關鍵字]

來查詢這些缺少的東東,一一加上後,直到無錯誤為止。

另外碰到的一個問題是,常發現顯示缺少的 library,在系統中明明有安裝啊,這時不妨裝上和該 "套件同名-dev" 的套件,這些 *-dev 的套件提供一些編譯時需要的東東。

一個很大的問題,就是套件的版本相沖的問題,舉個例子來說,這個軟體需要的某個套件版本假設是 1.5 版,而系統內所附的是 1.3 版。當然我們可更新這個版本,但在系統內有一些程式需用到這個 1.3 版(無法用 1.5 版,會出槌),這樣就很麻煩了也就沒辦法了。

在 configure 時,我們可使用 configure --help 來看一下可以加上那些參數,諸如一些最佳化、安裝目錄、或是 debug 等的特殊目的。

個人深深覺得,configure 是這 "編譯三步曲" 中最困難的部份,而且狀況很多,無法在短短篇幅中說明完整,唯有不斷的嘗試及經驗的累積,才能找出其中的問題所在。

② make

一般來說,只要通過 ./configure 後,make 就沒什麼大問題了,make 主要目的是編譯出一些目標檔(object) 及執行檔。

③ sudo make install

這個步驟是將 make 後產生的東東,安裝到相關的目錄,並設定好一些項目。

由於要將一些相關的檔案放在某些特定目錄中,因此必需使用 sudo,也就是 root 的權限,這點和 configure 及 make 不同。

另外,除非自行指定,否則產生的可執行檔都是放在 /usr/local/bin/ 中,個人建議在 configure 時不要去改這個項目,因為這種作法,可很清楚的分別出我們自行編譯、安裝的程式所在之處。

● 用 checkinstall 替代 make

前述的三步曲有以下的問題(以 UBUNTU 來說):

① 如何解除安裝呢?
有些原始程式會提供 make uninstall 的方式來解除安裝,但不一定有這個功能,因此安裝了太多自行編譯的程式後,如何解除安裝就是一個大問題了。

② 軟體移植到別台的問題
辛辛苦苦好不容易編譯完成的程式如果要在別台電腦安裝呢,是不是要重新編譯呢?

於是 checkinstall 就派上用場了。這個套件在 ubuntu 中有收錄,請自行安裝。

使用 checkinstall 來替代以上的 make install,可有效避免上說的兩個問題,同時 checkinstall 支援產生 deb、RPM 及 slakeware 的安裝包。

在安裝完 checkinstall 後,會產生 /etc/checkinstallrc 這個設定檔,我們可設定一些內容以符所需,或是在 sudo checkinstall [軟體] 時加上一些參數,如:

# [編譯的軟體目錄] sudo checkinstall -D --install=no

-D 表示產生 deb 包,而 --install=no 表示不要自動安裝,如果沒這個參數,當 checkinstall 完時,內定會自動安裝。

● 實例說明

medit 是一個跨平台的文字編輯器,使用起來和 gedit 有點給它類似。

首先到以下網址下載 tarball,目前最新版本是 0.8.2:

http://sourceforge.net/project/showfiles.php?group_id=167563

① 解壓縮

# tar xjvf medit-0.8.2.tar.bz2

我們可看一下 INSTALL 這個檔案,了解編譯的方式及注意事項,或是看以下網址的 installation 說明:

http://mooedit.sourceforge.net/installation.html

② configure 及 make

# cd medit-0.8.2
# ./configure

在 configure 時如果發生錯誤,請依訊息處理,如裝一些依附的套件(由於每人已裝的套件不同,所以情況有所不同)。

直到沒 configure 錯誤後,make

# make

③ 使用 checkinstall 替代 make install

# sudo checkinstall -D --install=no

在 UBUNTU 上安裝 checkinstall,內定是產生 deb 包,所以 -D 參數可以省略,使用 --install=no,表示不要自動安裝,我們可以使用所產生的 deb 包自行安裝。

以下是執行時的部份抓圖,一般我們直接按 enter 使用內定值。

figure 1


figure 2


下圖是執行完 sudo checkinstall 後的畫面,會產生一個 .deb 包,我們可使用:

# sudo gnome-open medit_0.8.2-1_i386.deb

來安裝這個包。

figure 3


④ 修改 /etc/checkinstallrc

# sudo gedit /etc/checkinstallrc

這個設定檔很簡單,除了在執行 checkinstall 時可使用參數外,可設定一些項目以符所需,以下是個人覺得較重要的部份:

1. INSTYPE="D"
產生 deb 包

2. INSTALL=0
是否自動安裝,0 表示 no,1 代表 yes

其它的部份,自行參考一下。

● 參考資料

man checkinstall

沒有留言 :

張貼留言