From 8f1acf4643293a22c3888423eb9d48d0ee351fa7 Mon Sep 17 00:00:00 2001 From: gnzlbg Date: Thu, 7 Feb 2019 11:36:31 +0100 Subject: [PATCH] Build all platforms in CI 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 . --- .travis.yml | 226 +++++++++++++++++++++++++++++++++++----------------- ci/build.sh | 165 ++++++++++++++++++++++++++++++++++++++ ci/run.sh | 21 ++--- 3 files changed, 323 insertions(+), 89 deletions(-) create mode 100644 ci/build.sh diff --git a/.travis.yml b/.travis.yml index 91570c1c93e8a..4be7e2ec77d69 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,112 +1,188 @@ language: rust -rust: stable +rust: nightly sudo: required dist: xenial services: docker +stages: + - tools-and-build-and-tier1 + - tier2 + matrix: include: - # 1.13.0 compat - - env: TARGET=x86_64-unknown-linux-gnu - rust: 1.13.0 - script: rm -f Cargo.lock && cargo build - install: true - - # build documentation - - env: TARGET=x86_64-unknown-linux-gnu - rust: nightly + # TOOLS + - name: "Documentation" + env: TARGET=x86_64-unknown-linux-gnu script: sh ci/dox.sh install: true - - # stable compat - - env: TARGET=x86_64-unknown-linux-gnu + stage: tools-and-build-and-tier1 + - name: "Shellcheck" install: true - - env: TARGET=i686-unknown-linux-gnu - - os: osx - env: TARGET=x86_64-apple-darwin + script: + - shellcheck --version + - shellcheck ci/*.sh + stage: tools-and-build-and-tier1 + - name: "Style" + install: rustup component add rustfmt-preview + script: + - rustc ci/style.rs && ./style src + - cargo fmt --all -- --check + stage: tools-and-build-and-tier1 + + # BUILD stable, beta, nightly + - name: "Build Stable Rust" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: stable + - name: "Build Beta Rust" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: beta + - name: "Build Nightly Rust" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: nightly + - name: "Build Stable Rust" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: stable + os: osx osx_image: xcode10 - install: true - - os: osx - env: TARGET=i686-apple-darwin + - name: "Build Beta Rust" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: beta + os: osx osx_image: xcode10 - - env: TARGET=arm-linux-androideabi + - name: "Build Nightly Rust" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: nightly + os: osx + osx_image: xcode10 + - name: "Build Stable Rust 1.13.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.13.0 + - name: "Build Stable Rust 1.19.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.19.0 + - name: "Build Stable Rust 1.24.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.24.0 + - name: "Build Stable Rust 1.25.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.25.0 + - name: "Build Stable Rust 1.30.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.30.0 + - name: "Build Stable Rust 1.13.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.13.0 + os: osx + osx_image: xcode10 + - name: "Build Stable Rust 1.19.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.19.0 + os: osx + osx_image: xcode10 + - name: "Build Stable Rust 1.24.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.24.0 + os: osx + osx_image: xcode10 + - name: "Build Stable Rust 1.25.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.25.0 + os: osx + osx_image: xcode10 + - name: "Build Stable Rust 1.30.0" + script: sh ci/build.sh + stage: tools-and-build-and-tier1 + rust: 1.30.0 + os: osx + osx_image: xcode10 + - env: TARGET=i686-apple-darwin + os: osx + osx_image: xcode10 + stage: tools-and-build-and-tier1 + - env: TARGET=i686-unknown-linux-gnu + stage: tools-and-build-and-tier1 + - env: TARGET=x86_64-apple-darwin + os: osx + osx_image: xcode10 + stage: tools-and-build-and-tier1 + - env: TARGET=x86_64-unknown-linux-gnu + stage: tools-and-build-and-tier1 + + # Tier 2 targets - env: TARGET=aarch64-linux-android - # FIXME(#826) should reenable - #- env: TARGET=i686-linux-android - - env: TARGET=x86_64-linux-android - - env: TARGET=x86_64-unknown-linux-musl - - env: TARGET=i686-unknown-linux-musl - - env: TARGET=arm-unknown-linux-gnueabihf - - env: TARGET=arm-unknown-linux-musleabihf + stage: tier2 - env: TARGET=aarch64-unknown-linux-gnu + stage: tier2 - env: TARGET=aarch64-unknown-linux-musl - - env: TARGET=powerpc-unknown-linux-gnu - - env: TARGET=powerpc64-unknown-linux-gnu - - env: TARGET=powerpc64le-unknown-linux-gnu + stage: tier2 + - env: TARGET=arm-linux-androideabi + stage: tier2 + - env: TARGET=arm-unknown-linux-gnueabihf + stage: tier2 + - env: TARGET=arm-unknown-linux-musleabihf + stage: tier2 + - env: TARGET=asmjs-unknown-emscripten + stage: tier2 + - env: TARGET=i686-unknown-linux-musl + stage: tier2 + - env: TARGET=mips-unknown-linux-gnu + stage: tier2 - env: TARGET=mips-unknown-linux-musl - - env: TARGET=mipsel-unknown-linux-musl + stage: tier2 - env: TARGET=mips64-unknown-linux-gnuabi64 + stage: tier2 - env: TARGET=mips64el-unknown-linux-gnuabi64 - - env: TARGET=mips-unknown-linux-gnu + stage: tier2 + - env: TARGET=mipsel-unknown-linux-musl + stage: tier2 + - env: TARGET=powerpc-unknown-linux-gnu + stage: tier2 + - env: TARGET=powerpc64-unknown-linux-gnu + stage: tier2 + - env: TARGET=powerpc64le-unknown-linux-gnu + stage: tier2 - env: TARGET=s390x-unknown-linux-gnu + stage: tier2 - env: TARGET=sparc64-unknown-linux-gnu - - env: TARGET=asmjs-unknown-emscripten + stage: tier2 - env: TARGET=wasm32-unknown-emscripten - - # beta - - env: TARGET=x86_64-unknown-linux-gnu - rust: beta - install: true - - os: osx - env: TARGET=x86_64-apple-darwin - osx_image: xcode10 - rust: beta - install: true - - # nightly - - env: TARGET=x86_64-unknown-linux-gnu - rust: nightly - install: true - - os: osx - env: TARGET=x86_64-apple-darwin - osx_image: xcode10 - rust: nightly - install: true - # not available on stable - # without --release the build fails - # see https://github.com/rust-lang/rust/issues/45417 + stage: tier2 + - env: TARGET=x86_64-linux-android + stage: tier2 - env: TARGET=x86_64-unknown-linux-gnux32 OPT="--release" - rust: nightly - - - env: TARGET=wasm32-unknown-unknown - install: rustup target add $TARGET - script: cargo build --no-default-features --target $TARGET --release - - name: "Style" - install: rustup component add rustfmt-preview - script: - - rustc ci/style.rs && ./style src - - cargo fmt --all -- --check - - name: "Shellcheck" - install: true - script: - - shellcheck --version - - shellcheck ci/*.sh + stage: tier2 + - env: TARGET=x86_64-unknown-linux-musl + stage: tier2 allow_failures: # FIXME: https://github.com/rust-lang/libc/issues/1226 - env: TARGET=asmjs-unknown-emscripten - env: TARGET=wasm32-unknown-emscripten -install: rustup target add $TARGET +install: rustup target add $TARGET || true + script: - cargo generate-lockfile --manifest-path libc-test/Cargo.toml - - if [[ $TRAVIS_OS_NAME = "linux" ]]; then + - if [[ $TRAVIS_OS_NAME = "linux" ]] && [[ $BUILD_ONLY != "1" ]]; then sh ci/run-docker.sh $TARGET; else - export CARGO_TARGET_DIR=`pwd`/target; sh ci/run.sh $TARGET; fi - env: global: secure: "e2/3QjgRN9atOuSHp22TrYG7QVKcYUWY48Hi9b60w+r1+BhPkTseIJLte7WefRhdXtqpjjUJTooKDhnurFOeHaCT+nmBgiv+FPU893sBl4bhesY4m0vgUJVbNZcs6lTImYekWVb+aqjGdgV/XAgCw7c3kPmrZV0MzGDWL64Xaps=" diff --git a/ci/build.sh b/ci/build.sh new file mode 100644 index 0000000000000..69805fcbc281d --- /dev/null +++ b/ci/build.sh @@ -0,0 +1,165 @@ +#!/usr/bin/env sh + +# Checks that libc builds properly for all supported targets on a particular +# Rust version: + +set -ex + +RUST=${TRAVIS_RUST_VERSION} +OS=${TRAVIS_OS_NAME} + +echo "Testing Rust ${RUST} on ${OS}" + +test_target() { + TARGET="${1}" + + opt= + if [ "${TARGET}" = "x86_64-unknown-linux-gnux32" ]; then + # FIXME: x86_64-unknown-linux-gnux32 fail to compile without + # --release + # + # See https://github.com/rust-lang/rust/issues/45417 + opt="--release" + fi + + NO_STD= + case ${TARGET} in + thumbv*) + NO_STD=1 + ;; + esac + + rustup target add "${TARGET}" --toolchain "${RUST}" || true + + # Test that libc builds without any default features (no libstd) + cargo "+${RUST}" build -vv $opt --no-default-features --target "${TARGET}" + + # Test that libc builds with default features (e.g. libstd) + # if the target supports libstd + if [ "$NO_STD" != "1" ]; then + cargo "+${RUST}" build -vv $opt --target "${TARGET}" + fi + + # Test that libc builds with the `extra_traits` feature + cargo "+${RUST}" build -vv $opt --no-default-features --target "${TARGET}" \ + --features extra_traits + + # Also test that it builds with `extra_traits` and default features: + if [ "$NO_STD" != "1" ]; then + cargo "+${RUST}" build -vv $opt --target "${TARGET}" \ + --features extra_traits + fi +} + +RUST_LINUX_TARGETS="\ +aarch64-linux-android \ +aarch64-unknown-linux-gnu \ +arm-linux-androideabi \ +arm-unknown-linux-gnueabi \ +arm-unknown-linux-gnueabihf \ +armv7-linux-androideabi \ +armv7-unknown-linux-gnueabihf \ +i586-unknown-linux-gnu \ +i686-linux-android \ +i686-unknown-freebsd \ +i686-unknown-linux-gnu \ +i686-unknown-linux-musl \ +mips-unknown-linux-gnu \ +mips-unknown-linux-musl \ +mips64-unknown-linux-gnuabi64 \ +mips64el-unknown-linux-gnuabi64 \ +mipsel-unknown-linux-gnu \ +mipsel-unknown-linux-gnu \ +mipsel-unknown-linux-musl \ +powerpc-unknown-linux-gnu \ +powerpc64-unknown-linux-gnu \ +powerpc64le-unknown-linux-gnu \ +s390x-unknown-linux-gnu \ +x86_64-unknown-freebsd \ +x86_64-unknown-linux-gnu \ +x86_64-unknown-linux-musl \ +x86_64-unknown-netbsd \ +" + +RUST_GT_1_13_LINUX_TARGETS="\ +arm-unknown-linux-musleabi \ +arm-unknown-linux-musleabihf \ +armv7-unknown-linux-musleabihf \ +sparc64-unknown-linux-gnu \ +wasm32-unknown-emscripten \ +x86_64-linux-android \ +x86_64-rumprun-netbsd \ +" +RUST_GT_1_19_LINUX_TARGETS="\ +aarch64-unknown-linux-musl \ +sparcv9-sun-solaris \ +wasm32-unknown-unknown \ +x86_64-sun-solaris \ +" +RUST_GT_1_24_LINUX_TARGETS="\ +i586-unknown-linux-musl \ +x86_64-unknown-cloudabi \ +" + +RUST_NIGHTLY_LINUX_TARGETS="\ +aarch64-fuchsia \ +thumbv6m-none-eabi \ +thumbv7em-none-eabi \ +thumbv7em-none-eabihf \ +thumbv7m-none-eabi \ +thumbv7neon-linux-androideabi \ +thumbv7neon-unknown-linux-gnueabihf \ +x86_64-fortanix-unknown-sgx \ +x86_64-fuchsia \ +x86_64-unknown-linux-gnux32 \ +x86_64-unknown-redox \ +" +# FIXME: these do not have a rust-std component available +# aarch64-unknown-cloudabi armv7-unknown-cloudabi-eabihf +# i686-unknown-cloudabi powerpc-unknown-linux-gnuspe +# sparc-unknown-linux-gnu mips-unknown-linux-uclib +# i686-unknown-haiku mipsel-unknown-unknown-linux-uclib +# sparc64-unknown-netbsd x86_64-unknown-bitrig x86_64-unknown-haiku +# x86_64-unknown-openbsd i686-unknown-netbsd + +RUST_OSX_TARGETS="\ +aarch64-apple-ios \ +armv7-apple-ios \ +armv7s-apple-ios \ +i386-apple-ios \ +i686-apple-darwin \ +x86_64-apple-darwin \ +x86_64-apple-ios \ +" + +# The targets are listed here alphabetically +TARGETS="" +case "${OS}" in + linux*) + TARGETS="${RUST_LINUX_TARGETS}" + + if [ "${RUST}" != "1.13.0" ]; then + TARGETS="${TARGETS} ${RUST_GT_1_13_LINUX_TARGETS}" + if [ "${RUST}" != "1.19.0" ]; then + TARGETS="${TARGETS} ${RUST_GT_1_19_LINUX_TARGETS}" + if [ "${RUST}" != "1.24.0" ]; then + TARGETS="${TARGETS} ${RUST_GT_1_24_LINUX_TARGETS}" + fi + fi + fi + + if [ "${RUST}" = "nightly" ]; then + TARGETS="${TARGETS} ${RUST_NIGHTLY_LINUX_TARGETS}" + fi + + ;; + osx*) + TARGETS="${RUST_OSX_TARGETS}" + ;; + *) + ;; +esac + +for TARGET in $TARGETS; do + test_target "$TARGET" +done diff --git a/ci/run.sh b/ci/run.sh index 1fb5e127a254e..427d3bf53a899 100755 --- a/ci/run.sh +++ b/ci/run.sh @@ -87,17 +87,10 @@ if [ "$TARGET" = "x86_64-unknown-linux-gnux32" ]; then opt="--release" fi -# Building with --no-default-features is currently broken on rumprun because we -# need cfg(target_vendor), which is currently unstable. -if [ "$TARGET" != "x86_64-rumprun-netbsd" ]; then - cargo test $opt --no-default-features --manifest-path libc-test/Cargo.toml --target "${TARGET}" -fi -# Test the #[repr(align(x))] feature if this is building on Rust >= 1.25 -if [ "$(rustc --version | sed -E 's/^rustc 1\.([0-9]*)\..*/\1/')" -ge 25 ]; then - cargo test $opt --features align --manifest-path libc-test/Cargo.toml --target "${TARGET}" -fi -# Test the `extra_traits` feature if this is building on Rust >= 1.25 -if [ "$(rustc --version | sed -E 's/^rustc 1\.([0-9]*)\..*/\1/')" -ge 25 ]; then - cargo test $opt --features extra_traits --manifest-path libc-test/Cargo.toml --target "${TARGET}" -fi -exec cargo test $opt --manifest-path libc-test/Cargo.toml --target "${TARGET}" +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}"