如果未安装 python3,则为 python2 构建 rpm

如果未安装 python3,则为 python2 构建 rpm

我想打包一个可以在 python2 和 python3 上运行的 python 应用程序,因为我们仍然有运行 python2 的旧系统。

默认应该是 python3,但如果未安装 python3。我想为 python2 构建它。不更改名称:

我已按照此处的说明进行操作:https://docs.fedoraproject.org/en-US/packaging-guidelines/Python_Appendix/#_conditionalizing_the_python_2_parts

我尝试过这个:

%global srcname example

# Disable python2 by default
%bcond_with python2

Name:           python-%{srcname}
Version:        1.2.3
Release:        1%{?dist}
Summary:        An example python module

License:        MIT
URL:            https://pypi.python.org/pypi/%{srcname}
Source0:        %pypi_source

BuildArch:      noarch

%global _description %{expand:
A python module which provides a convenient example.}

%description %_description

%if %{with python2}
%package -n python2-%{srcname}
Summary:        %{summary}
BuildRequires:  python2-devel

%description -n python2-%{srcname} %_description
%endif


%package -n python3-%{srcname}
Summary:        %{summary}
BuildRequires:  python3-devel

%description -n python3-%{srcname} %_description


%prep
%autosetup -n %{srcname}-%{version}

%build
%if %{with python2}
%py2_build
%endif
%py3_build

%install
# Must do the python2 install first because the scripts in /usr/bin are
# overwritten with every setup.py install, and in general we want the
# python3 version to be the default.
%if %{with python2}
%py2_install
%endif
%py3_install

%check
%if %{with python2}
%{python2} setup.py test
%endif
%{python3} setup.py test

%if %{with python2}
%files -n python2-%{srcname}
%license COPYING
%doc README.rst
%{python2_sitelib}/%{srcname}/
%{python2_sitelib}/%{srcname}-*.egg-info/
%endif

%files -n python3-%{srcname}
%license COPYING
%doc README.rst
%{python3_sitelib}/%{srcname}/
%{python3_sitelib}/%{srcname}-*.egg-info/
%{_bindir}/sample-exec

%changelog

但它总是尝试构建两者,但都失败了,而且我需要更改包名称,例如python2-%{srcname}. 我需要它们具有相同的名称,它不是一个Python模块,它是一个独立的程序。

答案1

有两种不同的方法

第一个你已经概述了,但它需要深思熟虑。即做类似的事情

%if 0%{?rhel_version} < 800
Requires: policycoreutils-python
%else
Requires: policycoreutils-python-utils
%endif

在您为 RHEL-7.X 构建 1 个 RPM 和为 RHEL-8.X 构建 1 个 RPM 的情况下,在构建时您将传入一个版本变量rpmbuild,在构建过程中它将执行模板化以确定哪些语句Requires是写在RPM中。

这意味着您将有 2 个 RPM,并且这 2 个 RPM 必须单独托管。


另一种方法是使用布尔依赖关系转速(链接) RHEL(链接),这个功能不是“新的》(几年前就发布了,CentOS/RHEL-7平台应该支持它)。

这就像(我们将假装瞄准,AMAZON Linux 2023因为它的python-unversioned-command包使得这比在 RHEL 上容易得多)。

Requires: ( Py3-Dep or Py2-Dep )
Requires: ( ( python-unversioned-command >= 3.0.0 and Py3-Dep ) or ( python-unversioned-command < 3.0.0 and Py2-Dep ) )

从本质上讲,您不能同时安装Py3-DepPy2-Dep,并且如果有一些包裹>=另一个包。

这带来了一系列单独的复杂性,您可能需要找到一个包来构建这个条件。

相关内容