]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/ci.sh
dd2d2abe35b539cff216bfabbd848718d8d3c8b1
[rust.git] / src / tools / miri / ci.sh
1 #!/bin/bash
2 set -euo pipefail
3
4 function begingroup {
5   echo "::group::$@"
6   set -x
7 }
8
9 function endgroup {
10   set +x
11   echo "::endgroup"
12 }
13
14 begingroup "Building Miri"
15
16 # Determine configuration for installed build
17 echo "Installing release version of Miri"
18 export RUSTFLAGS="-D warnings"
19 export CARGO_INCREMENTAL=0
20 ./miri install # implicitly locked
21
22 # Prepare debug build for direct `./miri` invocations
23 echo "Building debug version of Miri"
24 export CARGO_EXTRA_FLAGS="--locked"
25 ./miri check --no-default-features # make sure this can be built
26 ./miri check --all-features # and this, too
27 ./miri build --all-targets # the build that all the `./miri test` below will use
28
29 endgroup
30
31 # Test
32 function run_tests {
33   if [ -n "${MIRI_TEST_TARGET+exists}" ]; then
34     begingroup "Testing foreign architecture $MIRI_TEST_TARGET"
35   else
36     begingroup "Testing host architecture"
37   fi
38
39   ## ui test suite
40   ./miri test
41   if [ -z "${MIRI_TEST_TARGET+exists}" ]; then
42     # Only for host architecture: tests with optimizations (`-O` is what cargo passes, but crank MIR
43     # optimizations up all the way).
44     # Optimizations change diagnostics (mostly backtraces), so we don't check them
45     #FIXME(#2155): we want to only run the pass and panic tests here, not the fail tests.
46     MIRIFLAGS="${MIRIFLAGS:-} -O -Zmir-opt-level=4" MIRI_SKIP_UI_CHECKS=1 ./miri test -- tests/{pass,panic}
47   fi
48
49   ## test-cargo-miri
50   # On Windows, there is always "python", not "python3" or "python2".
51   if command -v python3 > /dev/null; then
52     PYTHON=python3
53   else
54     PYTHON=python
55   fi
56   # Some environment setup that attempts to confuse the heck out of cargo-miri.
57   if [ "$HOST_TARGET" = x86_64-unknown-linux-gnu ]; then
58     # These act up on Windows (`which miri` produces a filename that does not exist?!?),
59     # so let's do this only on Linux. Also makes sure things work without these set.
60     export RUSTC=$(which rustc)
61     export MIRI=$(which miri)
62   fi
63   mkdir -p .cargo
64   echo 'build.rustc-wrapper = "thisdoesnotexist"' > .cargo/config.toml
65   # Run the actual test
66   ${PYTHON} test-cargo-miri/run-test.py
67   # Clean up
68   unset RUSTC MIRI
69   rm -rf .cargo
70
71   # Ensure that our benchmarks all work, but only on Linux hosts.
72   if [ -z "${MIRI_TEST_TARGET+exists}" ] && [ "$HOST_TARGET" = x86_64-unknown-linux-gnu ] ; then
73     for BENCH in $(ls "bench-cargo-miri"); do
74       cargo miri run --manifest-path bench-cargo-miri/$BENCH/Cargo.toml
75     done
76   fi
77
78   endgroup
79 }
80
81 function run_tests_minimal {
82   if [ -n "${MIRI_TEST_TARGET+exists}" ]; then
83     begingroup "Testing MINIMAL foreign architecture $MIRI_TEST_TARGET: only testing $@"
84   else
85     begingroup "Testing MINIMAL host architecture: only testing $@"
86   fi
87
88   ./miri test -- "$@"
89
90   # Ensure that a small smoke test of cargo-miri works.
91   cargo miri run --manifest-path test-cargo-miri/no-std-smoke/Cargo.toml --target ${MIRI_TEST_TARGET-$HOST_TARGET}
92
93   endgroup
94 }
95
96 # host
97 run_tests
98
99 case $HOST_TARGET in
100   x86_64-unknown-linux-gnu)
101     MIRI_TEST_TARGET=i686-unknown-linux-gnu run_tests
102     MIRI_TEST_TARGET=aarch64-apple-darwin run_tests
103     MIRI_TEST_TARGET=i686-pc-windows-msvc run_tests
104     MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal hello integer vec panic/panic concurrency/simple atomic data_race env/var
105     MIRI_TEST_TARGET=aarch64-linux-android run_tests_minimal hello integer vec panic/panic
106     MIRI_TEST_TARGET=wasm32-wasi MIRI_NO_STD=1 run_tests_minimal no_std # supports std but miri doesn't support it
107     MIRI_TEST_TARGET=thumbv7em-none-eabihf MIRI_NO_STD=1 run_tests_minimal no_std # no_std embedded architecture
108     ;;
109   x86_64-apple-darwin)
110     MIRI_TEST_TARGET=mips64-unknown-linux-gnuabi64 run_tests # big-endian architecture
111     MIRI_TEST_TARGET=x86_64-pc-windows-msvc run_tests
112     ;;
113   i686-pc-windows-msvc)
114     MIRI_TEST_TARGET=x86_64-unknown-linux-gnu run_tests
115     MIRI_TEST_TARGET=x86_64-pc-windows-gnu run_tests
116     ;;
117   *)
118     echo "FATAL: unknown OS"
119     exit 1
120     ;;
121 esac