894e21291e
According to PEP 627, the RECORD file is optional and doesn't make sense to keep it for system packages. Moreover, its absence should indicate to other tools like pip that they should not touch such packages. Now, we process content of all RECORD files to one pyproject-record (JSON) which is then used in %pyproject_save_files. That way, we can remove the original files in %pyproject_install and keep their content for later. PEP 627: https://www.python.org/dev/peps/pep-0627/#optional-record-file
116 lines
5.0 KiB
Plaintext
116 lines
5.0 KiB
Plaintext
# This is a directory where wheels are stored and installed from, relative to PWD
|
|
%_pyproject_wheeldir pyproject-wheeldir
|
|
|
|
# This is a directory used as TMPDIR, where pip copies sources to and builds from, relative to PWD
|
|
# For proper debugsource packages, we create TMPDIR within PWD
|
|
# See https://github.com/pypa/pip/issues/7555#issuecomment-595180864
|
|
#
|
|
# This will be used in debugsource package paths (applies to extension modules only)
|
|
# NB: pytest collects tests from here if not hidden
|
|
# https://docs.pytest.org/en/latest/reference.html#confval-norecursedirs
|
|
%_pyproject_builddir .pyproject-builddir
|
|
|
|
%pyproject_files %{_builddir}/pyproject-files
|
|
%pyproject_ghost_distinfo %{_builddir}/pyproject-ghost-distinfo
|
|
%pyproject_record %{_builddir}/pyproject-record
|
|
|
|
%pyproject_wheel() %{expand:\\\
|
|
export TMPDIR="${PWD}/%{_pyproject_builddir}"
|
|
mkdir -p "${TMPDIR}"
|
|
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}" \\\
|
|
%{__python3} -m pip wheel --wheel-dir %{_pyproject_wheeldir} --no-deps --use-pep517 --no-build-isolation --disable-pip-version-check --no-clean --progress-bar off --verbose .
|
|
}
|
|
|
|
|
|
%pyproject_install() %{expand:\\\
|
|
specifier=$(ls %{_pyproject_wheeldir}/*.whl | xargs basename --multiple | sed -E 's/([^-]+)-([^-]+)-.+\\\.whl/\\\1==\\\2/')
|
|
export TMPDIR="${PWD}/%{_pyproject_builddir}"
|
|
%{__python3} -m pip install --root %{buildroot} --no-deps --disable-pip-version-check --progress-bar off --verbose --ignore-installed --no-warn-script-location --no-index --no-cache-dir --find-links %{_pyproject_wheeldir} $specifier
|
|
if [ -d %{buildroot}%{_bindir} ]; then
|
|
%py3_shebang_fix %{buildroot}%{_bindir}/*
|
|
rm -rfv %{buildroot}%{_bindir}/__pycache__
|
|
fi
|
|
rm -f %{pyproject_ghost_distinfo}
|
|
if [ -d %{buildroot}%{python3_sitelib} ]; then
|
|
for distinfo in %{buildroot}%{python3_sitelib}/*.dist-info; do
|
|
echo "%ghost ${distinfo#%{buildroot}}" >> %{pyproject_ghost_distinfo}
|
|
sed -i 's/pip/rpm/' ${distinfo}/INSTALLER
|
|
if [ -f ${distinfo}/RECORD ]; then
|
|
PYTHONPATH=%{_rpmconfigdir}/redhat \\
|
|
%{__python3} -B %{_rpmconfigdir}/redhat/pyproject_preprocess_record.py \\
|
|
--buildroot %{buildroot} --record ${distinfo}/RECORD --output %{pyproject_record}
|
|
rm ${distinfo}/RECORD
|
|
fi
|
|
done
|
|
fi
|
|
if [ %{buildroot}%{python3_sitearch} != %{buildroot}%{python3_sitelib} ] && [ -d %{buildroot}%{python3_sitearch} ]; then
|
|
for distinfo in %{buildroot}%{python3_sitearch}/*.dist-info; do
|
|
echo "%ghost ${distinfo#%{buildroot}}" >> %{pyproject_ghost_distinfo}
|
|
sed -i 's/pip/rpm/' ${distinfo}/INSTALLER
|
|
if [ -f ${distinfo}/RECORD ]; then
|
|
PYTHONPATH=%{_rpmconfigdir}/redhat \\
|
|
%{__python3} -B %{_rpmconfigdir}/redhat/pyproject_preprocess_record.py \\
|
|
--buildroot %{buildroot} --record ${distinfo}/RECORD --output %{pyproject_record}
|
|
rm ${distinfo}/RECORD
|
|
fi
|
|
done
|
|
fi
|
|
lines=$(wc -l %{pyproject_ghost_distinfo} | cut -f1 -d" ")
|
|
if [ $lines -ne 1 ]; then
|
|
echo -e "\\n\\nWARNING: %%%%pyproject_extras_subpkg won't work without explicit -i or -F, found $lines dist-info directories.\\n\\n" >/dev/stderr
|
|
rm %{pyproject_ghost_distinfo} # any attempt to use this will fail
|
|
fi
|
|
}
|
|
|
|
|
|
# Note: the three times nested questionmarked -i -f -F pattern means: If none of those options was used -- in that case, we inject our own -f
|
|
%pyproject_extras_subpkg(n:i:f:F) %{expand:%{?python_extras_subpkg:%{python_extras_subpkg%{?!-i:%{?!-f:%{?!-F: -f %{pyproject_ghost_distinfo}}}} %**}}}
|
|
|
|
|
|
%pyproject_save_files() %{expand:\\\
|
|
%{__python3} %{_rpmconfigdir}/redhat/pyproject_save_files.py \\
|
|
--output "%{pyproject_files}" \\
|
|
--buildroot "%{buildroot}" \\
|
|
--sitelib "%{python3_sitelib}" \\
|
|
--sitearch "%{python3_sitearch}" \\
|
|
--python-version "%{python3_version}" \\
|
|
--pyproject-record "%{pyproject_record}" \\
|
|
%{*}
|
|
}
|
|
|
|
|
|
%default_toxenv py%{python3_version_nodots}
|
|
%toxenv %{default_toxenv}
|
|
|
|
|
|
%pyproject_buildrequires(rxte:) %{expand:\\\
|
|
%{-e:%{expand:%global toxenv %{-e*}}}
|
|
echo 'python%{python3_pkgversion}-devel'
|
|
echo 'python%{python3_pkgversion}dist(pip) >= 19'
|
|
echo 'python%{python3_pkgversion}dist(packaging)'
|
|
# 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
|
|
# Check if we can generate dependencies on Python extras
|
|
if [ "%{py_dist_name []}" == "[]" ]; then
|
|
extras_flag=%{?!_python_no_extras_requires:--generate-extras}
|
|
else
|
|
extras_flag=
|
|
fi
|
|
# setuptools assumes no pre-existing dist-info
|
|
rm -rfv *.dist-info/ >&2
|
|
if [ -f %{__python3} ]; then
|
|
RPM_TOXENV="%{toxenv}" HOSTNAME="rpmbuild" %{__python3} -s %{_rpmconfigdir}/redhat/pyproject_buildrequires.py $extras_flag --python3_pkgversion %{python3_pkgversion} %{?**}
|
|
fi
|
|
}
|
|
|
|
|
|
%tox(e:) %{expand:\\\
|
|
TOX_TESTENV_PASSENV="${TOX_TESTENV_PASSENV:-*}" \\
|
|
PATH="%{buildroot}%{_bindir}:$PATH" \\
|
|
PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}" \\
|
|
HOSTNAME="rpmbuild" \\
|
|
%{__python3} -m tox --current-env -q --recreate -e "%{-e:%{-e*}}%{!-e:%{toxenv}}" %{?*}
|
|
}
|