blob: 5a0887c35c9bf568b504fa4eea8aadf883924dec [file] [log] [blame]
#!/bin/bash
#
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Install the rust toolchain to specified version and variant
RUSTUP="${RUSTDIR}/bin/rustup"
function die {
echo "$@" >/dev/stderr
exit 1
}
function try {
echo "$@"
"$@" || die "Failed to execute '$@': exited with return code $?"
}
function in-dir {
local directory="$1"; shift
local exitcode=""
echo "Entering directory ${directory}"
(cd "$directory" && "$@")
exitcode="$?"
echo "Leaving directory ${directory}"
if [[ "${exitcode}" != "0" ]]; then
die "Failed to execute '$@': exited with return code ${exitcode}"
fi
}
function main {
local usage="Usage: install-rust-toolchain.sh [-v <version> | -p <project-dir>] <target-to-install>"
local args=$(getopt -o hv:p: \
--long help,version:,project: \
-n install-rust-toolchain.sh -- "$@")
eval set -- "$args"
local version=""
local project_dir=""
while true; do
case "$1" in
-v|--version)
version="$2"
shift
shift
;;
-p|--project)
project_dir="$2"
shift
shift
;;
-h|--help)
die "$usage"
;;
--)
shift
break
;;
esac
done
if [[ ! -z "${version}" && ! -z "${project_dir}" ]]; then
echo "${usage}"
echo
die "-p and -v are mutually exclusive."
fi
local target="$1"; shift
try mkdir -p "${RUSTDIR}"
if [[ ! -f "${RUSTUP}" ]]; then
local yesorno=""
echo "========================================================================"
echo "Rustup not found locally -- do you want to install it?"
echo
echo "Please verify that you understand this will fetch binaries"
echo "from potentially untrusted sources. Googlers *must* use"
echo "internally verified builds of the rust compiler toolchains from"
echo "the internal toolchain tarball repository instead. Do not use this"
echo "tool to install Rust locally!"
echo
read -p "Type YES (in all caps) to proceed: " yesorno
[[ "${yesorno}" != "YES" ]] && die "User did not indicate agreement."
try "${ROOTDIR}/scripts/thirdparty/rustup-install.sh" -y
fi
if [[ -f "${project_dir}" ]]; then
# The project specifies its own version of the rust toolchain, and the
# user is pointing to its specification files, so let rustup use that to
# install the needed toolchain.
local project_dir=$(dirname $(realpath "${project_dir}"))
echo "Installing the rust toolchain for project ${project_dir}..."
try in-dir "${project_dir}" "${RUSTUP}" target add "${target}"
elif [[ ! -z "${version}" ]]; then
# We're being asked to install a specific version of the rust toolchain.
echo "Installing rust toolchain ${version} for target ${target}..."
try "${RUSTUP}" "+${version}" target add "${target}"
else
die "One of -p or -v must be specified."
fi
}
if [[ "$EUID" == 0 ]]; then
die "This script must NOT be run as root."
fi
if [[ -z "${ROOTDIR}" || -z "${RUSTDIR}" ]]; then
die "Source build/setup.sh first"
fi
main "$@"