| #!/bin/bash | |
| # Copyright 2025 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| #### CATEGORY=Toolchain | |
| #### PREBUILTS=${PREBUILT_BB} ${PREBUILT_CAS} ${PREBUILT_JQ} | |
| ### Download the Rust toolchain to the latest green build from toolchain.ci | |
| ## usage: fx download-rust-toolchain [x64|arm64] | |
| ## | |
| ## This script downloads the latest green build of the Rust toolchain | |
| ## for the specified architecture (x64 or arm64) and places | |
| ## it in '//local/rust'. It also provides instructions on how to | |
| ## configure your build to use this toolchain. | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $? | |
| fx-config-read | |
| function usage { | |
| fx-command-help download-rust-toolchain | |
| exit 1 | |
| } | |
| if [ -z "$1" ]; then | |
| echo "Error: Architecture (x64 or arm64) argument required." | |
| usage | |
| fi | |
| ARCH=$1 | |
| BUILDER="" | |
| if [ "${ARCH}" == "x64" ]; then | |
| BUILDER="fuchsia/toolchain.ci/rust-linux-x64" | |
| elif [ "${ARCH}" == "arm64" ]; then | |
| BUILDER="fuchsia/toolchain.ci/rust-linux-arm64" | |
| else | |
| echo "Error: Invalid architecture '${ARCH}'. Must be 'x64' or 'arm64'." | |
| usage | |
| fi | |
| set -e | |
| DOWNLOAD_DIR="$(git rev-parse --show-toplevel)/local/rust" | |
| # Check for jq | |
| if ! command -v jq &> /dev/null | |
| then | |
| echo "jq could not be found, please install it." >&2 | |
| exit 1 | |
| fi | |
| BB_TOOL="$(git rev-parse --show-toplevel)/prebuilt/tools/buildbucket/bb" | |
| # Check for bb | |
| if [ ! -x "${BB_TOOL}" ]; then | |
| echo "bb tool not found or not executable at ${BB_TOOL}" >&2 | |
| exit 1 | |
| fi | |
| # Check if logged in with bb | |
| if ! "${BB_TOOL}" auth-info >/dev/null 2>&1; then | |
| echo "Login required, run \`${BB_TOOL} auth-login\`" >&2 | |
| exit 1 | |
| fi | |
| # Check for cas | |
| CAS_TOOL="$(git rev-parse --show-toplevel)/prebuilt/tools/cas/cas" | |
| if [ ! -x "${CAS_TOOL}" ]; then | |
| echo "cas tool not found or not executable at ${CAS_TOOL}" >&2 | |
| exit 1 | |
| fi | |
| # Check if logged in with cas | |
| if ! "${CAS_TOOL}" whoami >/dev/null 2>&1; then | |
| echo "Login required, run \`${CAS_TOOL} login\`" >&2 | |
| exit 1 | |
| fi | |
| echo "Fetching latest green build for ${BUILDER}..." | |
| BUILD_INFO=$("${BB_TOOL}" ls ${BUILDER} -status SUCCESS -n 1 -json) | |
| if [ -z "${BUILD_INFO}" ] || [ "${BUILD_INFO}" == "[]" ]; then | |
| echo "Error: No successful builds found for ${BUILDER}." >&2 | |
| exit 1 | |
| fi | |
| BUILD_ID=$(echo "${BUILD_INFO}" | jq -s -r '.[0].id') | |
| if [ -z "${BUILD_ID}" ] || [ "${BUILD_ID}" == "null" ]; then | |
| echo "Could not find latest green build ID." >&2 | |
| exit 1 | |
| fi | |
| echo "Fetching details for build ${BUILD_ID}..." | |
| BUILD_DETAILS=$("${BB_TOOL}" get ${BUILD_ID} -json -p) | |
| CAS_DIGEST=$(echo "${BUILD_DETAILS}" | jq -r '.output.properties.isolated') | |
| if [ -z "${CAS_DIGEST}" ] || [ "${CAS_DIGEST}" == "null" ]; then | |
| echo "Could not find output.properties.isolated in build details for build ${BUILD_ID}." >&2 | |
| echo "Build Details: ${BUILD_DETAILS}" >&2 # Debug output | |
| exit 1 | |
| fi | |
| echo "Found latest green build ID: ${BUILD_ID}" | |
| echo "Found CAS digest: ${CAS_DIGEST}" | |
| echo "Cleaning up old artifacts in ${DOWNLOAD_DIR}..." | |
| rm -rf "${DOWNLOAD_DIR}" | |
| mkdir -p "${DOWNLOAD_DIR}" | |
| echo "Downloading artifacts to ${DOWNLOAD_DIR}..." | |
| "${CAS_TOOL}" download -cas-instance projects/chromium-swarm/instances/default_instance -digest "${CAS_DIGEST}" -dir "${DOWNLOAD_DIR}" | |
| echo "Download complete." | |
| echo "To use this toolchain, modify your GN arguments (using fx args) to include:" | |
| echo " rustc_prefix = \"//local/rust\"" | |
| echo "" | |
| echo "And add the following to universe_package_labels:" | |
| echo ' universe_package_labels = [' | |
| echo ' "//vendor/google/bundles/kitchen_sink",' | |
| echo ' "//vendor/google/bundles/buildbot/core",' | |
| echo ' ]' | |
| echo "" | |
| echo "Then run: fx build" |