gentoo/dev-util/rustup/files/symlink_rustup.sh
Pepper Gray 1f03ca6b4f
dev-util/rustup: use system toolchain and ignore rust-toolchain.toml
Rustup reads rust-toolchain.toml if present in $(pwd) which may
cause undesired behavior.

Change to a temp dir bevor executing rustup to prevent this behavior.

[sam: Revbump to propagate the fix.]

Closes: https://bugs.gentoo.org/965147
Signed-off-by: Pepper Gray <hello@peppergray.xyz>
Part-of: https://github.com/gentoo/gentoo/pull/44341
Closes: https://github.com/gentoo/gentoo/pull/44341
Signed-off-by: Sam James <sam@gentoo.org>
2025-11-04 11:08:45 +00:00

166 lines
3.4 KiB
Bash

#!@GENTOO_PORTAGE_EPREFIX@/bin/bash
set -euo pipefail
IFS=$'\n\t'
SYMLINK_RUSTUP_VERSION="0.0.4"
binpath="@GENTOO_PORTAGE_EPREFIX@/usr/bin/rustup-init"
: "${CARGO_HOME:=${HOME}/.cargo}"
: "${RUSTUP_HOME:=${HOME}/.rustup}"
__err_exists="already exists, try using -u|--unsymlink option first"
# dies with optional message
die() {
[[ ${QUIET-no} ]] && echo -e "${NOCOLOR=\e[1;31m*\e[0m }ERROR: ${*}" >&2
exit 1
} # die()
# outputs gentoo-style green * prefixed message, a good one ofc
good() {
[[ ${QUIET-no} ]] && echo -e "${NOCOLOR=\e[1;32m*\e[0m }${*}"
return 0
} # good()
# do I need to explain this?
usage() {
echo "Usage: ${0} [<options>]"
} # usage()
# and this
help() {
usage
echo
echo -n "Symlink system installation of rustup to"
echo " ${CARGO_HOME}"
echo
echo "Options:"
echo " -s, --symlink Setup rustup symlinks in ${CARGO_HOME}/bin"
echo " -C, --nocolor Disable colored output"
echo " -d, --debug Debug mode (sets -x shell option)"
echo " -V, --version Print version number"
echo " -u, --unsymlink Remove rustup symlinks from ${CARGO_HOME}/bin"
echo " -q, --quiet Quiet mode"
} # help()
symlink_rustup() {
local gentoo_rust tool
# rustup calls those proxies
# src/lib.rs TOOLS
local tools=(
rustc
rustdoc
cargo
rust-lldb
rust-gdb
rust-gdbgui
rls
cargo-clippy
clippy-driver
cargo-miri
)
# src/lib.rs DUP_TOOLS
# those can be installed via cargo and not with rust itself
local dup_tools=(
rust-analyzer
rustfmt
cargo-fmt
)
# we need rustup symlink too, so add it to final list
tools+=( "${dup_tools[@]}" rustup )
gentoo_rust="$(eselect --brief rust show 2>/dev/null)"
mkdir -p "${CARGO_HOME}/bin" || die
for tool in "${tools[@]}"; do
local symlink_path="${CARGO_HOME}/bin/${tool}"
if [[ -e "${symlink_path}" ]]; then
die "${symlink_path} ${__err_exists}"
else
ln -s ${QUIET--v} "${binpath}" "${symlink_path}" || die
fi
done
# prevent reading rust-toolchain.toml from $(pwd)
pushd $(mktemp -d) > /dev/null
good "Setting gentoo ${gentoo_rust// /} as default toolchain"
[[ ${QUIET+set} != set ]] && "${CARGO_HOME}/bin/rustup" -V
"${CARGO_HOME}/bin/rustup" ${QUIET--v} toolchain link gentoo "/usr"
"${CARGO_HOME}/bin/rustup" ${QUIET--v} default gentoo
[[ ${QUIET+set} != set ]] && "${CARGO_HOME}/bin/rustup" show
popd > /dev/null
good "Prepend ${CARGO_HOME}/bin to your PATH to use rustup"
good "rustup selfupdate is disabled, it will be updated by portage"
} # symlink_rustup()
unsymlink_rustup() {
local symlinks
IFS= mapfile -d '' symlinks < <(find -L "${CARGO_HOME}/bin" \
-samefile "${binpath}" -print0 )
if [[ "${symlinks-}" ]]; then
rm -v "${symlinks[@]}" || die
else
die "already clean"
fi
}
main(){
[[ "$EUID" -eq 0 ]] && die "Running as root is not supported"
local me
me="$(basename "${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}")"
local symlink=no
local unsymlink=no
while [[ ${#} -gt 0 ]]; do
case ${1} in
-s|--symlink)
symlink=yes
;;
-u|--unsymlink)
unsymlink=yes
;;
-h|--help)
help
exit 0
;;
-V|--version)
echo "${me} ${SYMLINK_RUSTUP_VERSION:-unknown}"
exit 0
;;
-d|--debug)
set -x
;;
-C|--nocolor)
NOCOLOR=
;;
-q|--quiet)
QUIET=
;;
-*)
usage >&2
exit 1
;;
esac
shift
done
if [[ ${symlink} == yes ]]; then
symlink_rustup
elif [[ ${unsymlink} == yes ]]; then
unsymlink_rustup
else
help
fi
} # main()
main "${@}"