首页 > 解决方案 > 停止 rpmbuild 重写需要

问题描述

我正在从 Python 包构建二进制 RPM。该包使用自定义.spec文件,这是一个硬性要求。(python setup.py bdist_rpm根本不够灵活。)

例如,.spec文件的片段如下所示:

%else
%if 0%{?rhel} >= 7

BuildRequires: python2-devel
BuildRequires: python-setuptools

Requires: python(abi) = 2.7
Requires: python2-boto >= 2.5.0
Requires: python2-cryptography < 3

该过程是:

规范文件的内容如下所示:

%prep
%setup -q -n %{name}-%{unmangled_version}

%build
%if %{with_python2}
%py2_build
%endif
%if %{with_python3}
%py3_build
%endif

%install
%if %{with_python2}
%{__python2} setup.py install --single-version-externally-managed -O1 --root=%{buildroot} --record=INSTALLED_FILES
%endif
%if %{with_python3}
%{__python3} setup.py install --single-version-externally-managed -O1 --root=%{buildroot} --record=INSTALLED_FILES
%endif

为简化起见,我们可以忘记条件检查,只指定一个无条件要求:

Requires: PyYAML

问题出在rpmbuild某处将其破坏Requires:为一组完全不同的要求。

$ rpm -qp --requires /root/rpmbuild/RPMS/noarch/path-to-project3.0.0-1.noarch.rpm
/bin/bash
/usr/bin/env
/usr/bin/python
/usr/bin/python2
python(abi) = 2.7
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PartialHardlinkSets) <= 4.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1

要求明显PyYAML缺失。

构建发生在 CentOS 7 Docker 容器上,无论我尝试什么,我都无法单独rpmbuild留下这些部分。Requires:我尝试过:

一切都无济于事。

我如何才能rpmbuild忠实于实际.spec文件?


MVCE

我在https://github.com/bsolomon1124/test-so-7954504建立了一个 MVCE 项目。那里的自述文件包含完整的重现说明,也显示在此处:

克隆项目。

运行容器:

docker container run -it --rm --volume "$(pwd)":/io --workdir /io --entrypoint bash centos:7

设置并构建将被放入的 RPM dist/

$ yum update -y
$ yum install -y make
$ make setup_build
$ make rpm

检查要求,看到.spec文件中的那些被忽略:

[root@xxxxxx io]# rpm -qp --requires dist/myproj-0.1-1.noarch.rpm
python(abi) = 2.7
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PartialHardlinkSets) <= 4.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1

标签: pythonrpmrhelrpmbuild

解决方案


推荐阅读