技术收藏之linux RPM 打包流程
-
- 一、RPM 打包准备
- 二、编辑 SPEC 文件
- 三、运行 RPMBUILD 命令完成打包
一、RPM 打包准备
1.因为打RPM包需要 rpmbuild 命令,所以需要先安装 rpmbuild 相应工具,安装过程可在网上查找;
2.输入命令 rpmbuild xx.spec 即可在自动当前用户的 $HOME 目录下创建 RPM 相关的文件夹,也可手动创建;
复制代码
1 2 3 4 5 6 7 8 9 10 | 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 文件如下所示:
1 2 | [xxx@localhost rpmbuild]$ rpmdev-newspec xxx.spec xxx.spec created; type minimal, rpm version >= 4.12. |
2.将 SPEC 文件放在 ~rpmbuild/SPECS/ 下面,然后编辑 SPEC 文件,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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} (虚拟根目录)目录,如下所示:
1 2 | rm -rf $RPM_BUILD_ROOT cp -rf xxx $RPM_BUILD_ROOT |
%files阶段-列出被打包的文件和目录
首先要设定默认权限,同时要列出打包的目录和文件,设定默认权限的命令如下:
%defattr(<文件权限>, <用户>, <用户组>, <目录权限>)
第 4 个参数通常会省略。常规用法为 %defattr(-,root,root,-),其中 “-” 表示默认权限。
在列出文件的目录时,尽量使用内建宏来代替目录名,常用的内建宏如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | %{<!-- -->_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 [email protected] - Release
- Update log1
- Fri Aug 7 2020 - Your Name [email protected] - Release
- Update log2
三、运行 RPMBUILD 命令完成打包
在 SPEC 目录下执行 rpmbuild -xx xxx.spec 命令完成打包,rpmbuild 命令选项如下所示:
1 2 3 4 5 6 7 8 | #rpmbuild -bp 预处理 -bc 编译 -bi 编译并安装 -bl 检验文件是否齐全 -ba 编译后做成*.rpm和src.rpm -bb 编译后做成*.rpm -bs 只做成*.src.rpm |