Checkinstall 是一個能從 tar.gz 類的原始碼自動產生 RPM/Debian 或Slackware 安裝包的程式。通過 CheckInstall,你就能用幾乎所有的 tar.gz 類的原始碼來產生“乾淨”的安裝或者卸載包。
引言
經常出現這樣的問題:很想試用的程式只有原始碼(比如 tar.gz )可用,沒人提供 RPM 或者Debian 包。你只好下載原始碼,解壓,然後手動編譯。到目前為止,一切正常。然而,當你想刪除它的時候呢?
Makefile 檔案只包括了很少情況下的卸載常式。當然,你可以把程式安裝到臨時檔案夾,然後記下所有由程式產生或修改的檔案,最後刪除他們。但是如果這個程式要經常重新編譯,這樣做是非常痛苦的,工作量也相當大。Felipe Eduardo 所寫的 CheckInstall 就是用來解決這個問題的。
用 GNU Autoconf 安裝程式
一般說來,我們編譯安裝一個由 GNU Autoconf 配置的程式是採用如下的步驟:
./configure && make && make install |
這個 configure 指令檔是用來“猜”出一系列系統相關的變數,這些變數是在後面的編譯過程要用到的。它將檢查系統變數值是否滿足編譯要求,然後使用這些變數在程式包內每個檔案夾下產生 Makefile。此外,configure 指令碼還會產生其它檔案:
- 每個檔案夾/子檔案夾下的一個或多個 Makefile(s)
- 一個名叫 config.status 的指令碼
- 一個文字檔 config.log
Configure 指令檔成功運行之後, 你會輸入 make 來編譯器,得到你需要的可執行檔。如果 make 成功的完成,你可以使用 make install 來安裝這個程式。
用 CheckInstall 安裝程式
上節我們採用 GNU Autoconf 來編譯器,現在該是換一種方式的時候了。你可以使用CheckInstall 工具。它採用自己的指令 checkinstall 來代替 make install。其他兩個指令保留下來跟以前一樣,因此,現在這個指令序列使用 CheckInstall 變成:
./configure && make && checkinstall |
指令 checkinstall 不僅預設運行了 make install,而且還監測所有安裝過程中的寫操作。為此,CheckInstall 使用了 Pancrazio de Mauro 所寫的程式 Installwatch。在 make install 成功完成之後,CheckInstall 會產生一個 Slackware-,Debian- 或RPM- 安裝包,然後按照軟體包的預設配置來安裝程式,並在目前的目錄(或標準安裝包儲存目錄)留下一個產生的安裝包。你可以通過修改變數 PAK_DIR 來修改這個儲存目錄。
CheckInstall 並不只是使用 make install,它還可以與其他安裝指令相協調。例如,如果安裝指令為 setup.sh,那麼安裝指令序列變成:
./configure && make && checkinstall setup.sh |
我們還可以讓 CheckInstall 帶著很多參數運行。
圖 1. 運行命令“checkinstall –h”顯示所有可用的子參數
這些子參數大致分為:
- 安裝選項(Install options)
- 指令碼處理選項(Scripting options)
- 資訊顯示選項(Info display options)
- 安裝包選項(Package tuning options)
- 清除選項(Cleanup options)
- 關於 CheckInstall (About CheckInstall)。
如果 CheckInstall 帶著這些參數運行,它會使用這些參數值來代替設定檔 checkinstallrc 中相應的值。
CheckInstall 也有自己的局限之處。它不能處理靜態串連的程式,因為這樣 Installwatch 就不能監測到安裝過程中修改過檔案了。總體說來,有兩類串連庫:動態和靜態。這些串連庫通過 include 指令整合到程式中。靜態串連過的程式已經包含了所有需要的庫檔案,運行時也就不需要再將這些庫載入記憶體中。這種程式與安裝在系統中的串連庫無關,因為所謂的連接器(Linker)已經在編譯時間把這些庫內建到可執行程式裡了。
CheckInstall 的安裝
我們可以在 CheckInstall 的首頁上下載各種先行編譯好的安裝包或者合適的源碼包。下面將展示安裝最新的原始碼 checkinstall-1.6.1.tgz 的全過程。這會安裝上 CheckInstall、Installwatch和 makepak,其中 makepak 是 makepkg 的修改版。如果你對新版本的改進感興趣,請參看Release Notes 和 Changelog。
清單 1. 產生 checkinstall 的 rpm 安裝包
# tar xzf checkinstall-1.6.1.tgz# cd checkinstall-1.6.1checkinstall-1.6.1# makecheckinstall-1.6.1# make installcheckinstall-1.6.1# checkinstall |
圖 2. 運行命令“checkinstall”產生 rpm 包的圖示過程
圖 2.1. 過程一
圖 2.2. 過程二
圖 2.3. 過程三
checkinstall-1.6.1 的 rpm 包已經產生,我們用 rpm 來安裝它。
清單 2. 用產生的 rpm 包安裝 checkinstall
checkinstall-1.6.1# cd /usr/src/redhat/RPMS/i386/i386# rpm -i checkinstall-1.6.1.rpm |
checkinstall-1.6.1 安裝完畢。使用包管理程式的查詢語句,你可以檢查安裝包中檔案是否完全在程式庫中記錄了,還可以查看安裝包頭部的一些額外資訊。
圖 3. 檢查 checkinstall 的 RPM 包
CheckInstall 的配置
你可以通過修改設定檔 /usr/local/lib/checkinstall/checkinstallrc 來改變 CheckInstall 的預設配置。
檔案值得注意的變數有 INSTYPE,INSTALL 和 PAK_DIR。
INSTYPE 變數決定產生何種類型安裝包。
圖 4. 查看變數 INSTYPE
PAK_DIR 變數決定安裝包的儲存目錄。
圖 5. 查看變數 PAK_DIR
INSTALL 變數決定是只產生安裝包還是一起將這個包馬上安裝。
0-只產生安裝包
1-不僅產生安裝包,還將包立即安裝
圖 6. 查看變數 INSTALL
用 CheckInstall 製作 RPM 包執行個體
上兩節我們把 Checkinstall 安裝配置完成,這節以 squid-2.6.STABLE12.tar.bz2 為例,說明用checkinstall 製作編譯成 squid-2.6.STABLE12-1.i386.rpm 包的具體方法。
清單 3. 產生 squid-2.6.STABLE12 的 rpm 安裝包
# tar jxvf squid-2.6.STABLE12.tar.bz2 # cd squid-2.6.STABLE12 squid-2.6.STABLE12# ./configure --prefix=/usr/local/squid --sysconfdir=/etc /--enable-arp-acl --enable-linux-netfilter -enable-err-language="Simplify_Chinese" /--enable-storeio=ufs --enable-default-err-language="Simplify_Chinese" /--enable-auth="basic" --enable-baisc-auth-helpers="NCSA" --enable-underscore squid-2.6.STABLE12# makesquid-2.6.STABLE12# checkinstall |
產生 rpm 包期間會出現一些選項,選擇預設的即可。
圖 7. 運行命令“checkinstall”產生 rpm 包的圖示過程
圖 7.1. 過程一
圖 7.2. 過程二
圖 7.3. 過程三
圖 7.4. 過程四
清單 4. 用產生的 rpm 包安裝 squid-2.6.STABLE12
squid-2.6.STABLE12# cd /usr/src/redhat/RPMS/i386/i386# rpm -ivh squid-2.6.STABLE12-1.i386.rpm |
圖 8. 檢查 squid-2.6.STABLE12 的 RPM 包
結束
CheckInstall 是一款優秀的源碼安裝軟體,它使得 Linux 軟體管理更加方便。特別是在源碼需要經常重複編譯的情況下,CheckInstall 可以讓你絲毫不破壞系統一致性的前提下完全的卸載程式。而且,你還可以使用這些編譯好的安裝包直接在其他的機器上安裝無須再重新編譯。