Make %pyproject_buildrequires more universal

so it can work with any non-main Python version and generate
proper dependencies.
This commit is contained in:
Lumir Balhar 2020-07-22 18:13:50 +02:00
parent 64e45518ef
commit 5561755a00
3 changed files with 37 additions and 26 deletions

View File

@ -71,13 +71,18 @@ fi
%pyproject_buildrequires(rxte:) %{expand:\\\ %pyproject_buildrequires(rxte:) %{expand:\\\
%{-e:%{expand:%global toxenv %{-e*}}} %{-e:%{expand:%global toxenv %{-e*}}}
echo 'python3-devel' echo 'python%{python3_pkgversion}-devel'
echo 'python3dist(packaging)' echo 'python%{python3_pkgversion}dist(pip) >= 19'
echo 'python3dist(toml)' echo 'python%{python3_pkgversion}dist(packaging)'
echo 'python%{python3_pkgversion}dist(toml)'
# The first part is for cases when %%{python3_version_nodots} is not yet available
if [ ! -z "%{?python3_version_nodots}" ] && [ %{python3_version_nodots} -lt 38 ]; then
echo 'python%{python3_pkgversion}dist(importlib-metadata)'
fi
# setuptools assumes no pre-existing dist-info # setuptools assumes no pre-existing dist-info
rm -rfv *.dist-info/ >&2 rm -rfv *.dist-info/ >&2
if [ -f %{__python3} ]; then if [ -f %{__python3} ]; then
RPM_TOXENV="%{toxenv}" HOSTNAME="rpmbuild" %{__python3} -I %{_rpmconfigdir}/redhat/pyproject_buildrequires.py %{?**} RPM_TOXENV="%{toxenv}" HOSTNAME="rpmbuild" %{__python3} -I %{_rpmconfigdir}/redhat/pyproject_buildrequires.py --python3_pkgversion %{python3_pkgversion} %{?**}
fi fi
} }

View File

@ -32,19 +32,6 @@ URL: https://src.fedoraproject.org/rpms/pyproject-rpm-macros
BuildArch: noarch BuildArch: noarch
Requires: python3-pip >= 19
Requires: python3-devel
# We keep these here for now to avoid one loop of %%generate_buildrequires
# But those are also always in the output of %%generate_buildrequires
# in order to be removable in the future
Requires: python3dist(packaging)
Requires: python3dist(toml)
# This is not output from %%generate_buildrequires to work around:
# https://github.com/rpm-software-management/mock/issues/336
Requires: (python3dist(importlib-metadata) if python3 < 3.8)
%if %{with tests} %if %{with tests}
BuildRequires: python3dist(pytest) BuildRequires: python3dist(pytest)
BuildRequires: python3dist(pyyaml) BuildRequires: python3dist(pyyaml)

View File

@ -47,13 +47,16 @@ def hook_call():
class Requirements: class Requirements:
"""Requirement printer""" """Requirement printer"""
def __init__(self, get_installed_version, extras=''): def __init__(self, get_installed_version, extras='',
python3_pkgversion='3'):
self.get_installed_version = get_installed_version self.get_installed_version = get_installed_version
self.marker_env = {'extra': extras} self.marker_env = {'extra': extras}
self.missing_requirements = False self.missing_requirements = False
self.python3_pkgversion = python3_pkgversion
def add(self, requirement_str, *, source=None): def add(self, requirement_str, *, source=None):
"""Output a Python-style requirement string as RPM dep""" """Output a Python-style requirement string as RPM dep"""
print_err(f'Handling {requirement_str} from {source}') print_err(f'Handling {requirement_str} from {source}')
@ -96,15 +99,19 @@ class Requirements:
+ '(This is probably a bug in pyproject-rpm-macros.)', + '(This is probably a bug in pyproject-rpm-macros.)',
) )
if specifier.operator == '!=': if specifier.operator == '!=':
lower = python3dist(name, '<', version) lower = python3dist(name, '<', version,
higher = python3dist(name, '>', f'{version}.0') self.python3_pkgversion)
higher = python3dist(name, '>', f'{version}.0',
self.python3_pkgversion)
together.append( together.append(
f'({lower} or {higher})' f'({lower} or {higher})'
) )
else: else:
together.append(python3dist(name, specifier.operator, version)) together.append(python3dist(name, specifier.operator, version,
self.python3_pkgversion))
if len(together) == 0: if len(together) == 0:
print(python3dist(name)) print(python3dist(name,
python3_pkgversion=self.python3_pkgversion))
elif len(together) == 1: elif len(together) == 1:
print(together[0]) print(together[0])
else: else:
@ -228,24 +235,30 @@ def generate_tox_requirements(toxenv, requirements):
source=f'tox --print-deps-only: {toxenv}') source=f'tox --print-deps-only: {toxenv}')
def python3dist(name, op=None, version=None): def python3dist(name, op=None, version=None, python3_pkgversion="3"):
prefix = f"python{python3_pkgversion}dist"
if op is None: if op is None:
if version is not None: if version is not None:
raise AssertionError('op and version go together') raise AssertionError('op and version go together')
return f'python3dist({name})' return f'{prefix}({name})'
else: else:
return f'python3dist({name}) {op} {version}' return f'{prefix}({name}) {op} {version}'
def generate_requires( def generate_requires(
*, include_runtime=False, toxenv=None, extras='', *, include_runtime=False, toxenv=None, extras='',
get_installed_version=importlib_metadata.version, # for dep injection get_installed_version=importlib_metadata.version, # for dep injection
python3_pkgversion="3",
): ):
"""Generate the BuildRequires for the project in the current directory """Generate the BuildRequires for the project in the current directory
This is the main Python entry point. This is the main Python entry point.
""" """
requirements = Requirements(get_installed_version, extras=extras) requirements = Requirements(
get_installed_version, extras=extras,
python3_pkgversion=python3_pkgversion
)
try: try:
backend = get_backend(requirements) backend = get_backend(requirements)
@ -285,6 +298,11 @@ def main(argv):
# help='comma separated list of "extras" for runtime requirements ' # help='comma separated list of "extras" for runtime requirements '
# + '(e.g. -x testing,feature-x)', # + '(e.g. -x testing,feature-x)',
) )
parser.add_argument(
'-p', '--python3_pkgversion', metavar='PYTHON3_PKGVERSION',
default="3", help=('Python version for pythonXdist()'
'or pythonX.Ydist() requirements'),
)
args = parser.parse_args(argv) args = parser.parse_args(argv)
@ -304,6 +322,7 @@ def main(argv):
include_runtime=args.runtime, include_runtime=args.runtime,
toxenv=args.toxenv, toxenv=args.toxenv,
extras=args.extras, extras=args.extras,
python3_pkgversion=args.python3_pkgversion,
) )
except Exception: except Exception:
# Log the traceback explicitly (it's useful debug info) # Log the traceback explicitly (it's useful debug info)