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 軟體包。
結束