一、RPM 打包准備
1.因為打RPM包需要 rpmbuild 命令,所以需要先安裝 rpmbuild 相應工具,安裝過程可在網上查找;
2.輸入命令 rpmbuild xx.spec 即可在自動當前用戶的 $HOME 目錄下創建 RPM 相關的文件夾,也可手動創建;
1 [xx@localhost ~]$ rpmbuild xx.spec 2 錯誤:stat ~/xx.spec 失敗:沒有那個文件或目錄 3 [xx@localhost ~]$ tree ~/rpmbuild/
4 rpmbuild/
5 ├── BUILD 6 ├── BUILDROOT 7 ├── RPMS 8 ├── SOURCES 9 ├── SPECS 10 └── SRPMS
BUILD:源碼包被解壓至此,並在該目錄的子目錄完成編譯,宏為 %_builddir
BUILDROOT:保存 %install 階段安裝的文件,宏為 %_buildrootdir
RPMS:生成/保存二進制 RPM 包,宏為 %_rpmdir
SOURCES:保存源碼包(如 .tar 包)和所有 patch 補丁,宏為 %_sourcedir
SPECS:保存 RPM 包配置(.spec)文件,宏為 %_specdir
SRPMS:生成/保存源碼 RPM 包(SRPM),宏為 %_srcrpmdir
~/rpmbuild 的宏為 %_topdir
二、編輯 SPEC 文件
1.創建 SPEC 文件如下所示:
[xxx@localhost rpmbuild]$ rpmdev-newspec xxx.spec xxx.spec created; type minimal, rpm version >= 4.12.
2.將 SPEC 文件放在 ~rpmbuild/SPECS/ 下面,然后編輯 SPEC 文件,如下所示:
Name: #軟件名稱 Version: #版本號 Release: #發布編碼 Summary: #簡要說明 License: #協議版本 URL: Source0: #源碼包
%description
#描述 %prep
#預處理
%build
#編譯
%pre
#安裝前
%install #安裝
%post
#安裝后
%files #安裝的文件列表
%clean
#清理臨時文件
%preun
#卸載前
%postun
#卸載后
%changelog * Fri Aug 7 2020 -
3.安裝的各個階段說明:
%prep階段 - 預處理,主要對源代碼包進行解壓和打補丁
一般使用 %setup -c 或者 %setup -q 命令來解壓源碼包,直接會將文件解壓到%{_builddir}
%build階段 - 對源代碼包進行編譯
編譯階段,非 GNU configure 配置的程序可以不關注這個階段
%install階段 - 將軟件安裝到虛擬根目錄, 同時 Install 階段也有如下階段
%pre階段 - 安裝前
$1 == 1 代表安裝
$1 == 2 代表升級
%post階段 - 安裝后
$1 == 1 代表安裝
$1 == 2 代表升級
%preun階段 - 卸載前
$1 == 0 代表卸載
$1 == 1 代表升級
%postun階段 - 卸載后
$1 == 0 代表卸載
$1 == 1 代表升級
這個階段主要從 %{_builddir}
復制相關文件到 %{buildroot}
(虛擬根目錄)目錄,如下所示:
rm -rf $RPM_BUILD_ROOT cp -rf xxx $RPM_BUILD_ROOT
%files階段-列出被打包的文件和目錄
首先要設定默認權限,同時要列出打包的目錄和文件,設定默認權限的命令如下:
%defattr(<文件權限>, <用戶>, <用戶組>, <目錄權限>)
第 4 個參數通常會省略。常規用法為 %defattr(-,root,root,-)
,其中 “-” 表示默認權限。
在列出文件的目錄時,盡量使用內建宏來代替目錄名,常用的內建宏如下所示:
%{_sysconfdir} /etc %{_prefix} /usr %{_exec_prefix} %{_prefix} %{_bindir} %{_exec_prefix}/bin %{_lib} lib (lib64 on 64bit systems) %{_libdir} %{_exec_prefix}/%{_lib} %{_libexecdir} %{_exec_prefix}/libexec %{_sbindir} %{_exec_prefix}/sbin %{_sharedstatedir} /var/lib %{_datadir} %{_prefix}/share %{_includedir} %{_prefix}/include %{_oldincludedir} /usr/include %{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var %{_initddir} %{_sysconfdir}/rc.d/init.d %{_topdir} %{getenv:HOME}/rpmbuild %{_builddir} %{_topdir}/BUILD %{_rpmdir} %{_topdir}/RPMS %{_sourcedir} %{_topdir}/SOURCES %{_specdir} %{_topdir}/SPECS %{_srcrpmdir} %{_topdir}/SRPMS %{_buildrootdir} %{_topdir}/BUILDROOT %{_var} /var %{_tmppath} %{_var}/tmp %{_usr} /usr %{_usrsrc} %{_usr}/src %{_docdir} %{_datadir}/doc %{buildroot} %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch} $RPM_BUILD_ROOT %{buildroot}
%clean階段 - 完成后的一些清理工作
主要是清理 %{_builddir}和%{_buildrootdir}兩個目錄里的中間文件
%changelog階段 -- 主要記錄每次打包時的修改日志
%changelog * Fri Aug 7 2020 - Your Name <youremail@xxx.xxx> - Release
- Update log1
* Fri Aug 7 2020 - Your Name <youremail@xxx.xxx> - Release
- Update log2
三、運行 RPMBUILD 命令完成打包
在 SPEC 目錄下執行 rpmbuild -xx xxx.spec 命令完成打包,rpmbuild 命令選項如下所示:
#rpmbuild -bp 預處理 -bc 編譯 -bi 編譯並安裝 -bl 檢驗文件是否齊全 -ba 編譯后做成*.rpm和src.rpm -bb 編譯后做成*.rpm -bs 只做成*.src.rpm