| #!/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 2>/dev/null | 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 |
| |
| # Install and setup new toolchain. |
| rustup toolchain uninstall miri |
| rustup-toolchain-install-master -n miri -c cargo -c rust-src -c rustc-dev -c llvm-tools -- "$NEW_COMMIT" |
| rustup override set miri |
| |
| # Cleanup. |
| cargo clean |