在 CentOS 下設置一個建立 RPM 的環境
這份文件會指引你如何在 CentOS 下安裝及設定一個用來建立 RPM(及重建 SRPM)的環境。
切勿以 root 的身份來建立 RPM。這個工作應該永遠在一個沒有特殊權限的戶口內進行。以 root 的身份來建立 RPM 可能會損壞你的系統。已經預先警告過你了。
1. 檢查你已經安裝了 rpmbuild
首先,你應該檢查 rpmbuild 是否已經被安裝在你的系統上。你將會利用這個工具從 spec 檔案或 SRPM 套件建立 RPM。要檢查它是否被安裝了,請執行 rpmbuild --showrc 這個指令。它將會顯示一大組數據,把 rpmbuild 所採用的建立環境的細節列明。這對偵測 .spec 檔在做甚麼頗有用。
假若系統輸出:$ rpmbuild: command not found,便意味著 rpmbuild 未被安裝。你可以用 root 身份執行下列指令,透過 yum 來安裝它:
[root@host ~]# yum install rpm-build
由於化身為 root 來執行指令只會在 bash 日誌檔內留下記錄,大部份小心的管理員都會設定及利用 sudo 來執行此工作:
[userid@hostname ~]# sudo yum install rpm-build
註:基於過往慣例,含有 /usr/bin/rpmbuild 的套件名叫 rpm-build(留意套件名稱內有一個 "-" 號)。
請檢查 yum 所安裝的清單內包含了某個版本的 rpm-build 套件,然後回答 "y" 批准 yum 繼續進行套件的安裝。
當 yum 完成後,再次執行 rpmbuild --showrc 或輸出較少的 rpmbuild --version 指令來檢查它已經安裝妥當。
大部份以 CentOS 作為重建目標的 SRPM 亦需要特定的 rpmbuild 建立巨集及輔助腳本,它們都收錄在 redhat-rpm-config 套件內。要穫得所需的結果,你必須按照上述方法進行安裝,並替代此套件名稱。你可以透過 yum 用下列指令來安裝 redhat-rpm-config:
[userid@hostname ~]# sudo yum install redhat-rpm-config
註:這個套件或許已被安裝。要是這樣,yum 只會在最後一行輸出顯示 Nothing to do.。你可以用 rpm -q redhat-rpm-config 這個指令來檢查套件(在此要檢查 redhat-rpm-config)是否已被安裝。如果你看見任何輸出,那便代表套件已經存在。rpm 指令的輸出亦會包含安裝在你系統上的軟件的版本及發行資訊。
2. 新增目錄讓你能在主目錄內建立 RPM
當你安裝好 rpmbuild 後,下一步便是將建立 RPM 時所需的檔案及目錄新增到你的主目錄內。好上文所提及,為避免系統程式庫或其它檔案受損,你永遠不應以 root 身份建立 RPM。你應利用一個沒有特殊權限的戶口來進行這項工作。
要以沒有特殊權限的用戶來建立 RPM,你必須為此新增一個目錄架構,然後在你的主目錄內建立一個 .rpmmacros 檔,在當中指定以新建立的目錄取代預設的 RPM 建立目錄。
下面的指引會在你的主目錄內新增一個 rpmbuild 作建立 RPM 之用。如果你想採用另一個目錄,你必須按你的用途修改下列指引。請閱讀外部參考材料來找出如何進行更複雜的設定。
要建立一個建立 RPM 的環境,這執行下列兩個指令:
[user@hostname ~]$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
注意:以下指令會取替可能已存在的 .rpmmacros,因此請先檢查你沒有這個檔案,然後才繼續。
[user@host ~]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
當你執行完以上兩個指令後,你便設置好一個不需其它設定便能建立多數 RPM 的環境。
3. 你可能需用的其它工具
一般而言,建立 RPM 等同建立及編譯軟件。要達至這個目的,你多數會需要編譯及建立源代碼套件的工具。
你很有可能需要安裝 make 來建立軟件(就算不是用 C 或其它編譯語言所寫的軟件亦會在安裝過程中採用 Makefile)。一如上文:
[userid@hostname ~]# sudo yum install make
如果你要替那些以 C 寫成的軟件建立套件,你亦會需要 gcc 編譯器。
[root@host ~]# yum install gcc
某些依賴很可能亦會一併被安裝,好讓 gcc 能夠針對系統程式庫作出編譯。
如果你建立的軟件使用到系統程式庫(例如:OpenSSL),你亦會需要安裝額外的 RPM,好讓你能針對這些程式庫建立軟件。
以 OpenSSL 為例,它有兩個獨立的 RPM:openssl 及 openssl-devel。openssl RPM 套件內藏有那些連結到 openssl 的程式在執行時所需的程式庫。舉個例說,wget 的加密連線需要 OpenSSL,因此安裝 wget RPM 時,你必須先安裝 openssl RPM。
然而,編譯的代碼若採用 OpenSSL 程式庫,openssl RPM 檔並不包含所需的程式庫標頭檔。spec 檔包裝小組在設計發行版本時,分拆較少用的標頭檔是個常見的決定,目的就是要節約非開發者機器上的空間。
舉個例說,如果你下載 wget 的源代碼然後嘗試建立它,它會投訴找不到 OpenSSL 的程式庫。編譯採用 OpenSSL 的代碼所需的檔案都收錄在 openssl-devel RPM 內。因此,當你安裝了該套件、SRPM 和 spec 檔所需的其它依賴性套件後,便能編譯那些利用到 OpenSSL 程式庫標頭檔的代碼。
因此,從除錯的角度來說,當你嘗試建立一個 RPM 套件,而它輸出一個錯誤信息告訴你無法找到某某程式庫,你應該利用上述方法尋找該程式庫的 -devel 套件是否已安裝。要是它不存在,請安裝它來解決問題。這樣你便能繼續建立原先的 RPM。……或在逐一排除障礙的過程中面對下個須解決的問題。
4. 外置參考材料
mock chroot 設定及套件建立工具
Translation of revision 10