X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=miri;h=47ff5024fc63356b44da641c12aadfe4c6855771;hb=a458cf3fe619764abd938eb6d5b27dd261bd8127;hp=99ae7c5811eec5a7cf75a81c4d7496f28de4ca02;hpb=eb85ced8c730ad6a0f0518dfd7db3166a18e8108;p=rust.git diff --git a/miri b/miri index 99ae7c5811e..47ff5024fc6 100755 --- a/miri +++ b/miri @@ -1,39 +1,144 @@ #!/bin/sh set -e -TARGET=$(rustc --print target-spec-json -Z unstable-options | jq '.["llvm-target"]' -r) +USAGE=$(cat <<"EOF" + COMMANDS + +./miri install : +Installs the miri driver and cargo-miri. are passed to `cargo +install`. Sets up the rpath such that the installed binary should work in any +working directory. + +./miri build : +Just build miri. are passed to `cargo build`. + +./miri check : +Just check miri. are passed to `cargo check`. + +./miri test : +Build miri, set up a sysroot and then run the test suite. are passed +to the final `cargo test` invocation. + +./miri run : +Build miri, set up a sysroot and then run the driver with the given . + +All commands also exist in a "-debug" variant (e.g. "./miri run-debug +") which uses debug builds instead of release builds, for faster build +times and slower execution times. + + ENVIRONMENT VARIABLES + +MIRI_SYSROOT: +If already set, the "sysroot setup" step is skipped. + +CARGO_EXTRA_FLAGS: +Pass extra flags to all cargo invocations. +EOF +) + +## Preparation +TARGET=$(rustc --version --verbose | grep "^host:" | cut -d ' ' -f 2) SYSROOT=$(rustc --print sysroot) +LIBDIR=$SYSROOT/lib/rustlib/$TARGET/lib +if ! test -d "$LIBDIR"; then + echo "Something went wrong determining the library dir." + echo "I got $LIBDIR but that does not exist." + echo "Please report a bug at https://github.com/rust-lang/miri/issues." + exit 2 +fi # We set the rpath so that Miri finds the private rustc libraries it needs. # We enable debug-assertions to get tracing. # We enable line-only debuginfo for backtraces. -export RUSTFLAGS="-C link-args=-Wl,-rpath,$SYSROOT/lib/rustlib/$TARGET/lib -C debug-assertions -C debuginfo=1" +export RUSTFLAGS="-C link-args=-Wl,-rpath,$LIBDIR -C debug-assertions -C debuginfo=1 $RUSTC_EXTRA_FLAGS" -COMMAND="$1" -shift +## Helper functions -case "$COMMAND" in -install) - exec cargo install --path "$(dirname "$0")" --force --locked --offline - ;; -build|test|run) - # Basic build - cargo build --release - - # We we want to just build, we are done. - if [ "$COMMAND" = "build" ]; then exit 0; fi +# Build a sysroot and set MIRI_SYSROOT to use it. Arguments are passed to `cargo miri setup`. +build_sysroot() { + # Build once, for the user to see. + cargo run $CARGO_BUILD_FLAGS --bin cargo-miri -- miri setup "$@" + # Call again, to just set env var. + export MIRI_SYSROOT="$(cargo run $CARGO_BUILD_FLAGS -q --bin cargo-miri -- miri setup --print-sysroot "$@")" +} - # Get ourselves a sysroot +# Prepare and set MIRI_SYSROOT. Respects `MIRI_TEST_TARGET` and takes into account +# locally built vs. distributed rustc. +find_sysroot() { if [ -n "$MIRI_SYSROOT" ]; then - # sysroot already set - true - elif echo "$SYSROOT" | egrep -q 'build/[^/]+/stage'; then - # a local rustc build, assume we have a proper libstd in $SYSROOT - true + # Sysroot already set, use that. + return 0 + fi + # We need to build a sysroot. + if [ -n "$MIRI_TEST_TARGET" ]; then + build_sysroot --target "$MIRI_TEST_TARGET" else - # we have to build a sysroot - cargo run --release --bin cargo-miri -- miri setup - export MIRI_SYSROOT=$HOME/.cache/miri/HOST + build_sysroot fi +} - exec cargo "$COMMAND" --release "$@" +## Main + +# Determine command. +COMMAND="$1" +[ $# -gt 0 ] && shift + +# Determine flags passed to all cargo invocations. +# This is a bit more annoying that one would hope due to +# . +case "$COMMAND" in +*-debug) + CARGO_INSTALL_FLAGS="--debug $CARGO_EXTRA_FLAGS" + CARGO_BUILD_FLAGS="$CARGO_EXTRA_FLAGS" + ;; +*) + CARGO_INSTALL_FLAGS="$CARGO_EXTRA_FLAGS" + CARGO_BUILD_FLAGS="--release $CARGO_EXTRA_FLAGS" + ;; +esac + +# Run command. +case "$COMMAND" in +install|install-debug) + # "--locked" to respect the Cargo.lock file if it exists, + # "--offline" to avoid querying the registry (for yanked packages). + exec cargo install $CARGO_INSTALL_FLAGS --path "$(dirname "$0")" --force --locked --offline "$@" + ;; +check|check-debug) + # Check, and let caller control flags. + exec cargo check $CARGO_BUILD_FLAGS "$@" + ;; +build|build-debug) + # Build, and let caller control flags. + exec cargo build $CARGO_BUILD_FLAGS "$@" + ;; +test|test-debug) + # First build and get a sysroot. + cargo build $CARGO_BUILD_FLAGS + find_sysroot + # Then test, and let caller control flags. + exec cargo test $CARGO_BUILD_FLAGS "$@" + ;; +run|run-debug) + # Scan for "--target" to set the "MIRI_TEST_TARGET" env var so + # that we set the MIRI_SYSROOT up the right way. + if [ -z "$MIRI_TEST_TARGET" ]; then + for ARG in "$@"; do + if [ "$LAST_ARG" = "--target" ]; then + # Found it! + export MIRI_TEST_TARGET="$ARG" + break + fi + LAST_ARG="$ARG" + done + fi + # First build and get a sysroot. + cargo build $CARGO_BUILD_FLAGS + find_sysroot + # Then run the actual command. + exec cargo run $CARGO_BUILD_FLAGS -- --sysroot "$MIRI_SYSROOT" "$@" ;; +*) + echo "Unknown command: $COMMAND" + echo + echo "$USAGE" + exit 1 esac