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安装成功。