summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2025-04-03 01:34:02 +0100
committerV3n3RiX <venerix@koprulu.sector>2025-04-03 01:34:02 +0100
commit476528d7a16cfe2435b30ebd74783eea6925db5f (patch)
tree7272fd6469aed7e7f83598430e378aec9ce0dbff /eclass
parent6be74aaad3f65bab8561cebfef177dc28d802d9f (diff)
gentoo auto-resync : 03:04:2025 - 01:34:01
Diffstat (limited to 'eclass')
-rw-r--r--eclass/Manifest.gzbin40353 -> 40350 bytes
-rw-r--r--eclass/cmake.eclass20
-rw-r--r--eclass/distutils-r1.eclass313
3 files changed, 190 insertions, 143 deletions
diff --git a/eclass/Manifest.gz b/eclass/Manifest.gz
index e41b89498643..9e18b4ab9772 100644
--- a/eclass/Manifest.gz
+++ b/eclass/Manifest.gz
Binary files differ
diff --git a/eclass/cmake.eclass b/eclass/cmake.eclass
index 8079a5cb037b..e1bad4cbd16f 100644
--- a/eclass/cmake.eclass
+++ b/eclass/cmake.eclass
@@ -1,4 +1,4 @@
-# Copyright 1999-2024 Gentoo Authors
+# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: cmake.eclass
@@ -681,6 +681,19 @@ cmake-utils_src_make() {
die "cmake-utils_src_make is banned. Use cmake_build instead"
}
+# @ECLASS_VARIABLE: CTEST_JOBS
+# @USER_VARIABLE
+# @DESCRIPTION:
+# Maximum number of CTest jobs to run in parallel. If unset, the value
+# will be determined from make options.
+
+# @ECLASS_VARIABLE: CTEST_LOADAVG
+# @USER_VARIABLE
+# @DESCRIPTION:
+# Maximum load, over which no new jobs will be started by CTest. Note
+# that unlike make, CTest will not start *any* jobs if the load
+# is exceeded. If unset, the value will be determined from make options.
+
# @FUNCTION: cmake_src_test
# @DESCRIPTION:
# Function for testing the package. Automatically detects the build type.
@@ -694,8 +707,9 @@ cmake_src_test() {
[[ -n ${TEST_VERBOSE} ]] && myctestargs+=( --extra-verbose --output-on-failure )
[[ -n ${CMAKE_SKIP_TESTS} ]] && myctestargs+=( -E '('$( IFS='|'; echo "${CMAKE_SKIP_TESTS[*]}")')' )
- set -- ctest -j "$(makeopts_jobs "${MAKEOPTS}" 999)" \
- --test-load "$(makeopts_loadavg)" "${myctestargs[@]}" "$@"
+ set -- ctest -j "${CTEST_JOBS:-$(get_makeopts_jobs 999)}" \
+ --test-load "${CTEST_LOADAVG:-$(get_makeopts_loadavg)}" \
+ "${myctestargs[@]}" "$@"
echo "$@" >&2
if "$@" ; then
einfo "Tests succeeded."
diff --git a/eclass/distutils-r1.eclass b/eclass/distutils-r1.eclass
index a65dd3ef2a8f..e1672dd3c3b0 100644
--- a/eclass/distutils-r1.eclass
+++ b/eclass/distutils-r1.eclass
@@ -1,4 +1,4 @@
-# Copyright 1999-2024 Gentoo Authors
+# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: distutils-r1.eclass
@@ -137,6 +137,8 @@
# - standalone - standalone build systems without external deps
# (used for bootstrapping).
#
+# - uv-build - uv-build backend (using dev-python/uv)
+#
# The variable needs to be set before the inherit line. The eclass
# adds appropriate build-time dependencies and verifies the value.
#
@@ -151,6 +153,20 @@
# files are found in ${BUILD_DIR}/install after python_install(), they
# will be merged into ${D}.
+# @ECLASS_VARIABLE: DISTUTILS_UPSTREAM_PEP517
+# @DESCRIPTION:
+# Specifies the PEP517 build backend used upstream. It is used
+# by the eclass to verify the correctness of DISTUTILS_USE_PEP517,
+# and matches DISTUTILS_USE_PEP517 by default. However, it can be
+# overriden to workaround the eclass check, when it is desirable
+# to build the wheel using other backend than the one used upstream.
+#
+# Please note that even in packages using PEP621 metadata, there can
+# be subtle differences between the behavior of different PEP517 build
+# backends, for example regarding finding package files. When using
+# this option, please make sure that the package is installed correctly.
+: "${DISTUTILS_UPSTREAM_PEP517:=${DISTUTILS_USE_PEP517}}"
+
# @ECLASS_VARIABLE: DISTUTILS_USE_SETUPTOOLS
# @DEFAULT_UNSET
# @PRE_INHERIT
@@ -246,22 +262,23 @@ _distutils_set_globals() {
fi
bdep='
- >=dev-python/gpep517-15[${PYTHON_USEDEP}]
+ >=dev-python/gpep517-16[${PYTHON_USEDEP}]
'
case ${DISTUTILS_USE_PEP517} in
flit)
bdep+='
- >=dev-python/flit-core-3.9.0[${PYTHON_USEDEP}]
+ >=dev-python/flit-core-3.11.0[${PYTHON_USEDEP}]
'
;;
flit_scm)
bdep+='
+ >=dev-python/flit-core-3.11.0[${PYTHON_USEDEP}]
>=dev-python/flit-scm-1.7.0[${PYTHON_USEDEP}]
'
;;
hatchling)
bdep+='
- >=dev-python/hatchling-1.21.1[${PYTHON_USEDEP}]
+ >=dev-python/hatchling-1.27.0[${PYTHON_USEDEP}]
'
;;
jupyter)
@@ -271,7 +288,7 @@ _distutils_set_globals() {
;;
maturin)
bdep+='
- >=dev-util/maturin-1.7.4[${PYTHON_USEDEP}]
+ >=dev-util/maturin-1.8.2[${PYTHON_USEDEP}]
'
;;
no)
@@ -280,41 +297,46 @@ _distutils_set_globals() {
;;
meson-python)
bdep+='
- >=dev-python/meson-python-0.15.0[${PYTHON_USEDEP}]
+ >=dev-python/meson-python-0.17.1[${PYTHON_USEDEP}]
'
;;
pbr)
bdep+='
- >=dev-python/pbr-6.0.0[${PYTHON_USEDEP}]
+ >=dev-python/pbr-6.1.1[${PYTHON_USEDEP}]
'
;;
pdm-backend)
bdep+='
- >=dev-python/pdm-backend-2.1.8[${PYTHON_USEDEP}]
+ >=dev-python/pdm-backend-2.4.3[${PYTHON_USEDEP}]
'
;;
poetry)
bdep+='
- >=dev-python/poetry-core-1.9.0[${PYTHON_USEDEP}]
+ >=dev-python/poetry-core-2.1.1[${PYTHON_USEDEP}]
'
;;
scikit-build-core)
bdep+='
- >=dev-python/scikit-build-core-0.9.4[${PYTHON_USEDEP}]
+ >=dev-python/scikit-build-core-0.10.7[${PYTHON_USEDEP}]
'
;;
setuptools)
bdep+='
- >=dev-python/setuptools-69.0.3[${PYTHON_USEDEP}]
+ >=dev-python/setuptools-75.8.2[${PYTHON_USEDEP}]
'
;;
sip)
bdep+='
- >=dev-python/sip-6.8.3[${PYTHON_USEDEP}]
+ >=dev-python/sip-6.10.0[${PYTHON_USEDEP}]
'
;;
standalone)
;;
+ uv-build)
+ bdep+='
+ dev-python/uv-build[${PYTHON_USEDEP}]
+ '
+ ;;
*)
die "Unknown DISTUTILS_USE_PEP517=${DISTUTILS_USE_PEP517}"
;;
@@ -325,7 +347,7 @@ _distutils_set_globals() {
eqawarn "is enabled."
fi
else
- local setuptools_dep='>=dev-python/setuptools-69.0.3[${PYTHON_USEDEP}]'
+ local setuptools_dep='>=dev-python/setuptools-75.8.2[${PYTHON_USEDEP}]'
case ${DISTUTILS_USE_SETUPTOOLS:-bdepend} in
no|manual)
@@ -501,7 +523,7 @@ distutils_enable_sphinx() {
_DISTUTILS_SPHINX_PLUGINS=( "${@}" )
local deps autodoc=1 d
- deps=">=dev-python/sphinx-7.2.6[\${PYTHON_USEDEP}]"
+ deps=">=dev-python/sphinx-8.1.3[\${PYTHON_USEDEP}]"
for d; do
if [[ ${d} == --no-autodoc ]]; then
autodoc=
@@ -525,7 +547,7 @@ distutils_enable_sphinx() {
use doc || return 0
local p
- for p in ">=dev-python/sphinx-7.2.6" \
+ for p in ">=dev-python/sphinx-8.1.3" \
"${_DISTUTILS_SPHINX_PLUGINS[@]}"
do
python_has_version "${p}[${PYTHON_USEDEP}]" ||
@@ -533,7 +555,7 @@ distutils_enable_sphinx() {
done
}
else
- deps=">=dev-python/sphinx-7.2.6"
+ deps=">=dev-python/sphinx-8.1.3"
fi
sphinx_compile_all() {
@@ -904,6 +926,12 @@ _distutils-r1_print_package_versions() {
dev-python/sip
)
;;
+ uv-build)
+ packages+=(
+ dev-python/uv
+ dev-python/uv-build
+ )
+ ;;
esac
else
case ${DISTUTILS_USE_SETUPTOOLS} in
@@ -1050,55 +1078,57 @@ _distutils-r1_copy_egg_info() {
find -name '*.egg-info' -type d -exec cp -R -p {} "${BUILD_DIR}"/ ';' || die
}
-# @FUNCTION: _distutils-r1_backend_to_key
-# @USAGE: <backend>
+# @FUNCTION: _distutils-r1_key_to_backend
+# @USAGE: <key>
# @INTERNAL
# @DESCRIPTION:
-# Print the DISTUTILS_USE_PEP517 value corresponding to the backend
-# passed as the only argument.
-_distutils-r1_backend_to_key() {
+# Print the backend corresponding to the DISTUTILS_USE_PEP517 value.
+_distutils-r1_key_to_backend() {
debug-print-function ${FUNCNAME} "$@"
- local backend=${1}
- case ${backend} in
- flit_core.buildapi|flit.buildapi)
- echo flit
+ local key=${1}
+ case ${key} in
+ flit)
+ echo flit_core.buildapi
;;
- flit_scm:buildapi)
- echo flit_scm
+ flit_scm)
+ echo flit_scm:buildapi
;;
- hatchling.build)
- echo hatchling
+ hatchling)
+ echo hatchling.build
;;
- jupyter_packaging.build_api)
- echo jupyter
+ jupyter)
+ echo jupyter_packaging.build_api
;;
maturin)
echo maturin
;;
- mesonpy)
- echo meson-python
+ meson-python)
+ echo mesonpy
+ ;;
+ pbr)
+ echo pbr.build
;;
- pbr.build)
- echo pbr
+ pdm-backend)
+ echo pdm.backend
;;
- pdm.backend|pdm.pep517.api)
- echo pdm-backend
+ poetry)
+ echo poetry.core.masonry.api
;;
- poetry.core.masonry.api|poetry.masonry.api)
- echo poetry
+ scikit-build-core)
+ echo scikit_build_core.build
;;
- scikit_build_core.build)
- echo scikit-build-core
+ setuptools)
+ echo setuptools.build_meta
;;
- setuptools.build_meta|setuptools.build_meta:__legacy__)
- echo setuptools
+ sip)
+ echo sipbuild.api
;;
- sipbuild.api)
- echo sip
+ uv-build)
+ echo uv_build
;;
*)
- die "Unknown backend: ${backend}"
+ die "Unknown DISTUTILS_USE_PEP517 key: ${key}"
;;
esac
}
@@ -1111,65 +1141,61 @@ _distutils-r1_backend_to_key() {
_distutils-r1_get_backend() {
debug-print-function ${FUNCNAME} "$@"
- local build_backend legacy_fallback
+ local build_backend
if [[ -f pyproject.toml ]]; then
# if pyproject.toml exists, try getting the backend from it
# NB: this could fail if pyproject.toml doesn't list one
build_backend=$("${EPYTHON}" -m gpep517 get-backend)
fi
- if [[ -z ${build_backend} && ${DISTUTILS_USE_PEP517} == setuptools &&
- -f setup.py ]]
- then
- # use the legacy setuptools backend as a fallback
- build_backend=setuptools.build_meta:__legacy__
- legacy_fallback=1
- fi
if [[ -z ${build_backend} ]]; then
- die "Unable to obtain build-backend from pyproject.toml"
- fi
-
- if [[ ${DISTUTILS_USE_PEP517} != standalone ]]; then
- # verify whether DISTUTILS_USE_PEP517 was set correctly
- local expected_value=$(_distutils-r1_backend_to_key "${build_backend}")
- if [[ ${DISTUTILS_USE_PEP517} != ${expected_value} ]]; then
- eerror "DISTUTILS_USE_PEP517 does not match pyproject.toml!"
- eerror " have: DISTUTILS_USE_PEP517=${DISTUTILS_USE_PEP517}"
- eerror "expected: DISTUTILS_USE_PEP517=${expected_value}"
- eerror "(backend: ${build_backend})"
- die "DISTUTILS_USE_PEP517 value incorrect"
+ if [[ ${DISTUTILS_USE_PEP517} == setuptools && -f setup.py ]]
+ then
+ # use the legacy setuptools backend as a fallback
+ echo setuptools.build_meta:__legacy__
+ return
+ else
+ die "Unable to obtain build-backend from pyproject.toml"
fi
+ fi
- # fix deprecated backends up
- local new_backend=
+ if [[ ${DISTUTILS_USE_PEP517} == standalone ]]; then
+ echo "${build_backend}"
+ return
+ fi
+
+ # verify that the ebuild correctly specifies the build backend
+ local expected_backend=$(_distutils-r1_key_to_backend "${DISTUTILS_UPSTREAM_PEP517}")
+ if [[ ${expected_backend} != ${build_backend} ]]; then
+ # special-case deprecated backends
case ${build_backend} in
flit.buildapi)
- new_backend=flit_core.buildapi
;;
pdm.pep517.api)
- new_backend=pdm.backend
;;
poetry.masonry.api)
- new_backend=poetry.core.masonry.api
;;
setuptools.build_meta:__legacy__)
- # this backend should only be used as implicit fallback
- [[ ! ${legacy_fallback} ]] &&
- new_backend=setuptools.build_meta
;;
+ uv)
+ ;;
+ *)
+ eerror "DISTUTILS_UPSTREAM_PEP517 does not match pyproject.toml!"
+ eerror " DISTUTILS_UPSTREAM_PEP517=${DISTUTILS_USE_PEP517}"
+ eerror " implies backend: ${expected_backend}"
+ eerror " pyproject.toml: ${build_backend}"
+ die "DISTUTILS_USE_PEP517 value incorrect"
esac
- if [[ -n ${new_backend} ]]; then
- if [[ ! -f ${T}/.distutils_deprecated_backend_warned ]]; then
- eqawarn "${build_backend} backend is deprecated. Please see:"
- eqawarn "https://projects.gentoo.org/python/guide/qawarn.html#deprecated-pep-517-backends"
- eqawarn "The eclass will be using ${new_backend} instead."
- > "${T}"/.distutils_deprecated_backend_warned || die
- fi
- build_backend=${new_backend}
+ # if we didn't die, we're dealing with a deprecated backend
+ if [[ ! -f ${T}/.distutils_deprecated_backend_warned ]]; then
+ eqawarn "${build_backend} backend is deprecated. Please see:"
+ eqawarn "https://projects.gentoo.org/python/guide/qawarn.html#deprecated-pep-517-backends"
+ eqawarn "The project should use ${expected_backend} instead."
+ > "${T}"/.distutils_deprecated_backend_warned || die
fi
fi
- echo "${build_backend}"
+ echo "$(_distutils-r1_key_to_backend "${DISTUTILS_USE_PEP517}")"
}
# @FUNCTION: distutils_wheel_install
@@ -1220,6 +1246,8 @@ distutils_wheel_install() {
-o -path '*.dist-info/licenses' \
-o -path '*.dist-info/zip-safe' \
\) -delete || die
+
+ _DISTUTILS_WHL_INSTALLED=1
}
# @VARIABLE: DISTUTILS_WHEEL_PATH
@@ -1258,6 +1286,7 @@ distutils_pep517_install() {
fi
# set it globally in case we were using "standalone" wrapper
+ local -x FLIT_ALLOW_INVALID=1
local -x HATCH_METADATA_CLASSIFIERS_NO_VERIFY=1
local -x VALIDATE_PYPROJECT_NO_NETWORK=1
local -x VALIDATE_PYPROJECT_NO_TROVE_CLASSIFIERS=1
@@ -1457,67 +1486,66 @@ distutils-r1_python_compile() {
_python_check_EPYTHON
- case ${DISTUTILS_USE_PEP517:-unset} in
- no)
- return
- ;;
- unset)
- # legacy mode
- _distutils-r1_copy_egg_info
- esetup.py build -j "$(makeopts_jobs "${MAKEOPTS} ${*}")" "${@}"
- ;;
- *)
- # we do this for all build systems, since other backends
- # and custom hooks may wrap setuptools
- mkdir -p "${BUILD_DIR}" || die
- local -x DIST_EXTRA_CONFIG="${BUILD_DIR}/extra-setup.cfg"
- cat > "${DIST_EXTRA_CONFIG}" <<-EOF || die
- [build]
- build_base = ${BUILD_DIR}/build
-
- [build_ext]
- parallel = $(makeopts_jobs "${MAKEOPTS} ${*}")
- EOF
- ;;
- esac
+ [[ ${DISTUTILS_USE_PEP517} == no ]] && return
- if [[ ${DISTUTILS_USE_PEP517} ]]; then
- if [[ ${DISTUTILS_ALLOW_WHEEL_REUSE} ]]; then
- local whl
- for whl in "${!DISTUTILS_WHEELS[@]}"; do
- # use only wheels corresponding to the current directory
- if [[ ${PWD} != ${DISTUTILS_WHEELS["${whl}"]} ]]; then
- continue
- fi
+ if [[ ! ${DISTUTILS_USE_PEP517} ]]; then
+ # legacy mode
+ _distutils-r1_copy_egg_info
+ esetup.py build -j "$(makeopts_jobs "${MAKEOPTS} ${*}")" "${@}"
+ return
+ fi
- # 1. Use pure Python wheels only if we're not expected
- # to build extensions. Otherwise, we may end up
- # not building the extension at all when e.g. PyPy3
- # is built without one.
- #
- # 2. For CPython, we can reuse stable ABI wheels. Note
- # that this relies on the assumption that we're building
- # from the oldest to the newest implementation,
- # and the wheels are forward-compatible.
- if [[
- ( ! ${DISTUTILS_EXT} && ${whl} == *py3-none-any* ) ||
- (
- ${EPYTHON} == python* &&
- # freethreading does not support stable ABI
- # at the moment
- ${EPYTHON} != *t &&
- ${whl} == *-abi3-*
- )
- ]]; then
- distutils_wheel_install "${BUILD_DIR}/install" "${whl}"
- return
- fi
- done
- fi
+ # we do this for all build systems, since other backends
+ # and custom hooks may wrap setuptools
+ #
+ # we are appending a dynamic component so that
+ # distutils-r1_python_compile can be called multiple
+ # times and don't end up combining resulting packages
+ mkdir -p "${BUILD_DIR}" || die
+ local -x DIST_EXTRA_CONFIG="${BUILD_DIR}/extra-setup.cfg"
+ cat > "${DIST_EXTRA_CONFIG}" <<-EOF || die
+ [build]
+ build_base = ${BUILD_DIR}/build${#DISTUTILS_WHEELS[@]}
+
+ [build_ext]
+ parallel = $(makeopts_jobs "${MAKEOPTS} ${*}")
+ EOF
+
+ if [[ ${DISTUTILS_ALLOW_WHEEL_REUSE} ]]; then
+ local whl
+ for whl in "${!DISTUTILS_WHEELS[@]}"; do
+ # use only wheels corresponding to the current directory
+ if [[ ${PWD} != ${DISTUTILS_WHEELS["${whl}"]} ]]; then
+ continue
+ fi
- distutils_pep517_install "${BUILD_DIR}/install"
- DISTUTILS_WHEELS+=( "${DISTUTILS_WHEEL_PATH}" "${PWD}" )
+ # 1. Use pure Python wheels only if we're not expected
+ # to build extensions. Otherwise, we may end up
+ # not building the extension at all when e.g. PyPy3
+ # is built without one.
+ #
+ # 2. For CPython, we can reuse stable ABI wheels. Note
+ # that this relies on the assumption that we're building
+ # from the oldest to the newest implementation,
+ # and the wheels are forward-compatible.
+ if [[
+ ( ! ${DISTUTILS_EXT} && ${whl} == *py3-none-any* ) ||
+ (
+ ${EPYTHON} == python* &&
+ # freethreading does not support stable ABI
+ # at the moment
+ ${EPYTHON} != *t &&
+ ${whl} == *-abi3-*
+ )
+ ]]; then
+ distutils_wheel_install "${BUILD_DIR}/install" "${whl}"
+ return
+ fi
+ done
fi
+
+ distutils_pep517_install "${BUILD_DIR}/install"
+ DISTUTILS_WHEELS+=( "${DISTUTILS_WHEEL_PATH}" "${PWD}" )
}
# @FUNCTION: _distutils-r1_wrap_scripts
@@ -1985,6 +2013,11 @@ _distutils-r1_compare_installed_files() {
_distutils-r1_post_python_compile() {
debug-print-function ${FUNCNAME} "$@"
+ if [[ ! ${_DISTUTILS_WHL_INSTALLED} && ${DISTUTILS_USE_PEP517:-no} != no ]]
+ then
+ die "No wheel installed in python_compile(), did you call distutils-r1_python_compile?"
+ fi
+
local root=${BUILD_DIR}/install
if [[ ${DISTUTILS_USE_PEP517} && -d ${root} ]]; then
# copy executables to python-exec directory