#!/bin/bash set -e # Manages a rustup toolchain called "miri". # # All commands set "miri" as the override toolchain for the current directory, # and make the `rust-version` file match that toolchain. # # USAGE: # # ./rustup-toolchain: Update "miri" toolchain to match `rust-version` (the known-good version for this commit). # # ./rustup-toolchain HEAD: Update "miri" toolchain and `rust-version` file to latest rustc HEAD. # # ./rustup-toolchain $COMMIT: Update "miri" toolchain and `rust-version` file to match that commit. # Make sure rustup-toolchain-install-master is installed. if ! which rustup-toolchain-install-master >/dev/null; then echo "Please install rustup-toolchain-install-master by running 'cargo install rustup-toolchain-install-master'" exit 1 fi # Determine new commit. if [[ "$1" == "" ]]; then NEW_COMMIT=$(cat rust-version) elif [[ "$1" == "HEAD" ]]; then NEW_COMMIT=$(git ls-remote https://github.com/rust-lang/rust/ HEAD | cut -f 1) else NEW_COMMIT="$1" fi echo "$NEW_COMMIT" > rust-version # Check if we already are at that commit. CUR_COMMIT=$(rustc +miri --version -v | egrep "^commit-hash: " | cut -d " " -f 2) if [[ "$CUR_COMMIT" == "$NEW_COMMIT" ]]; then echo "miri toolchain is already at commit $CUR_COMMIT." rustup override set miri exit 0 fi # Cleanup. cargo +nightly clean # Use nightly cargo as miri toolchain might be broken. rustup toolchain uninstall miri # Install and setup new toolchain. rustup-toolchain-install-master -n miri -c rust-src -c rustc-dev -- "$NEW_COMMIT" rustup override set miri