X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=miri;h=47ff5024fc63356b44da641c12aadfe4c6855771;hb=a458cf3fe619764abd938eb6d5b27dd261bd8127;hp=64466951e9824a5b1e4c3b046aa31876b8239e23;hpb=bf9f26401f8a41880203918ffbbfcac4ae5f16ac;p=rust.git diff --git a/miri b/miri index 64466951e98..47ff5024fc6 100755 --- a/miri +++ b/miri @@ -1,44 +1,54 @@ #!/bin/sh -## Usage -# -# 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 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. +set -e +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 -set -e -# I'd love to use `jq` for parsing the JSON properly, but macOS is totally underequipped for this kind of work. -TARGET=$(rustc --print target-spec-json -Z unstable-options | grep llvm-target | cut -d '"' -f 4) +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" ## Helper functions @@ -47,34 +57,21 @@ 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. - eval $(cargo run $CARGO_BUILD_FLAGS -q --bin cargo-miri -- miri setup --env "$@") - export MIRI_SYSROOT + export MIRI_SYSROOT="$(cargo run $CARGO_BUILD_FLAGS -q --bin cargo-miri -- miri setup --print-sysroot "$@")" } # Prepare and set MIRI_SYSROOT. Respects `MIRI_TEST_TARGET` and takes into account # locally built vs. distributed rustc. find_sysroot() { - # Get ourselves a sysroot if [ -n "$MIRI_SYSROOT" ]; then # Sysroot already set, use that. - true - elif echo "$SYSROOT" | egrep -q 'build/[^/]+/stage'; then - # A local rustc build. - if [ -n "$MIRI_TEST_TARGET" ]; then - # Foreign targets still need a build. Use the rustc sources. - export XARGO_RUST_SRC="$SYSROOT/../../../src" - build_sysroot --target "$MIRI_TEST_TARGET" - else - # Assume we have a proper host libstd in $SYSROOT. - true - fi + return 0 + fi + # We need to build a sysroot. + if [ -n "$MIRI_TEST_TARGET" ]; then + build_sysroot --target "$MIRI_TEST_TARGET" else - # A normal toolchain. We have to build a sysroot either way. - if [ -n "$MIRI_TEST_TARGET" ]; then - build_sysroot --target "$MIRI_TEST_TARGET" - else - build_sysroot - fi + build_sysroot fi } @@ -82,7 +79,7 @@ find_sysroot() { # Determine command. COMMAND="$1" -shift +[ $# -gt 0 ] && shift # Determine flags passed to all cargo invocations. # This is a bit more annoying that one would hope due to @@ -105,6 +102,10 @@ install|install-debug) # "--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 "$@" @@ -133,6 +134,11 @@ run|run-debug) cargo build $CARGO_BUILD_FLAGS find_sysroot # Then run the actual command. - exec cargo run $CARGO_BUILD_FLAGS "$@" + exec cargo run $CARGO_BUILD_FLAGS -- --sysroot "$MIRI_SYSROOT" "$@" ;; +*) + echo "Unknown command: $COMMAND" + echo + echo "$USAGE" + exit 1 esac