2.7 构建二进制RPM包

实际上,我们在构建二进制RPM包时,有两种构建方法。

·从源码构建SRPM,然后再构建二进制RPM;

·直接从源码构建二进制RPM。

然而,在软件开发中,我们通常会采用第一种方法,因为它有以下优势。

·便于保留RPM版本的确切来源(以Name-Version-Release格式标注)。这对于debug非常有用。

·需要在不同的处理器硬件平台上使用SRPM构建二进制RPM。

由于篇幅有限,本文只展示从源码构建SRPM、再从SRPM构建二进制RPM的步骤。

2.7.1 构建Source RPM和二进制RPM

下面我们演示如何通过源码和刚修改的SPEC文件构建Source RPM并在构建时指定-bs参数(如果使用-bb参数,就直接生成二进制RPM),以便生成SRPM,如图2-19所示。

图2-19 构建SRPM

首先,我们基于SRPM生成二进制RPM,执行过程如下所示。


# rpmbuild --rebuild ~/rpmbuild/SRPMS/bello-0.1-1.el7.src.rpm
Installing /root/rpmbuild/SRPMS/bello-0.1-1.el7.src.rpm
warning: bogus date in %changelog: Tue Jun 29 2019 DavidWei - 0.1-1
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.hNMkOC
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf bello-0.1
+ /usr/bin/tar -xf -
+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/bello-0.1.tar.gz
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd bello-0.1
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.0isn4Y
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd bello-0.1
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.epoHml
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
++ dirname /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
+ cd bello-0.1
+ mkdir -p /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/bin
+ install -m 0755 bello /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/bin/bello
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /root/rpmbuild/BUILD/bello-0.1
/usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 0 CRC32s did match.
+ '[' noarch = noarch ']'
+ case "${QA_CHECK_RPATHS:-}" in
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: bello-0.1-1.el7.noarch
Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.hV1l1H
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd bello-0.1
+ LICENSEDIR=/root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/share/licenses/bello-0.1
+ export LICENSEDIR
+ /usr/bin/mkdir -p /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/share/licenses/bello-0.1
+ cp -pr LICENSE /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64/usr/share/licenses/bello-0.1
+ exit 0
Provides: bello = 0.1-1.el7
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/bash
Checking for unpackaged file(s): /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
Wrote: /root/rpmbuild/RPMS/noarch/bello-0.1-1.el7.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.PCJIAr
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd bello-0.1
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/bello-0.1-1.el7.x86_64
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.ift0pO
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf bello-0.1
+ exit 0

二进制RPM构建成功后,可以在~/rpmbuild/RPMS/中找到生成的二进制RPM bello-0.1-1.el7.noarch.rpm,如图2-20所示。

图2-20 查看生成的二进制RPM

通过SRPM构建成二进制RPM后,源码会被自动删除。如果想恢复源码,需要安装SRPM,如图2-21所示。

图2-21 安装SRPM并查看源代码

现在我们检查生成的二进制RPM的正确性并进行安装。

2.7.2 检查并安装RPM包

使用rpmlint命令可以检查二进制RPM、SRPM和SPEC文件的正确性。我们以bello.spec为例进行检查。


# rpmlint bello.spec
bello.spec: E: specfile-error warning: bogus date in %changelog: Tue Jun 29 2019 David-Wei - 0.1-1
0 packages and 1 specfiles checked; 1 errors, 0 warnings.

从bello.spec的检查结果中,发现一个error。根据具体报错描述信息,我们需要检查SRPM。


# rpmlint ~/rpmbuild/SRPMS/bello-0.1-1.el7.src.rpm
bello.src: W: invalid-url URL: https://www.example.com/bello HTTP Error 404: Not Found
bello.src: E: specfile-error warning: bogus date in %changelog: Tue Jun 29 2019 DavidWei - 0.1-1
1 packages and 0 specfiles checked; 1 errors, 1 warnings.

从检查SRPM的结果可以看出,报错的原因是URL(https://www.example.com/bello)无法访问。修改SEPC,将地址设置为可访问地址,如图2-22所示。

图2-22 修改SPEC设置URL为可访问地址

修改成功后重新编译,重新验证二进制RPM正确性,error数量为0,如图2-23所示。

图2-23 验证二进制RPM的正确性

最后,安装编译好的RPM包并进行验证,如图2-24所示。

图2-24 安装二进制RPM包并执行程序

我们看到,图2-24中执行bello程序成功,证明RPM安装成功。