mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-04 03:07:25 +00:00

Rather than setting an environment variable in the workflow job based on whether or not the environment is non-MinGW Windows, we can just check this in the ci script. This was originally added in b0f19660f0 ("Add tests for UNC paths on windows builds") and its followup commits.
222 lines
7.9 KiB
Bash
Executable File
222 lines
7.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -eux
|
|
|
|
export RUST_BACKTRACE="${RUST_BACKTRACE:-full}"
|
|
export NEXTEST_STATUS_LEVEL=all
|
|
|
|
target="${1:-}"
|
|
|
|
if [ -z "$target" ]; then
|
|
host_target=$(rustc -vV | awk '/^host/ { print $2 }')
|
|
echo "Defaulted to host target $host_target"
|
|
target="$host_target"
|
|
fi
|
|
|
|
if [[ "$target" = *"wasm"* ]]; then
|
|
# Enable the random backend
|
|
export RUSTFLAGS="${RUSTFLAGS:-} --cfg getrandom_backend=\"wasm_js\""
|
|
fi
|
|
|
|
if [ "${USING_CONTAINER_RUSTC:-}" = 1 ]; then
|
|
# Install nonstandard components if we have control of the environment
|
|
rustup target list --installed |
|
|
grep -E "^$target\$" ||
|
|
rustup target add "$target"
|
|
fi
|
|
|
|
# Test our implementation
|
|
if [ "${BUILD_ONLY:-}" = "1" ]; then
|
|
echo "no tests to run for build-only targets"
|
|
else
|
|
test_builtins=(cargo test --package builtins-test --no-fail-fast --target "$target")
|
|
"${test_builtins[@]}"
|
|
"${test_builtins[@]}" --release
|
|
"${test_builtins[@]}" --features c
|
|
"${test_builtins[@]}" --features c --release
|
|
"${test_builtins[@]}" --features no-asm
|
|
"${test_builtins[@]}" --features no-asm --release
|
|
"${test_builtins[@]}" --features no-f16-f128
|
|
"${test_builtins[@]}" --features no-f16-f128 --release
|
|
"${test_builtins[@]}" --benches
|
|
"${test_builtins[@]}" --benches --release
|
|
|
|
# Validate that having a verbatim path for the target directory works
|
|
# (trivial to regress using `/` in paths to build artifacts rather than
|
|
# `Path::join`). MinGW does not currently support these paths.
|
|
if [[ "$target" = *"windows"* ]] && [[ "$target" != *"gnu"* ]]; then
|
|
verb_path=$(cmd.exe //C echo \\\\?\\%cd%\\builtins-test\\target2)
|
|
"${test_builtins[@]}" --target-dir "$verb_path" --features c
|
|
fi
|
|
fi
|
|
|
|
# Ensure there are no duplicate symbols or references to `core` when
|
|
# `compiler-builtins` is built with various features. Symcheck invokes Cargo to
|
|
# build with the arguments we provide it, then validates the built artifacts.
|
|
symcheck=(cargo run -p symbol-check --release)
|
|
[[ "$target" = "wasm"* ]] && symcheck+=(--features wasm)
|
|
symcheck+=(-- build-and-check)
|
|
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins --release
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins --features c
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins --features c --release
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins --features no-asm
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins --features no-asm --release
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins --features no-f16-f128
|
|
"${symcheck[@]}" "$target" -- -p compiler_builtins --features no-f16-f128 --release
|
|
|
|
run_intrinsics_test() {
|
|
build_args=(--verbose --manifest-path builtins-test-intrinsics/Cargo.toml)
|
|
build_args+=("$@")
|
|
|
|
# symcheck also checks the results of builtins-test-intrinsics
|
|
"${symcheck[@]}" "$target" -- "${build_args[@]}"
|
|
|
|
# FIXME: we get access violations on Windows, our entrypoint may need to
|
|
# be tweaked.
|
|
if [ "${BUILD_ONLY:-}" != "1" ] && ! [[ "$target" = *"windows"* ]]; then
|
|
cargo run --target "$target" "${build_args[@]}"
|
|
fi
|
|
}
|
|
|
|
# Verify that we haven't dropped any intrinsics/symbols
|
|
run_intrinsics_test
|
|
run_intrinsics_test --release
|
|
run_intrinsics_test --features c
|
|
run_intrinsics_test --features c --release
|
|
|
|
# Verify that there are no undefined symbols to `panic` within our
|
|
# implementations
|
|
CARGO_PROFILE_DEV_LTO=true run_intrinsics_test
|
|
CARGO_PROFILE_RELEASE_LTO=true run_intrinsics_test --release
|
|
|
|
# Test libm
|
|
|
|
# Make sure a simple build works
|
|
cargo check -p libm --no-default-features --target "$target"
|
|
|
|
if [ "${MAY_SKIP_LIBM_CI:-}" = "true" ]; then
|
|
echo "skipping libm PR CI"
|
|
exit
|
|
fi
|
|
|
|
mflags=()
|
|
|
|
# We enumerate features manually.
|
|
mflags+=(--no-default-features)
|
|
|
|
# Enable arch-specific routines when available.
|
|
mflags+=(--features arch)
|
|
|
|
# Always enable `unstable-float` since it expands available API but does not
|
|
# change any implementations.
|
|
mflags+=(--features unstable-float)
|
|
|
|
# We need to specifically skip tests for musl-math-sys on systems that can't
|
|
# build musl since otherwise `--all` will activate it.
|
|
case "$target" in
|
|
# Can't build at all on MSVC, WASM, or thumb
|
|
*windows-msvc*) mflags+=(--exclude musl-math-sys) ;;
|
|
*wasm*) mflags+=(--exclude musl-math-sys) ;;
|
|
*thumb*) mflags+=(--exclude musl-math-sys) ;;
|
|
|
|
# We can build musl on MinGW but running tests gets a stack overflow
|
|
*windows-gnu*) ;;
|
|
# FIXME(#309): LE PPC crashes calling the musl version of some functions. It
|
|
# seems like a qemu bug but should be investigated further at some point.
|
|
# See <https://github.com/rust-lang/libm/issues/309>.
|
|
*powerpc64le*) ;;
|
|
|
|
# Everything else gets musl enabled
|
|
*) mflags+=(--features libm-test/build-musl) ;;
|
|
esac
|
|
|
|
|
|
# Configure which targets test against MPFR
|
|
case "$target" in
|
|
# MSVC cannot link MPFR
|
|
*windows-msvc*) ;;
|
|
# FIXME: MinGW should be able to build MPFR, but setup in CI is nontrivial.
|
|
*windows-gnu*) ;;
|
|
# Targets that aren't cross compiled in CI work fine
|
|
aarch64*apple*) mflags+=(--features libm-test/build-mpfr) ;;
|
|
aarch64*linux*) mflags+=(--features libm-test/build-mpfr) ;;
|
|
i586*) mflags+=(--features libm-test/build-mpfr --features gmp-mpfr-sys/force-cross) ;;
|
|
i686*) mflags+=(--features libm-test/build-mpfr) ;;
|
|
x86_64*) mflags+=(--features libm-test/build-mpfr) ;;
|
|
esac
|
|
|
|
# FIXME: `STATUS_DLL_NOT_FOUND` testing macros on CI.
|
|
# <https://github.com/rust-lang/rust/issues/128944>
|
|
case "$target" in
|
|
*windows-gnu) mflags+=(--exclude libm-macros) ;;
|
|
esac
|
|
|
|
if [ "${BUILD_ONLY:-}" = "1" ]; then
|
|
# If we are on targets that can't run tests, verify that we can build.
|
|
cmd=(cargo build --target "$target" --package libm)
|
|
"${cmd[@]}"
|
|
"${cmd[@]}" --features unstable-intrinsics
|
|
|
|
echo "can't run tests on $target; skipping"
|
|
else
|
|
mflags+=(--workspace --target "$target")
|
|
cmd=(cargo test "${mflags[@]}")
|
|
profile_flag="--profile"
|
|
|
|
# If nextest is available, use that
|
|
command -v cargo-nextest && nextest=1 || nextest=0
|
|
if [ "$nextest" = "1" ]; then
|
|
cmd=(cargo nextest run --max-fail=10)
|
|
|
|
# Workaround for https://github.com/nextest-rs/nextest/issues/2066
|
|
if [ -f /.dockerenv ]; then
|
|
cfg_file="/tmp/nextest-config.toml"
|
|
echo "[store]" >> "$cfg_file"
|
|
echo "dir = \"$CARGO_TARGET_DIR/nextest\"" >> "$cfg_file"
|
|
cmd+=(--config-file "$cfg_file")
|
|
fi
|
|
|
|
# Not all configurations have tests to run on wasm
|
|
[[ "$target" = *"wasm"* ]] && cmd+=(--no-tests=warn)
|
|
|
|
cmd+=("${mflags[@]}")
|
|
profile_flag="--cargo-profile"
|
|
fi
|
|
|
|
# Test once without intrinsics
|
|
"${cmd[@]}"
|
|
|
|
# Run doctests if they were excluded by nextest
|
|
[ "$nextest" = "1" ] && cargo test --doc --exclude compiler_builtins "${mflags[@]}"
|
|
|
|
# Exclude the macros and utile crates from the rest of the tests to save CI
|
|
# runtime, they shouldn't have anything feature- or opt-level-dependent.
|
|
cmd+=(--exclude util --exclude libm-macros)
|
|
|
|
# Test once with intrinsics enabled
|
|
"${cmd[@]}" --features unstable-intrinsics
|
|
"${cmd[@]}" --features unstable-intrinsics --benches
|
|
|
|
# Test the same in release mode, which also increases coverage. Also ensure
|
|
# the soft float routines are checked.
|
|
"${cmd[@]}" "$profile_flag" release-checked
|
|
"${cmd[@]}" "$profile_flag" release-checked --features force-soft-floats
|
|
"${cmd[@]}" "$profile_flag" release-checked --features unstable-intrinsics
|
|
"${cmd[@]}" "$profile_flag" release-checked --features unstable-intrinsics --benches
|
|
|
|
# Ensure that the routines do not panic.
|
|
#
|
|
# `--tests` must be passed because no-panic is only enabled as a dev
|
|
# dependency. The `release-opt` profile must be used to enable LTO and a
|
|
# single CGU.
|
|
ENSURE_NO_PANIC=1 cargo build \
|
|
-p libm \
|
|
--target "$target" \
|
|
--no-default-features \
|
|
--features unstable-float \
|
|
--tests \
|
|
--profile release-opt
|
|
fi
|