停止 rpmbuild 重写 Requires MVCE

问题描述

我正在从 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

流程是:

  • 创建一个 sdist 并将其放在 SOURCES (%{_sourcedir}) 下
  • 致电rpmbuild -bb <path-to.spec>

规范文件内容如下:

%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: 部分。我已经尝试过:

  • %undefine __pythondist_requires
  • setup.py --quiet egg_info --egg-base /tmp sdist

一切都无济于事。

如何让 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

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

$ 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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...