python3이 설치되지 않은 경우 python2용 rpm을 빌드합니다.

python3이 설치되지 않은 경우 python2용 rpm을 빌드합니다.

python2를 실행하는 오래된 시스템이 여전히 있기 때문에 python2와 python3 모두에서 실행될 수 있는 Python 애플리케이션을 패키징하고 싶습니다.

기본값은 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에 대해 1RPM, RHEL-8.X에 대해 1RPM을 빌드하는 경우 빌드 시 버전 변수를 전달 하고 빌드 중에 RPM으로 작성된 rpmbuild명령문을 결정하기 위해 템플릿 작성을 수행합니다. Requires.

이는 2개의 RPM을 갖게 되며 이 2개의 RPM은 별도로 호스팅되어야 함을 의미합니다.


또 다른 방법은 부울 종속성을 사용하는 것입니다.속도(링크) RHEL(링크), 이 기능은 "새로운》 (몇 년 전에 출시된 CentOS/RHEL-7 플랫폼에서는 지원해야 합니다).

마치 RHEL보다 패키지가 훨씬 쉽기 AMAZON Linux 2023때문에 조준하는 척하겠습니다.python-unversioned-command

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일부 패키지가 있는 경우또 다른 가방 이에요 >=.

이로 인해 별도의 복잡성이 발생하므로 이 조건을 구축하려면 패키지를 찾아야 할 수도 있습니다.

관련 정보