8f1acf4643
This commit adds a `ci/build.sh` script that checks that libc builds correctly for some common configurations (`--no-default-features`, `default`, `extra_traits`) on most targets supported by Rust since Rust 1.13.0 (the oldest Rust version that libc supports). The build matrix is refactored into two stages. The first stage is called `tools-and-build-and-tier1` and it aims to discover issues quickly by running the documentation and linter builds, as well as checking that the library builds correctly on all targets in all supported channels and "problematic" Rust versions; Rust versions adding major new features like `repr(align)`, `union`, etc. This first stage also runs libc-test for the tier-1 targets on linux and osx. These builds finish quickly because no emulation is necessary. The second stage is called `tier2` and it runs libc-test for all other targets for which we are currently able to do so. Closes #1229 .
97 lines
3.4 KiB
Bash
Executable File
97 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
|
|
# Builds and runs tests for a particular target passed as an argument to this
|
|
# script.
|
|
|
|
set -ex
|
|
|
|
TARGET="${1}"
|
|
|
|
# If we're going to run tests inside of a qemu image, then we don't need any of
|
|
# the scripts below. Instead, download the image, prepare a filesystem which has
|
|
# the current state of this repository, and then run the image.
|
|
#
|
|
# It's assume that all images, when run with two disks, will run the `run.sh`
|
|
# script from the second which we place inside.
|
|
if [ "$QEMU" != "" ]; then
|
|
tmpdir=/tmp/qemu-img-creation
|
|
mkdir -p "${tmpdir}"
|
|
|
|
if [ -z "${QEMU#*.gz}" ]; then
|
|
# image is .gz : download and uncompress it
|
|
qemufile="$(echo "${QEMU%.gz}" | sed 's/\//__/g')"
|
|
if [ ! -f "${tmpdir}/${qemufile}" ]; then
|
|
curl --retry 5 "https://s3-us-west-1.amazonaws.com/rust-lang-ci2/libc/${QEMU}" | \
|
|
gunzip -d > "${tmpdir}/${qemufile}"
|
|
fi
|
|
elif [ -z "${QEMU#*.xz}" ]; then
|
|
# image is .xz : download and uncompress it
|
|
qemufile="$(echo "${QEMU%.xz}" | sed 's/\//__/g')"
|
|
if [ ! -f "${tmpdir}/${qemufile}" ]; then
|
|
curl --retry 5 "https://s3-us-west-1.amazonaws.com/rust-lang-ci2/libc/${QEMU}" | \
|
|
unxz > "${tmpdir}/${qemufile}"
|
|
fi
|
|
else
|
|
# plain qcow2 image: just download it
|
|
qemufile="$(echo "${QEMU}" | sed 's/\//__/g')"
|
|
if [ ! -f "${tmpdir}/${qemufile}" ]; then
|
|
curl --retry 5 "https://s3-us-west-1.amazonaws.com/rust-lang-ci2/libc/${QEMU}" \
|
|
> "${tmpdir}/${qemufile}"
|
|
fi
|
|
fi
|
|
|
|
# Create a mount a fresh new filesystem image that we'll later pass to QEMU.
|
|
# This will have a `run.sh` script will which use the artifacts inside to run
|
|
# on the host.
|
|
rm -f "${tmpdir}/libc-test.img"
|
|
mkdir "${tmpdir}/mount"
|
|
|
|
# Do the standard rigamarole of cross-compiling an executable and then the
|
|
# script to run just executes the binary.
|
|
cargo build \
|
|
--manifest-path libc-test/Cargo.toml \
|
|
--target "${TARGET}" \
|
|
--test main
|
|
rm "${CARGO_TARGET_DIR}/${TARGET}"/debug/main-*.d
|
|
cp "${CARGO_TARGET_DIR}/${TARGET}"/debug/main-* "${tmpdir}"/mount/libc-test
|
|
# shellcheck disable=SC2016
|
|
echo 'exec $1/libc-test' > "${tmpdir}/mount/run.sh"
|
|
|
|
du -sh "${tmpdir}/mount"
|
|
genext2fs \
|
|
--root "${tmpdir}/mount" \
|
|
--size-in-blocks 100000 \
|
|
"${tmpdir}/libc-test.img"
|
|
|
|
# Pass -snapshot to prevent tampering with the disk images, this helps when
|
|
# running this script in development. The two drives are then passed next,
|
|
# first is the OS and second is the one we just made. Next the network is
|
|
# configured to work (I'm not entirely sure how), and then finally we turn off
|
|
# graphics and redirect the serial console output to out.log.
|
|
qemu-system-x86_64 \
|
|
-m 1024 \
|
|
-snapshot \
|
|
-drive if=virtio,file="${tmpdir}/${qemufile}" \
|
|
-drive if=virtio,file="${tmpdir}/libc-test.img" \
|
|
-net nic,model=virtio \
|
|
-net user \
|
|
-nographic \
|
|
-vga none 2>&1 | tee "${CARGO_TARGET_DIR}/out.log"
|
|
exec egrep "^(PASSED)|(test result: ok)" "${CARGO_TARGET_DIR}/out.log"
|
|
fi
|
|
|
|
# FIXME: x86_64-unknown-linux-gnux32 fail to compile without --release
|
|
# See https://github.com/rust-lang/rust/issues/45417
|
|
opt=
|
|
if [ "$TARGET" = "x86_64-unknown-linux-gnux32" ]; then
|
|
opt="--release"
|
|
fi
|
|
|
|
cargo test $opt --no-default-features --manifest-path libc-test/Cargo.toml \
|
|
--target "${TARGET}"
|
|
|
|
cargo test $opt --manifest-path libc-test/Cargo.toml --target "${TARGET}"
|
|
|
|
cargo test $opt --features extra_traits --manifest-path libc-test/Cargo.toml \
|
|
--target "${TARGET}"
|