libc-rs/ci/run-travis.sh
Alex Crichton d820c4a8f7 Add OpenBSD and FreeBSD CI to Travis
This commit adds support to test all libc definitions on both OpenBSD and
FreeBSD via QEMU userspace emulation. Specially prepared images for each OS are
used which are essentially intended to run a script on startup and then exit.
Documentation has been added to the `ci/README.md` file describing this new
system.
2016-01-18 22:54:28 -08:00

205 lines
6.1 KiB
Bash

# Entry point for all travis builds, this will set up the Travis environment by
# downloading any dependencies. It will then execute the `run.sh` script to
# build and execute all tests.
#
# For a full description of how all tests are run, see `ci/README.md`
set -ex
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
OS=unknown-linux-gnu
else
OS=apple-darwin
fi
export HOST=$ARCH-$OS
if [ "$TARGET" = "" ]; then
TARGET=$HOST
fi
MAIN_TARGETS=https://static.rust-lang.org/dist
DATE=$(echo $TRAVIS_RUST_VERSION | sed s/nightly-//)
EXTRA_TARGETS=https://people.mozilla.org/~acrichton/libc-test/$DATE
install() {
if [ "$TRAVIS" = "true" ]; then
sudo apt-get update
sudo apt-get install -y $@
fi
}
# 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
# Acquire QEMU and the base OS image
install qemu-kvm
tmpdir=/tmp/qemu-img-creation
mkdir -p $tmpdir
if [ ! -f $tmpdir/$QEMU ]; then
curl https://people.mozilla.org/~acrichton/libc-test/qemu/$QEMU.gz | \
gunzip -d > $tmpdir/$QEMU
fi
# Generate all.{c,rs} on the host which will be compiled inside QEMU. Do this
# here because compiling syntex_syntax in QEMU would time out basically
# everywhere.
rm -rf $tmpdir/generated
mkdir -p $tmpdir/generated
CARGO_TARGET_DIR=$tmpdir/generated-build \
cargo build --manifest-path libc-test/generate-files/Cargo.toml
(cd libc-test && TARGET=$TARGET OUT_DIR=$tmpdir/generated SKIP_COMPILE=1 \
$tmpdir/generated-build/debug/generate-files)
# Create a mount a fresh new filesystem image that we'll later pass to QEMU,
# this contains the checkout of libc and will be able to run all tests
rm -f $tmpdir/libc-test.img
dd if=/dev/null of=$tmpdir/libc-test.img bs=1M seek=5
mkfs.ext2 -F $tmpdir/libc-test.img
rm -rf $tmpdir/mount
mkdir $tmpdir/mount
sudo mount -t ext2 -o loop $tmpdir/libc-test.img $tmpdir/mount
# Copy this folder into the mounted image, the `run.sh` entry point, and
# overwrite the standard libc-test Cargo.toml with the overlay one which will
# assume the all.{c,rs} test files have already been generated
sudo mkdir $tmpdir/mount/libc
sudo cp -r * $tmpdir/mount/libc/
sudo cp ci/run-qemu.sh $tmpdir/mount/run.sh
echo $TARGET | sudo tee -a $tmpdir/mount/TARGET
sudo cp $tmpdir/generated/* $tmpdir/mount/libc/libc-test
sudo cp libc-test/run-generated-Cargo.toml $tmpdir/mount/libc/libc-test/Cargo.toml
sudo umount $tmpdir/mount
# If we can use kvm, prefer that, otherwise just fall back to user-space
# emulation.
if kvm-ok; then
program="sudo kvm"
else
program=qemu-system-x86_64
fi
# 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.
$program \
-m 1024 \
-snapshot \
-drive if=virtio,file=$tmpdir/$QEMU \
-drive if=virtio,file=$tmpdir/libc-test.img \
-net nic,model=virtio \
-net user \
-nographic \
-vga none 2>&1 | tee out.log
exec grep "^PASSED .* tests" out.log
fi
mkdir -p .cargo
cp ci/cargo-config .cargo/config
# Next up we need to install the standard library for the version of Rust that
# we're testing. Get fancy targets from the EXTRA_TARGETS URL and otherwise get
# all others from the official distribution.
if [ "$TRAVIS" = "true" ]; then
case "$TARGET" in
*-apple-ios | *-rumprun-*)
curl -s $EXTRA_TARGETS/$TARGET.tar.gz | \
tar xzf - -C `rustc --print sysroot`/lib/rustlib
;;
*)
# Download the rustlib folder from the relevant portion of main
# distribution's tarballs.
dir=rust-std-$TARGET
pkg=rust-std
if [ "$TRAVIS_RUST_VERSION" = "1.0.0" ]; then
pkg=rust
dir=rustc
fi
curl -s $MAIN_TARGETS/$pkg-$TRAVIS_RUST_VERSION-$TARGET.tar.gz | \
tar xzf - -C $HOME/rust/lib/rustlib --strip-components=4 \
$pkg-$TRAVIS_RUST_VERSION-$TARGET/$dir/lib/rustlib/$TARGET
;;
esac
fi
# If we're testing with a docker image, then run tests entirely within that
# image. Note that this is using the same rustc installation that travis has
# (sharing it via `-v`) and otherwise the tests run entirely within the
# container.
#
# For the docker build we mount the entire current directory at /checkout, set
# up some environment variables to let it run, and then run the standard run.sh
# script.
if [ "$DOCKER" != "" ]; then
args=""
case "$TARGET" in
mips-unknown-linux-gnu)
args="$args -e CC=mips-linux-gnu-gcc-5"
;;
*)
;;
esac
exec docker run \
--entrypoint bash \
-v `rustc --print sysroot`:/usr/local:ro \
-v `pwd`:/checkout \
-e LD_LIBRARY_PATH=/usr/local/lib \
-e CARGO_TARGET_DIR=/tmp \
$args \
-w /checkout \
-it $DOCKER \
ci/run.sh $TARGET
fi
# If we're not running docker or qemu, then we may still need some packages
# and/or tools with various configurations here and there.
case "$TARGET" in
x86_64-unknown-linux-musl)
install musl-tools
export CC=musl-gcc
;;
arm-unknown-linux-gnueabihf)
install gcc-4.7-arm-linux-gnueabihf qemu-user
export CC=arm-linux-gnueabihf-gcc-4.7
;;
aarch64-unknown-linux-gnu)
install gcc-aarch64-linux-gnu qemu-user
export CC=aarch64-linux-gnu-gcc
;;
*-apple-ios)
;;
*)
# clang has better error messages and implements alignof more broadly
export CC=clang
if [ "$TARGET" = "i686-unknown-linux-gnu" ]; then
install gcc-multilib
fi
;;
esac
# Finally, if we've gotten this far, actually run the tests.
sh ci/run.sh $TARGET
if [ "$TARGET" = "x86_64-unknown-linux-gnu" ] && \
[ "$TRAVIS_RUST_VERSION" = "nightly" ] && \
[ "$TRAVIS_OS_NAME" = "linux" ]; then
sh ci/dox.sh
fi