Linux 中 RPM 的构建与打包( 三 )


如果需要,可以添加更多的 SourceX 指令,每次递增数字,例如:Source1,Source2,Source3,依此类推Patch0应用于源代码的第一个补丁的名称 。
如果需要,可以添加更多 PatchX 指令,增加每次编号如:Patch1,Patch2,Patch3 等 。BuildArch表示 RPM 包的构建的计算机架构 。如果包不依赖于体系结构,即完全用于编写解释的编程语言,这应该是 BuildArch:noarch 。BuildRequires编译软件包所需的依赖包列表,以逗号分隔 。Requires安装软件包时所需的依赖包列表,以逗号分隔 。ExcludeArch如果某个软件无法在特定处理器架构下运行,在此进行指定 。
在运维过程中,我们经常会查看到一个 RPM 包的 Name、Version、Release 。这个字段就是在 SPEC 文件中定义的 。
例如,我们要查询 Python RPM 包版本,如下图 16 所示:
图 16. 查看 python 版本

Linux 中 RPM 的构建与打包

文章插图
 
在上图的输出中:python 是 Name、2.7.5 是 Version、58.el7 是 Release、x86_64 是 BuildArch 。这些信息都是在 SPEC 中定义的 。
接下来,我们介绍 RPM SPEC 文件中使用的语法 。
SPEC 
DirectiveDefinition%description完整描述了 RPM 中打包的软件,可以包含多行并分成段落 。%prep打包准备阶段执行一些命令%build包含构建阶段执行的命令,构建完成后便开始后续安装 。%install包含安装阶段执行的命令 。%check包含测试阶段执行的命令 。%files需要被打包/安装的文件列表 。%changelogRPM 包变更日志 。
在介绍了 SEPC 的格式和语法后,接下来我们介绍如何书写 SPEC 并构建 RPM 包 。
书写 SPEC 文件在打包新软件时,可以通过 rpmdev-newspec 工具创建一个新的 SPEC 文件,然后据此进行修改 。
首先,我们通过三个源码文件生成三个 SPEC,如下图 17 所示:
图 17. 生成 SPEC 文件
Linux 中 RPM 的构建与打包

文章插图
 
点击查看大图
.SPEC 已经生成,如下图 18 所示:
图 18.查看生成的 SPEC 文件
Linux 中 RPM 的构建与打包

文章插图
 
接下来我们为三个 SRPM 书写 SPEC,描述如下:
Software NameExplanation of examplebello基于 bash 书写的 。不需要构建但只需要安装文件 。如果是预编译的二进制文件需要打包,这种方法也可以使用,因为二进制文件也只是一个文件 。pello基于 Python 书写的软件 。用 byte-compiled 的解释编程语言编写的软件,用于演示字节编译过程的安装和安装生成的预优化文件 。cello基于 C 书写的软件 。用 natively compiled 的编程语言编写的软件,演示使用工具的常见构建和安装过程以及编译本机代码 。
由于三个 SPEC 修改的思路类似,因此我们只细致介绍 bello 的 SPEC 修改步骤 。
生成的 bello.spec 文件内容如清单 5 所示:
清单 5. 自动生成的 bello.spec# cat bello.specName:belloVersion:Release:1%{?dist}Summary:License:URL:Source0:BuildRequires:Requires:%description%prep%setup -q%build%configuremake %{?_smp_mflags}%installrm -rf $RPM_BUILD_ROOT%make_install%files%doc%changelog修改后的 bello.spec 内容如清单 6 所示:
清单 6. 修改后的 bello.spec【Linux 中 RPM 的构建与打包】[root@rpmlab-d710 ~]# cat ~/rpmbuild/SPECS/bello.specName:belloVersion:0.1Release:1%{?dist}Summary:Hello World example implemented in bash scriptLicense:GPLv3+URL:https://www.example.com/%{name}Source0:https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gzRequires:bashBuildArch:noarch%descriptionThe long-tail description for our Hello World Example implemented inbash script of DavidWei.%prep%setup -q%build%installmkdir -p %{buildroot}%{_bindir}install -m 0755 %{name} %{buildroot}%{_bindir}/%{name}%files%license LICENSE%{_bindir}/%{name}%changelog* Tue Jun 29 2019 DavidWei - 0.1-1- First bello package- Example second item in the changelog for version-release 0.1-1在修改完 SEPC 后,我们就可以根据源代码和 SPEC 文件构建软件包 。
构建二进制 RPM 包实际上,我们在构建二进制 RPM 包时,有两种构建方法:
  • 从源码构建 SRPM,然后再构建二进制 RPM
  • 直接从源码构建二进制 RPM 。
然而,在软件开发中,我们通常会采用第一种方法,因为它有以下优势:
  • 便于保留的 RPM 版本的确切来源(以 Name-Version-Release 格式标注) 。这对于 debug 非常有用 。
  • 需要在不同的处理器硬件平台上使用 SRPM 构建二进制 RPM 。
由于篇幅有限,本文只展示从源码构建 SRPM,再从 SRPM 构建二进制 RPM 的步骤 。


推荐阅读