From ed0c6e833604364c8c7d454bdb66ed6a9c620ee6 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 28 May 2019 19:01:43 +0200 Subject: [PATCH 1/6] miri build script: support building miri in debug mode --- miri | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/miri b/miri index a5f7271b24..f12a49afe4 100755 --- a/miri +++ b/miri @@ -1,4 +1,36 @@ #!/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. + +## 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) @@ -13,9 +45,9 @@ export RUSTFLAGS="-C link-args=-Wl,-rpath,$SYSROOT/lib/rustlib/$TARGET/lib -C de # 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 --release --bin cargo-miri -- miri setup "$@" + cargo run $CARGO_BUILD_FLAGS --bin cargo-miri -- miri setup "$@" # Call again, to just set env var. - eval $(cargo run --release -q --bin cargo-miri -- miri setup --env "$@") + eval $(cargo run $CARGO_BUILD_FLAGS -q --bin cargo-miri -- miri setup --env "$@") export MIRI_SYSROOT } @@ -48,23 +80,44 @@ find_sysroot() { ## Main +# Determine command. COMMAND="$1" shift +# Determine flags passed to all cargo invocations. case "$COMMAND" in -install) +*-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 "$COMMAND" --path "$(dirname "$0")" --force --locked --offline "$@" + exec cargo install --path "$(dirname "$0")" --force --locked --offline "$@" ;; -build) +build|build-debug) # Build, and let caller control flags. - exec cargo "$COMMAND" --release "$@" + 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 "$@" ;; -test|run) - # In "run" mode, scan for "--target" to set the "MIRI_TEST_TARGET" env var so +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 [ "$COMMAND" = "run" ] && [ -z "$MIRI_TEST_TARGET" ]; then + if [ -z "$MIRI_TEST_TARGET" ]; then for ARG in "$@"; do if [ "$LAST_ARG" = "--target" ]; then # Found it! @@ -75,9 +128,9 @@ test|run) done fi # First build and get a sysroot. - cargo build --release + cargo build $CARGO_BUILD_FLAGS find_sysroot # Then run the actual command. - exec cargo "$COMMAND" --release "$@" + exec cargo run $CARGO_BUILD_FLAGS "$@" ;; esac From 328ecd1abf4ca75499d2ed6b450c4ebf1535a6da Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 28 May 2019 19:02:54 +0200 Subject: [PATCH 2/6] avoid rebuilding Miri on CI --- travis.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/travis.sh b/travis.sh index 4df12613fb..c06dbaee36 100755 --- a/travis.sh +++ b/travis.sh @@ -7,10 +7,11 @@ if [ "$TRAVIS_OS_NAME" == osx ]; then else FOREIGN_TARGET=i686-unknown-linux-gnu fi +export CARGO_EXTRA_FLAGS="--all-features" # Prepare echo "Build and install miri" -./miri build --all-features --all-targets +./miri build --all-targets ./miri install echo From d55d04780cbf966537c3f1d6e33b133a5319eeb8 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 28 May 2019 19:04:31 +0200 Subject: [PATCH 3/6] reference cargo issue --- miri | 2 ++ 1 file changed, 2 insertions(+) diff --git a/miri b/miri index f12a49afe4..99b64b6202 100755 --- a/miri +++ b/miri @@ -85,6 +85,8 @@ COMMAND="$1" 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" From bf9f26401f8a41880203918ffbbfcac4ae5f16ac Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 28 May 2019 19:20:01 +0200 Subject: [PATCH 4/6] also pass flags to install --- miri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miri b/miri index 99b64b6202..64466951e9 100755 --- a/miri +++ b/miri @@ -103,7 +103,7 @@ 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 --path "$(dirname "$0")" --force --locked --offline "$@" + exec cargo install $CARGO_INSTALL_FLAGS --path "$(dirname "$0")" --force --locked --offline "$@" ;; build|build-debug) # Build, and let caller control flags. From 35b4d9fd8ac260bdfee5204ec2590420ca0782b2 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 29 May 2019 09:36:59 +0200 Subject: [PATCH 5/6] print usage information on invalid command --- miri | 68 +++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/miri b/miri index 64466951e9..d683a08530 100755 --- a/miri +++ b/miri @@ -1,37 +1,38 @@ #!/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 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) SYSROOT=$(rustc --print sysroot) @@ -135,4 +136,9 @@ run|run-debug) # Then run the actual command. exec cargo run $CARGO_BUILD_FLAGS "$@" ;; +*) + echo "Unknown command: $COMMAND" + echo + echo "$USAGE" + exit 1 esac From 16cc5ddacbde23a71d05535f6b51298d295535df Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 29 May 2019 09:39:49 +0200 Subject: [PATCH 6/6] tweak logic for determining rustc default target --- miri | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/miri b/miri index d683a08530..2181403b7b 100755 --- a/miri +++ b/miri @@ -33,13 +33,19 @@ EOF ) ## Preparation -# 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" ## Helper functions