rust.eclass: add ERUST_{SLOT,TYPE}_OVERRIDE user variables

These variables enable users (though most likely Gentoo developers)
to override the selection of the Rust implementation by the eclass.

This means that _only_ the specified SLOT and/or TYPE ('source'/'binary')
will be checked for, with the eclass `die`ing with
"No Rust slot satisfying the package's dependencies..." if the
selected impl is not available.

These variables are intended to enable reproducing bugs and testing
packages against specific dev-lang/rust{,-bin} packages; they must
not be set in ebuilds.

Closes: https://bugs.gentoo.org/945752
Signed-off-by: Matt Jolly <kangie@gentoo.org>
This commit is contained in:
Matt Jolly
2024-12-03 22:22:37 +10:00
parent f425fb09c3
commit d1ef411b6e

View File

@@ -102,6 +102,26 @@ declare -a -g -r _RUST_SLOTS_ORDERED=(
"1.54.0"
)
# == user control knobs ==
# @ECLASS_VARIABLE: ERUST_SLOT_OVERRIDE
# @USER_VARIABLE
# @DESCRIPTION:
# Specify the version (slot) of Rust to be used by the package. This is
# useful for troubleshooting and debugging purposes; If unset, the newest
# acceptable Rust version will be used. May be combined with ERUST_TYPE_OVERRIDE.
# This variable must not be set in ebuilds.
# @ECLASS_VARIABLE: ERUST_TYPE_OVERRIDE
# @USER_VARIABLE
# @DESCRIPTION:
# Specify the type of Rust to be used by the package from options:
# 'source' or 'binary' (-bin). This is useful for troubleshooting and
# debugging purposes. If unset, the standard eclass logic will be used
# to determine the type of Rust to use (i.e. prefer source if binary
# is also available). May be combined with ERUST_SLOT_OVERRIDE.
# This variable must not be set in ebuilds.
# == control variables ==
# @ECLASS_VARIABLE: RUST_MAX_VER
@@ -336,6 +356,10 @@ _get_rust_slot() {
fi
fi
if [[ -n "${ERUST_SLOT_OVERRIDE}" && "${slot}" != "${ERUST_SLOT_OVERRIDE}" ]]; then
continue
fi
# If we're in LLVM mode we can skip any slots that don't match the selected USE
if [[ -n "${RUST_NEEDS_LLVM}" ]]; then
if [[ "${llvm_slot}" != "${llvm_r1_slot}" ]]; then
@@ -349,12 +373,27 @@ _get_rust_slot() {
rust_check_deps && return
else
local usedep="${RUST_REQ_USE+[${RUST_REQ_USE}]}"
# When checking for installed packages prefer the non `-bin` package
# When checking for installed packages prefer the source package;
# if effort was put into building it we should use it.
local rust_pkgs=(
"dev-lang/rust:${slot}${usedep}"
"dev-lang/rust-bin:${slot}${usedep}"
)
local rust_pkgs
case "${ERUST_TYPE_OVERRIDE}" in
source)
rust_pkgs=(
"dev-lang/rust:${slot}${usedep}"
)
;;
binary)
rust_pkgs=(
"dev-lang/rust-bin:${slot}${usedep}"
)
;;
*)
rust_pkgs=(
"dev-lang/rust:${slot}${usedep}"
"dev-lang/rust-bin:${slot}${usedep}"
)
;;
esac
local _pkg
for _pkg in "${rust_pkgs[@]}"; do
if has_version "${hv_switch}" "${_pkg}"; then