eclass/distutils-r1: Sync with Gentoo

It's from Gentoo commit 4d2906625a2322f5d551d5db3957e4be0749cdab.
This commit is contained in:
Flatcar Buildbot 2025-06-16 07:09:47 +00:00 committed by Krzesimir Nowak
parent 471e6c0dea
commit d81888e423

View File

@ -7,7 +7,7 @@
# @AUTHOR: # @AUTHOR:
# Author: Michał Górny <mgorny@gentoo.org> # Author: Michał Górny <mgorny@gentoo.org>
# Based on the work of: Krzysztof Pawlik <nelchael@gentoo.org> # Based on the work of: Krzysztof Pawlik <nelchael@gentoo.org>
# @SUPPORTED_EAPIS: 7 8 # @SUPPORTED_EAPIS: 8
# @PROVIDES: python-r1 python-single-r1 # @PROVIDES: python-r1 python-single-r1
# @BLURB: A simple eclass to build Python packages using distutils. # @BLURB: A simple eclass to build Python packages using distutils.
# @DESCRIPTION: # @DESCRIPTION:
@ -92,20 +92,9 @@
# @ECLASS_VARIABLE: DISTUTILS_USE_PEP517 # @ECLASS_VARIABLE: DISTUTILS_USE_PEP517
# @PRE_INHERIT # @PRE_INHERIT
# @DEFAULT_UNSET # @REQUIRED
# @DESCRIPTION: # @DESCRIPTION:
# Enable the PEP517 mode for the specified build system. In this mode, # Specifies the PEP517 build system used for the package. Currently,
# the complete build and install is done in python_compile(),
# a venv-style install tree is provided to python_test(),
# and python_install() just merges the temporary install tree
# into the real fs.
#
# This mode is recommended for Python packages. However, some packages
# using custom hacks on top of distutils/setuptools may not install
# correctly in this mode. Please verify the list of installed files
# when using it.
#
# The variable specifies the build system used. Currently,
# the following values are supported: # the following values are supported:
# #
# - flit - flit-core backend # - flit - flit-core backend
@ -134,16 +123,22 @@
# #
# - sip - sipbuild backend # - sip - sipbuild backend
# #
# - standalone - standalone build systems without external deps # - standalone - standalone/local build systems
# (used for bootstrapping).
# #
# - uv-build - uv-build backend (using dev-python/uv) # - uv-build - uv-build backend (using dev-python/uv)
# #
# The variable needs to be set before the inherit line. The eclass # The variable needs to be set before the inherit line. If another
# adds appropriate build-time dependencies and verifies the value. # value than "standalone" and "no" is used, The eclass adds appropriate
# build-time dependencies, verifies the value and calls the appropriate
# modern entry point for the backend. With DISTUTILS_UPSTREAM_PEP517,
# this variable can be used to override the upstream build backend.
#
# The value of "standalone" indicates that upstream is using a custom,
# local build backend. In this mode, the eclass does not add any
# dependencies, disables build backend verification and uses the exact
# entry point listed in pyproject.toml.
# #
# The special value "no" indicates that the package has no build system. # The special value "no" indicates that the package has no build system.
# This is not equivalent to unset DISTUTILS_USE_PEP517 (legacy mode).
# It causes the eclass not to include any build system dependencies # It causes the eclass not to include any build system dependencies
# and to disable default python_compile() and python_install() # and to disable default python_compile() and python_install()
# implementations. Baseline Python deps and phase functions will still # implementations. Baseline Python deps and phase functions will still
@ -162,38 +157,23 @@
# overriden to workaround the eclass check, when it is desirable # overriden to workaround the eclass check, when it is desirable
# to build the wheel using other backend than the one used upstream. # to build the wheel using other backend than the one used upstream.
# #
# When using it, ideally it should list the build backend actually used
# upstream, so the eclass will throw an error if that backend changes
# (and therefore overrides may need to change as well). As a special
# case, setting it to "standalone" disables the check entirely (while
# still forcing the backend, unlike DISTUTILS_USE_PEP517=standalone).
#
# Please note that even in packages using PEP621 metadata, there can # Please note that even in packages using PEP621 metadata, there can
# be subtle differences between the behavior of different PEP517 build # be subtle differences between the behavior of different PEP517 build
# backends, for example regarding finding package files. When using # backends, for example regarding finding package files. When using
# this option, please make sure that the package is installed correctly. # this option, please make sure that the package is installed correctly.
# @ECLASS_VARIABLE: DISTUTILS_USE_SETUPTOOLS
# @DEFAULT_UNSET
# @PRE_INHERIT
# @DESCRIPTION:
# Controls adding dev-python/setuptools dependency. The allowed values
# are:
#
# - no -- do not add the dependency (pure distutils package)
#
# - bdepend -- add it to BDEPEND (the default)
#
# - rdepend -- add it to BDEPEND+RDEPEND (e.g. when using pkg_resources)
#
# - manual -- do not add the dependency and suppress the checks
# (assumes you will take care of doing it correctly)
#
# This variable is effective only if DISTUTILS_OPTIONAL is disabled.
# It is available only in non-PEP517 mode. It needs to be set before
# the inherit line.
# @ECLASS_VARIABLE: DISTUTILS_DEPS # @ECLASS_VARIABLE: DISTUTILS_DEPS
# @OUTPUT_VARIABLE # @OUTPUT_VARIABLE
# @DESCRIPTION: # @DESCRIPTION:
# This is an eclass-generated build-time dependency string for the build # This is an eclass-generated build-time dependency string for the build
# system packages. This string is automatically appended to BDEPEND # system packages. This string is automatically appended to BDEPEND
# unless DISTUTILS_OPTIONAL is used. This variable is available only # unless DISTUTILS_OPTIONAL is used.
# in PEP517 mode.
# #
# Example use: # Example use:
# @CODE # @CODE
@ -215,7 +195,7 @@
# This is an optimization that can avoid the overhead of calling into # This is an optimization that can avoid the overhead of calling into
# the build system in pure Python packages and packages using the stable # the build system in pure Python packages and packages using the stable
# Python ABI. # Python ABI.
: ${DISTUTILS_ALLOW_WHEEL_REUSE=1} : "${DISTUTILS_ALLOW_WHEEL_REUSE=1}"
# @ECLASS_VARIABLE: BUILD_DIR # @ECLASS_VARIABLE: BUILD_DIR
# @OUTPUT_VARIABLE # @OUTPUT_VARIABLE
@ -237,7 +217,7 @@ if [[ -z ${_DISTUTILS_R1_ECLASS} ]]; then
_DISTUTILS_R1_ECLASS=1 _DISTUTILS_R1_ECLASS=1
case ${EAPI} in case ${EAPI} in
7|8) ;; 8) ;;
*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
esac esac
@ -256,11 +236,6 @@ fi
_distutils_set_globals() { _distutils_set_globals() {
local rdep bdep local rdep bdep
if [[ ${DISTUTILS_USE_PEP517} ]]; then
if [[ ${DISTUTILS_USE_SETUPTOOLS} ]]; then
die "DISTUTILS_USE_SETUPTOOLS is not used in PEP517 mode"
fi
bdep=' bdep='
>=dev-python/gpep517-16[${PYTHON_USEDEP}] >=dev-python/gpep517-16[${PYTHON_USEDEP}]
' '
@ -341,32 +316,6 @@ _distutils_set_globals() {
die "Unknown DISTUTILS_USE_PEP517=${DISTUTILS_USE_PEP517}" die "Unknown DISTUTILS_USE_PEP517=${DISTUTILS_USE_PEP517}"
;; ;;
esac esac
elif [[ ${DISTUTILS_OPTIONAL} ]]; then
if [[ ${DISTUTILS_USE_SETUPTOOLS} ]]; then
eqawarn "QA Notice: DISTUTILS_USE_SETUPTOOLS is not used when DISTUTILS_OPTIONAL"
eqawarn "is enabled."
fi
else
local setuptools_dep='>=dev-python/setuptools-78.1.0[${PYTHON_USEDEP}]'
case ${DISTUTILS_USE_SETUPTOOLS:-bdepend} in
no|manual)
;;
bdepend)
bdep+=" ${setuptools_dep}"
;;
rdepend)
bdep+=" ${setuptools_dep}"
rdep+=" ${setuptools_dep}"
;;
pyproject.toml)
die "DISTUTILS_USE_SETUPTOOLS=pyproject.toml is no longer supported, use DISTUTILS_USE_PEP517"
;;
*)
die "Invalid DISTUTILS_USE_SETUPTOOLS=${DISTUTILS_USE_SETUPTOOLS}"
;;
esac
fi
if [[ ! ${DISTUTILS_SINGLE_IMPL} ]]; then if [[ ! ${DISTUTILS_SINGLE_IMPL} ]]; then
bdep=${bdep//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}} bdep=${bdep//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}}
@ -376,7 +325,6 @@ _distutils_set_globals() {
[[ -n ${rdep} ]] && rdep="$(python_gen_cond_dep "${rdep}")" [[ -n ${rdep} ]] && rdep="$(python_gen_cond_dep "${rdep}")"
fi fi
if [[ ${DISTUTILS_USE_PEP517} ]]; then
if [[ ${DISTUTILS_DEPS+1} ]]; then if [[ ${DISTUTILS_DEPS+1} ]]; then
if [[ ${DISTUTILS_DEPS} != "${bdep}" ]]; then if [[ ${DISTUTILS_DEPS} != "${bdep}" ]]; then
eerror "DISTUTILS_DEPS have changed between inherits!" eerror "DISTUTILS_DEPS have changed between inherits!"
@ -388,12 +336,6 @@ _distutils_set_globals() {
DISTUTILS_DEPS=${bdep} DISTUTILS_DEPS=${bdep}
readonly DISTUTILS_DEPS readonly DISTUTILS_DEPS
fi fi
else
eqawarn "QA Notice: distutils-r1.eclass legacy mode is deprecated and will be removed."
eqawarn "Please migrate your ebuilds to use DISTUTILS_USE_PEP517 (common values"
eqawarn "are 'setuptools' for packages using setuptools/distutils,"
eqawarn "and 'no' for packages using non-PEP517 build systems)."
fi
if [[ ! ${DISTUTILS_OPTIONAL} ]]; then if [[ ! ${DISTUTILS_OPTIONAL} ]]; then
RDEPEND="${PYTHON_DEPS} ${rdep}" RDEPEND="${PYTHON_DEPS} ${rdep}"
@ -412,26 +354,6 @@ _distutils_set_globals() {
_distutils_set_globals _distutils_set_globals
unset -f _distutils_set_globals unset -f _distutils_set_globals
# @ECLASS_VARIABLE: DISTUTILS_IN_SOURCE_BUILD
# @DEFAULT_UNSET
# @DEPRECATED: (none)
# @DESCRIPTION:
# If set to a non-null value, in-source builds will be enabled.
# If unset, the default is to use in-source builds when python_prepare()
# is declared, and out-of-source builds otherwise.
#
# If in-source builds are used, the eclass will create a copy of package
# sources for each Python implementation in python_prepare_all(),
# and work on that copy afterwards.
#
# If out-of-source builds are used, the eclass will instead work
# on the sources directly, prepending setup.py arguments with
# 'build --build-base ${BUILD_DIR}' to enforce keeping & using built
# files in the specific root.
#
# In-source builds are deprecated and no longer supported in PEP517
# mode.
# @ECLASS_VARIABLE: DISTUTILS_ALL_SUBPHASE_IMPLS # @ECLASS_VARIABLE: DISTUTILS_ALL_SUBPHASE_IMPLS
# @DEFAULT_UNSET # @DEFAULT_UNSET
# @DESCRIPTION: # @DESCRIPTION:
@ -604,8 +526,6 @@ distutils_enable_sphinx() {
# #
# - pytest: dev-python/pytest # - pytest: dev-python/pytest
# #
# - setup.py: setup.py test (no deps included; deprecated)
#
# - unittest: for built-in Python unittest module # - unittest: for built-in Python unittest module
# #
# This function is meant as a helper for common use cases, and it only # This function is meant as a helper for common use cases, and it only
@ -649,10 +569,6 @@ distutils_enable_tests() {
")" ")"
fi fi
;; ;;
setup.py)
eqawarn "QA Notice: 'distutils_enable_tests setup.py' is deprecated and will be removed."
eqawarn "Please use unittest or pytest instead."
;;
unittest) unittest)
;; ;;
*) *)
@ -697,25 +613,12 @@ esetup.py() {
_python_check_EPYTHON _python_check_EPYTHON
if [[ ${BUILD_DIR} && ! ${DISTUTILS_USE_PEP517} ]]; then
_distutils-r1_create_setup_cfg
fi
local setup_py=( setup.py ) local setup_py=( setup.py )
if [[ ! -f setup.py ]]; then if [[ ! -f setup.py ]]; then
# The following call can succeed even if the package does not
# feature any setuptools configuration. In non-PEP517 mode this
# could lead to installing an "empty" package. In PEP517 mode,
# we verify the build system when invoking the backend,
# rendering this check redundant (and broken for projects using
# pyproject.toml configuration).
if [[ ! ${DISTUTILS_USE_PEP517} && ! -f setup.cfg ]]; then
die "${FUNCNAME}: setup.py nor setup.cfg not found"
fi
setup_py=( -c "from setuptools import setup; setup()" ) setup_py=( -c "from setuptools import setup; setup()" )
fi fi
if [[ ${EAPI} != 7 && ${mydistutilsargs[@]} ]]; then if [[ ${mydistutilsargs[@]} ]]; then
die "mydistutilsargs is banned in EAPI ${EAPI} (use DISTUTILS_ARGS)" die "mydistutilsargs is banned in EAPI ${EAPI} (use DISTUTILS_ARGS)"
fi fi
@ -726,22 +629,9 @@ esetup.py() {
"${@}" || die -n "${@}" || die -n
local ret=${?} local ret=${?}
if [[ ${BUILD_DIR} && ! ${DISTUTILS_USE_PEP517} ]]; then
rm "${HOME}"/.pydistutils.cfg || die -n
fi
return ${ret} return ${ret}
} }
# @FUNCTION: distutils_install_for_testing
# @DEPRECATED: DISTUTILS_USE_PEP517=...
# @DESCRIPTION:
# This function used to provide an installed package for running tests.
# It is no longer implemented, PEP517 mode must be used instead.
distutils_install_for_testing() {
die "${FUNCNAME} has been removed, please use PEP517 mode instead"
}
# @FUNCTION: distutils_write_namespace # @FUNCTION: distutils_write_namespace
# @USAGE: <namespace>... # @USAGE: <namespace>...
# @DESCRIPTION: # @DESCRIPTION:
@ -754,8 +644,8 @@ distutils_install_for_testing() {
distutils_write_namespace() { distutils_write_namespace() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
if [[ ! ${DISTUTILS_USE_PEP517:-no} != no ]]; then if [[ ${DISTUTILS_USE_PEP517} == no ]]; then
die "${FUNCNAME} is available only in PEP517 mode" die "${FUNCNAME} is available only with PEP517 backends"
fi fi
if [[ ${EBUILD_PHASE} != test || ! ${BUILD_DIR} ]]; then if [[ ${EBUILD_PHASE} != test || ! ${BUILD_DIR} ]]; then
die "${FUNCNAME} should only be used in python_test" die "${FUNCNAME} should only be used in python_test"
@ -778,45 +668,6 @@ distutils_write_namespace() {
done done
} }
# @FUNCTION: _distutils-r1_disable_ez_setup
# @INTERNAL
# @DESCRIPTION:
# Stub out ez_setup.py and distribute_setup.py to prevent packages
# from trying to download a local copy of setuptools.
_distutils-r1_disable_ez_setup() {
if [[ ${DISTUTILS_USE_PEP517} ]]; then
die "${FUNCNAME} is not implemented in PEP517 mode"
fi
local stub="def use_setuptools(*args, **kwargs): pass"
if [[ -f ez_setup.py ]]; then
echo "${stub}" > ez_setup.py || die
fi
if [[ -f distribute_setup.py ]]; then
echo "${stub}" > distribute_setup.py || die
fi
}
# @FUNCTION: _distutils-r1_handle_pyproject_toml
# @INTERNAL
# @DESCRIPTION:
# Verify whether DISTUTILS_USE_SETUPTOOLS is set correctly
# for pyproject.toml build systems (in non-PEP517 mode).
_distutils-r1_handle_pyproject_toml() {
if [[ ${DISTUTILS_USE_PEP517} ]]; then
die "${FUNCNAME} is not implemented in PEP517 mode"
fi
[[ ${DISTUTILS_USE_SETUPTOOLS} == manual ]] && return
if [[ ! -f setup.py && -f pyproject.toml ]]; then
eerror "No setup.py found but pyproject.toml is present. Please migrate"
eerror "the package to use DISTUTILS_USE_PEP517. See:"
eerror " https://projects.gentoo.org/python/guide/distutils.html"
die "No setup.py found and PEP517 mode not enabled"
fi
}
# @FUNCTION: _distutils-r1_check_all_phase_mismatch # @FUNCTION: _distutils-r1_check_all_phase_mismatch
# @INTERNAL # @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
@ -827,7 +678,6 @@ _distutils-r1_check_all_phase_mismatch() {
eqawarn "QA Notice: distutils-r1_python_${EBUILD_PHASE}_all called" eqawarn "QA Notice: distutils-r1_python_${EBUILD_PHASE}_all called"
eqawarn "from python_${EBUILD_PHASE}. Did you mean to use" eqawarn "from python_${EBUILD_PHASE}. Did you mean to use"
eqawarn "python_${EBUILD_PHASE}_all()?" eqawarn "python_${EBUILD_PHASE}_all()?"
[[ ${EAPI} != 7 ]] &&
die "distutils-r1_python_${EBUILD_PHASE}_all called from python_${EBUILD_PHASE}." die "distutils-r1_python_${EBUILD_PHASE}_all called from python_${EBUILD_PHASE}."
fi fi
} }
@ -838,10 +688,7 @@ _distutils-r1_check_all_phase_mismatch() {
# Print the version of the relevant build system packages to aid # Print the version of the relevant build system packages to aid
# debugging. # debugging.
_distutils-r1_print_package_versions() { _distutils-r1_print_package_versions() {
local packages=() local packages=(
if [[ ${DISTUTILS_USE_PEP517} ]]; then
packages+=(
dev-python/gpep517 dev-python/gpep517
dev-python/installer dev-python/installer
) )
@ -934,18 +781,6 @@ _distutils-r1_print_package_versions() {
) )
;; ;;
esac esac
else
case ${DISTUTILS_USE_SETUPTOOLS} in
manual|no)
return
;;
*)
packages+=(
dev-python/setuptools
)
;;
esac
fi
local pkg local pkg
einfo "Build system packages:" einfo "Build system packages:"
@ -972,104 +807,12 @@ distutils-r1_python_prepare_all() {
default default
fi fi
# by default, use in-source build if python_prepare() is used
if [[ ! ${DISTUTILS_IN_SOURCE_BUILD+1} ]]; then
if declare -f python_prepare >/dev/null; then
DISTUTILS_IN_SOURCE_BUILD=1
fi
fi
if [[ ! ${DISTUTILS_USE_PEP517} ]]; then
_distutils-r1_disable_ez_setup
_distutils-r1_handle_pyproject_toml
fi
if [[ ${DISTUTILS_IN_SOURCE_BUILD} && ! ${DISTUTILS_SINGLE_IMPL} ]]
then
# create source copies for each implementation
python_copy_sources
fi
python_export_utf8_locale python_export_utf8_locale
_distutils-r1_print_package_versions _distutils-r1_print_package_versions
_DISTUTILS_DEFAULT_CALLED=1 _DISTUTILS_DEFAULT_CALLED=1
} }
# @FUNCTION: _distutils-r1_create_setup_cfg
# @INTERNAL
# @DESCRIPTION:
# Create implementation-specific configuration file for distutils,
# setting proper build-dir (and install-dir) paths.
_distutils-r1_create_setup_cfg() {
if [[ ${DISTUTILS_USE_PEP517} ]]; then
die "${FUNCNAME} is not implemented in PEP517 mode"
fi
cat > "${HOME}"/.pydistutils.cfg <<-_EOF_ || die
[build]
build_base = ${BUILD_DIR}
# using a single directory for them helps us export
# ${PYTHONPATH} and ebuilds find the sources independently
# of whether the package installs extensions or not
#
# note: due to some packages (wxpython) relying on separate
# platlib & purelib dirs, we do not set --build-lib (which
# can not be overridden with --build-*lib)
build_platlib = %(build_base)s/lib
build_purelib = %(build_base)s/lib
# make the ebuild writer lives easier
build_scripts = %(build_base)s/scripts
# this is needed by distutils_install_for_testing since
# setuptools like to create .egg files for install --home.
[bdist_egg]
dist_dir = ${BUILD_DIR}/dist
# avoid packing up eggs in a zip as it often breaks test suites
[options]
zip_safe = False
_EOF_
if [[ ${EBUILD_PHASE} == install ]]; then
# we can't refer to ${D} before src_install()
cat >> "${HOME}"/.pydistutils.cfg <<-_EOF_ || die
# installation paths -- allow calling extra install targets
# without the default 'install'
[install]
compile = True
optimize = 2
root = ${D}
_EOF_
if [[ ! ${DISTUTILS_SINGLE_IMPL} ]]; then
# this gets appended to [install]
cat >> "${HOME}"/.pydistutils.cfg <<-_EOF_ || die
install_scripts = $(python_get_scriptdir)
_EOF_
fi
fi
}
# @FUNCTION: _distutils-r1_copy_egg_info
# @INTERNAL
# @DESCRIPTION:
# Copy egg-info files to the ${BUILD_DIR} (that's going to become
# egg-base in esetup.py). This way, we respect whatever's in upstream
# egg-info.
_distutils-r1_copy_egg_info() {
if [[ ${DISTUTILS_USE_PEP517} ]]; then
die "${FUNCNAME} is not implemented in PEP517 mode"
fi
mkdir -p "${BUILD_DIR}" || die
# stupid freebsd can't do 'cp -t ${BUILD_DIR} {} +'
find -name '*.egg-info' -type d -exec cp -R -p {} "${BUILD_DIR}"/ ';' || die
}
# @FUNCTION: _distutils-r1_key_to_backend # @FUNCTION: _distutils-r1_key_to_backend
# @USAGE: <key> # @USAGE: <key>
# @INTERNAL # @INTERNAL
@ -1150,11 +893,23 @@ _distutils-r1_get_backend() {
fi fi
fi fi
# if DISTUTILS_USE_PEP517 is "standalone", we respect the exact
# backend used in pyproject.toml; otherwise we force the backend
# based on DISTUTILS_USE_PEP517
if [[ ${DISTUTILS_USE_PEP517} == standalone ]]; then if [[ ${DISTUTILS_USE_PEP517} == standalone ]]; then
echo "${build_backend}" echo "${build_backend}"
return return
fi fi
# we can output it early, even if we die below
echo "$(_distutils-r1_key_to_backend "${DISTUTILS_USE_PEP517}")"
# skip backend verification if DISTUTILS_UPSTREAM_PEP517
# is "standalone"
if [[ ${DISTUTILS_UPSTREAM_PEP517} == standalone ]]; then
return
fi
# verify that the ebuild correctly specifies the build backend # verify that the ebuild correctly specifies the build backend
local expected_backend=$( local expected_backend=$(
_distutils-r1_key_to_backend \ _distutils-r1_key_to_backend \
@ -1189,8 +944,6 @@ _distutils-r1_get_backend() {
> "${T}"/.distutils_deprecated_backend_warned || die > "${T}"/.distutils_deprecated_backend_warned || die
fi fi
fi fi
echo "$(_distutils-r1_key_to_backend "${DISTUTILS_USE_PEP517}")"
} }
# @FUNCTION: distutils_wheel_install # @FUNCTION: distutils_wheel_install
@ -1262,8 +1015,8 @@ distutils_pep517_install() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
[[ ${#} -eq 1 ]] || die "${FUNCNAME} takes exactly one argument: root" [[ ${#} -eq 1 ]] || die "${FUNCNAME} takes exactly one argument: root"
if [[ ! ${DISTUTILS_USE_PEP517:-no} != no ]]; then if [[ ${DISTUTILS_USE_PEP517} == no ]]; then
die "${FUNCNAME} is available only in PEP517 mode" die "${FUNCNAME} is available only with PEP517 backend"
fi fi
local root=${1} local root=${1}
@ -1472,10 +1225,6 @@ declare -g -A DISTUTILS_WHEELS=()
# If DISTUTILS_USE_PEP517 is set to any other value, builds a wheel # If DISTUTILS_USE_PEP517 is set to any other value, builds a wheel
# using the PEP517 backend and installs it into ${BUILD_DIR}/install. # using the PEP517 backend and installs it into ${BUILD_DIR}/install.
# Path to the wheel is then added to DISTUTILS_WHEELS array. # Path to the wheel is then added to DISTUTILS_WHEELS array.
#
# In legacy mode, runs 'esetup.py build'. Any parameters passed to this
# function will be appended to setup.py invocation, i.e. passed
# as options to the 'build' command.
distutils-r1_python_compile() { distutils-r1_python_compile() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
@ -1483,13 +1232,6 @@ distutils-r1_python_compile() {
[[ ${DISTUTILS_USE_PEP517} == no ]] && return [[ ${DISTUTILS_USE_PEP517} == no ]] && return
if [[ ! ${DISTUTILS_USE_PEP517} ]]; then
# legacy mode
_distutils-r1_copy_egg_info
esetup.py build -j "$(makeopts_jobs "${MAKEOPTS} ${*}")" "${@}"
return
fi
# we do this for all build systems, since other backends # we do this for all build systems, since other backends
# and custom hooks may wrap setuptools # and custom hooks may wrap setuptools
# #
@ -1579,9 +1321,7 @@ _distutils-r1_wrap_scripts() {
local basename=${f##*/} local basename=${f##*/}
debug-print "${FUNCNAME}: installing wrapper at ${bindir}/${basename}" debug-print "${FUNCNAME}: installing wrapper at ${bindir}/${basename}"
local dosym=dosym dosym -r /usr/lib/python-exec/python-exec2 \
[[ ${EAPI} == 7 ]] && dosym=dosym8
"${dosym}" -r /usr/lib/python-exec/python-exec2 \
"${bindir#${EPREFIX}}/${basename}" "${bindir#${EPREFIX}}/${basename}"
done done
@ -1618,9 +1358,6 @@ distutils-r1_python_test() {
pytest) pytest)
epytest epytest
;; ;;
setup.py)
nonfatal esetup.py test --verbose
;;
unittest) unittest)
eunittest eunittest
;; ;;
@ -1637,14 +1374,8 @@ distutils-r1_python_test() {
# @FUNCTION: distutils-r1_python_install # @FUNCTION: distutils-r1_python_install
# @USAGE: [additional-args...] # @USAGE: [additional-args...]
# @DESCRIPTION: # @DESCRIPTION:
# The default python_install(). # The default python_install(). Merges the files
# # from ${BUILD_DIR}/install (if present) to the image directory.
# In PEP517 mode, merges the files from ${BUILD_DIR}/install
# (if present) to the image directory.
#
# In the legacy mode, calls `esetup.py install` to install the package.
# Any parameters passed to this function will be appended
# to the setup.py invocation (i.e. as options to the 'install' command).
distutils-r1_python_install() { distutils-r1_python_install() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
@ -1652,7 +1383,6 @@ distutils-r1_python_install() {
local scriptdir=${EPREFIX}/usr/bin local scriptdir=${EPREFIX}/usr/bin
local merge_root= local merge_root=
if [[ ${DISTUTILS_USE_PEP517} ]]; then
local root=${BUILD_DIR}/install local root=${BUILD_DIR}/install
local reg_scriptdir=${root}/${scriptdir} local reg_scriptdir=${root}/${scriptdir}
local wrapped_scriptdir=${root}$(python_get_scriptdir) local wrapped_scriptdir=${root}$(python_get_scriptdir)
@ -1662,7 +1392,8 @@ distutils-r1_python_install() {
# let's explicitly verify these assumptions # let's explicitly verify these assumptions
# remove files that we've created explicitly # remove files that we've created explicitly
rm "${reg_scriptdir}"/{"${EPYTHON}",python3,python,pyvenv.cfg} || die rm "${reg_scriptdir}"/{"${EPYTHON}",python3,python} || die
rm "${reg_scriptdir}"/../pyvenv.cfg || die
# Automagically do the QA check to avoid issues when bootstrapping # Automagically do the QA check to avoid issues when bootstrapping
# prefix. # prefix.
@ -1696,59 +1427,6 @@ distutils-r1_python_install() {
# to merge # to merge
find "${BUILD_DIR}"/install -type d -empty -delete || die find "${BUILD_DIR}"/install -type d -empty -delete || die
[[ -d ${BUILD_DIR}/install ]] && merge_root=1 [[ -d ${BUILD_DIR}/install ]] && merge_root=1
else
local root=${D}/_${EPYTHON}
[[ ${DISTUTILS_SINGLE_IMPL} ]] && root=${D}
# inline DISTUTILS_ARGS logic from esetup.py in order to make
# argv overwriting easier
local args=(
"${DISTUTILS_ARGS[@]}"
"${mydistutilsargs[@]}"
install --skip-build --root="${root}" "${args[@]}"
"${@}"
)
local DISTUTILS_ARGS=()
local mydistutilsargs=()
# enable compilation for the install phase.
local -x PYTHONDONTWRITEBYTECODE=
# python likes to compile any module it sees, which triggers sandbox
# failures if some packages haven't compiled their modules yet.
addpredict "${EPREFIX}/usr/lib/${EPYTHON}"
addpredict "${EPREFIX}/usr/local" # bug 498232
if [[ ! ${DISTUTILS_SINGLE_IMPL} ]]; then
merge_root=1
# user may override --install-scripts
# note: this is poor but distutils argv parsing is dumb
# rewrite all the arguments
set -- "${args[@]}"
args=()
while [[ ${@} ]]; do
local a=${1}
shift
case ${a} in
--install-scripts=*)
scriptdir=${a#--install-scripts=}
;;
--install-scripts)
scriptdir=${1}
shift
;;
*)
args+=( "${a}" )
;;
esac
done
fi
esetup.py "${args[@]}"
fi
if [[ ${merge_root} ]]; then if [[ ${merge_root} ]]; then
multibuild_merge_root "${root}" "${D}" multibuild_merge_root "${root}" "${D}"
@ -1784,42 +1462,7 @@ distutils-r1_python_install_all() {
distutils-r1_run_phase() { distutils-r1_run_phase() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
if [[ ${DISTUTILS_IN_SOURCE_BUILD} ]]; then
[[ ${DISTUTILS_USE_PEP517} ]] &&
die "DISTUTILS_IN_SOURCE_BUILD is not supported in PEP517 mode"
# only force BUILD_DIR if implementation is explicitly enabled
# for building; any-r1 API may select one that is not
# https://bugs.gentoo.org/701506
if [[ ! ${DISTUTILS_SINGLE_IMPL} ]] &&
has "${EPYTHON/./_}" ${PYTHON_TARGETS}; then
cd "${BUILD_DIR}" || die
fi
local BUILD_DIR=${BUILD_DIR}/build
fi
if [[ ${DISTUTILS_USE_PEP517} ]]; then
local -x PATH=${BUILD_DIR}/install${EPREFIX}/usr/bin:${PATH} local -x PATH=${BUILD_DIR}/install${EPREFIX}/usr/bin:${PATH}
else
local -x PYTHONPATH="${BUILD_DIR}/lib:${PYTHONPATH}"
# make PATH local (for historical reasons)
local -x PATH=${PATH}
if _python_impl_matches "${EPYTHON}" 3.{9..11}; then
# Undo the default switch in setuptools-60+ for the time being,
# to avoid replacing .egg-info file with directory in-place.
local -x SETUPTOOLS_USE_DISTUTILS="${SETUPTOOLS_USE_DISTUTILS:-stdlib}"
fi
# Bug 559644
# using PYTHONPATH when the ${BUILD_DIR}/lib is not created yet might lead to
# problems in setup.py scripts that try to import modules/packages from that path
# during the build process (Python at startup evaluates PYTHONPATH, if the dir is
# not valid then associates a NullImporter object to ${BUILD_DIR}/lib storing it
# in the sys.path_importer_cache)
mkdir -p "${BUILD_DIR}/lib" || die
fi
# Set up build environment, bug #513664. # Set up build environment, bug #513664.
local -x AR=${AR} CC=${CC} CPP=${CPP} CXX=${CXX} local -x AR=${AR} CC=${CC} CPP=${CPP} CXX=${CXX}
tc-export AR CC CPP CXX tc-export AR CC CPP CXX
@ -2007,13 +1650,13 @@ _distutils-r1_compare_installed_files() {
_distutils-r1_post_python_compile() { _distutils-r1_post_python_compile() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
if [[ ! ${_DISTUTILS_WHL_INSTALLED} && ${DISTUTILS_USE_PEP517:-no} != no ]] if [[ ! ${_DISTUTILS_WHL_INSTALLED} && ${DISTUTILS_USE_PEP517} != no ]]
then then
die "No wheel installed in python_compile(), did you call distutils-r1_python_compile?" die "No wheel installed in python_compile(), did you call distutils-r1_python_compile?"
fi fi
local root=${BUILD_DIR}/install local root=${BUILD_DIR}/install
if [[ ${DISTUTILS_USE_PEP517} && -d ${root} ]]; then if [[ -d ${root} ]]; then
# copy executables to python-exec directory # copy executables to python-exec directory
# we do it early so that we can alter bindir recklessly # we do it early so that we can alter bindir recklessly
local bindir=${root}${EPREFIX}/usr/bin local bindir=${root}${EPREFIX}/usr/bin
@ -2030,7 +1673,12 @@ _distutils-r1_post_python_compile() {
ln -s "${PYTHON}" "${bindir}/${EPYTHON}" || die ln -s "${PYTHON}" "${bindir}/${EPYTHON}" || die
ln -s "${EPYTHON}" "${bindir}/python3" || die ln -s "${EPYTHON}" "${bindir}/python3" || die
ln -s "${EPYTHON}" "${bindir}/python" || die ln -s "${EPYTHON}" "${bindir}/python" || die
cat > "${bindir}"/pyvenv.cfg <<-EOF || die # python3.14 changed venv logic so that:
# 1) pyvenv.cfg location explicitly determines prefix
# (i.e. we no longer can be put in bin/)
# 2) "home =" key must be present
cat > "${bindir}"/../pyvenv.cfg <<-EOF || die
home = ${EPREFIX}/usr/bin
include-system-site-packages = true include-system-site-packages = true
EOF EOF
@ -2060,32 +1708,6 @@ distutils-r1_src_compile() {
return ${ret} return ${ret}
} }
# @FUNCTION: _distutils-r1_clean_egg_info
# @INTERNAL
# @DESCRIPTION:
# Clean up potential stray egg-info files left by setuptools test phase.
# Those files ended up being unversioned, and caused issues:
# https://bugs.gentoo.org/534058
_distutils-r1_clean_egg_info() {
if [[ ${DISTUTILS_USE_PEP517} ]]; then
die "${FUNCNAME} is not implemented in PEP517 mode"
fi
rm -rf "${BUILD_DIR}"/lib/*.egg-info || die
}
# @FUNCTION: _distutils-r1_post_python_test
# @INTERNAL
# @DESCRIPTION:
# Post-phase function called after python_test.
_distutils-r1_post_python_test() {
debug-print-function ${FUNCNAME} "$@"
if [[ ! ${DISTUTILS_USE_PEP517} ]]; then
_distutils-r1_clean_egg_info
fi
}
distutils-r1_src_test() { distutils-r1_src_test() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
local ret=0 local ret=0