1#!/bin/bash 2set -e 3# Manages a rustup toolchain called "miri". 4# 5# All commands set "miri" as the override toolchain for the current directory, 6# and make the `rust-version` file match that toolchain. 7# 8# USAGE: 9# 10# ./rustup-toolchain: Update "miri" toolchain to match `rust-version` (the known-good version for this commit). 11# 12# ./rustup-toolchain HEAD: Update "miri" toolchain and `rust-version` file to latest rustc HEAD. 13# 14# ./rustup-toolchain $COMMIT: Update "miri" toolchain and `rust-version` file to match that commit. 15 16# Make sure rustup-toolchain-install-master is installed. 17if ! which rustup-toolchain-install-master >/dev/null; then 18 echo "Please install rustup-toolchain-install-master by running 'cargo install rustup-toolchain-install-master'" 19 exit 1 20fi 21 22# Determine new commit. 23if [[ "$1" == "" ]]; then 24 NEW_COMMIT=$(cat rust-version) 25elif [[ "$1" == "HEAD" ]]; then 26 NEW_COMMIT=$(git ls-remote https://github.com/rust-lang/rust/ HEAD | cut -f 1) 27else 28 NEW_COMMIT="$1" 29fi 30echo "$NEW_COMMIT" > rust-version 31 32# Check if we already are at that commit. 33CUR_COMMIT=$(rustc +miri --version -v 2>/dev/null | egrep "^commit-hash: " | cut -d " " -f 2) 34if [[ "$CUR_COMMIT" == "$NEW_COMMIT" ]]; then 35 echo "miri toolchain is already at commit $CUR_COMMIT." 36 rustup override set miri 37 exit 0 38fi 39 40# Install and setup new toolchain. 41rustup toolchain uninstall miri 42rustup-toolchain-install-master -n miri -c cargo -c rust-src -c rustc-dev -c llvm-tools -- "$NEW_COMMIT" 43rustup override set miri 44 45# Cleanup. 46cargo clean 47