1. 程式人生 > 其它 >RPM包的構建說明

RPM包的構建說明

rpm 的版本 <=4.4.x,rpmbuid 工具其預設的工作路徑是 /usr/src/redhat。

普通使用者不能製作 rpm 包,製作 rpm 軟體包時必須切換到 root 身份才可以。

rpm 從 4.5.x 版本開始,將 rpmbuid 的預設工作路徑移動到使用者家目錄下的 rpmbuild目錄裡

即 $HOME/rpmbuild ,並且推薦使用者在製作 rpm 軟體包時儘量不要以 root 身份進行操作。

本文所在環境:

  • RPM版本:rpm-4.11.3-32.el7.x86_64 版本。
  • CentOS 7

如果想釋出 rpm 格式的原始碼包或者是二進位制包,就要使用 rpmbuild 工具( rpm 最新打包工具)。

如果我們已經根據本地原始碼包的成功編譯安裝而寫了 spec 檔案(該檔案要以 .spec 結束)

那我們就可以建立一個打包環境,也就是目錄樹的建立,一般是在 ~/rpmbuild 目錄下建立 5 個目錄。

它門分別是:

  • BUILD:目錄用來存放打包過程中的原始檔,就是來源於 SOURCE
  • SOURCE :用來存放打包是要用到的原始檔和patch,主要是一些 tar 包
  • SPEC:用來存放 spec 檔案
  • SRPM:存放打包生成的 rpm格式的原始檔
  • RPM:二進位制檔案

SPEC 階段與目錄的對應關係#

階段 讀取的目錄 寫入的目錄 具體動作
%prep %_sourcedir %_builddir 讀取位於 %_sourcedir 目錄的原始碼和 patch 。之後,解壓原始碼至 %_builddir 的子目錄並應用所有 patch。
%build %_builddir %_builddir 編譯位於 %_builddir 構建目錄下的檔案。通過執行類似 ./configure && make 的命令實現。
%install %_builddir %_buildrootdir 讀取位於 %_builddir 構建目錄下的檔案並將其安裝至 %_buildrootdir 目錄。這些檔案就是使用者安裝 RPM 後,最終得到的檔案。注意一個奇怪的地方: 最終安裝目錄 不是 構建目錄。通過執行類似 make install 的命令實現。
%check %_builddir %_builddir 檢查軟體是否正常執行。通過執行類似 make test 的命令實現。很多軟體包都不需要此步。
bin %_buildrootdir %_rpmdir 讀取位於 %_buildrootdir 最終安裝目錄下的檔案,以便最終在 %_rpmdir 目錄下建立 RPM 包。在該目錄下,不同架構的 RPM 包會分別儲存至不同子目錄, noarch 目錄儲存適用於所有架構的 RPM 包。這些 RPM 檔案就是使用者最終安裝的 RPM 包。
src %_sourcedir %_srcrpmdir 建立原始碼 RPM 包(簡稱 SRPM,以.src.rpm 作為字尾名),並儲存至 %_srcrpmdir 目錄。SRPM 包通常用於稽核和升級軟體包。

安裝工具#

RPM打包使用的是 rpmbuild 命令,來自 rpm-build 包:

yum install -y rpm-build

也可以安裝 rpmdevtools,依賴 rpm-build,所以直接安裝會將 rpm-build 裝上:

yum install -y rpmdevtools

工具使用#

rpmbuild 命令使用一套標準化的「工作空間」 ,生成 %_topdir 工作目錄 ~/rpmbuild,以及配置檔案 ~/.rpmmacros:

rpmdev-setuptree

rpmdev-setuptree這個命令就是安裝 rpmdevtools 帶來的。可以看到運行了這個命令之後,在 $HOME 家目錄下多了一個叫做 rpmbuild 的資料夾,裡邊內容如下:

$ tree rpmbuildrpmbuild
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

rpmdev-setuptree 命令在當前使用者 home/rpmbuild 目錄裡自動建立上述目錄。

如果沒有安裝 rpmdevtools 的話,其實用 mkdir 命令建立這些資料夾也是可以的:mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}。

預設位置 巨集程式碼 名稱 用途
~/rpmbuild/SPECS %_specdir Spec 檔案目錄 儲存 RPM 包配置(.spec)檔案
~/rpmbuild/SOURCES %_sourcedir 原始碼目錄 儲存原始碼包(如 .tar 包)和所有 patch 補丁
~/rpmbuild/BUILD %_builddir 構建目錄 原始碼包被解壓至此,並在該目錄的子目錄完成編譯
~/rpmbuild/RPMS %_rpmdir 標準 RPM 包目錄 生成/儲存二進位制 RPM 包
~/rpmbuild/SRPMS %_srcrpmdir 原始碼 RPM 包目錄 生成/儲存原始碼 RPM 包(SRPM)
~/rpmbuild/BUILDROOT %_buildrootdir 最終安裝目錄 儲存 %install 階段安裝的檔案

rpmbuild 預設工作路徑的確定,通常由在 /usr/lib/rpm/macros 這個檔案裡的一個叫做 %topdir 的巨集變數來定義。如果使用者想更改這個目錄名,rpm 官方並不推薦直接更改這個目錄,而是在使用者家目錄下建立一個名為 .rpmmacros 的隱藏檔案(Linux下隱藏檔案,前面的點不能少),然後在裡面重新定義 %topdir,指向一個新的目錄名。

生成 SPEC 檔案#

最最最重要的 SPEC 檔案,命名格式一般是“軟體名-版本.spec”的形式,將其拷貝到 SPECS 目錄下。

如果系統有 rpmdevtools 工具,可以用 rpmdev-newspec -o name.spec 命令來生成 SPEC 檔案的模板

如果沒有安裝 rpmdevtools,也可以自己手動建立一個 spec 檔案。

打包命令#

rpmbuild -bp

只解壓原始碼及應用補丁-bc 只進行編譯-bi 只進行安裝到%{buildroot}-bb 只生成二進位制 rpm 包-bs 只生成原始碼 rpm 包-ba 生成二進位制 rpm 包和原始碼 rpm 包--target 指定生成 rpm 包的平臺,預設會生成 i686 和 x86_64 的 rpm 包。

rpmbuild -bb 軟體名-版本.spec 

用此命令生成軟體包,生成的檔案會在剛才建立的RPM目錄下存在。

rpmbuild-bs 軟體名-版本.spec

生成的檔案會在剛才建立的SRPM目錄下存在。

rpmbuild-ba 軟體名-版本.spec

軟體包製作完成後可用 rpm 命令查詢,看看效果。如果不滿意的話可以再次修改軟體包描述檔案,重新執行以上命令產生新的 RPM 軟體包。

結束