diff --git a/.travis.yml b/.travis.yml index e08e05e4f6..53bc090e02 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,102 +1,106 @@ -# -# Operating Environment -# -language: rust -sudo: false +# Based on the "trust" template v0.1.1 +# https://github.com/japaric/trust/tree/v0.1.1 + dist: trusty -services: - - docker -addons: - apt: - packages: - - gcc-multilib - - libcurl4-openssl-dev - - libelf-dev - - libdw-dev - - binutils-dev - -rust: - - 1.7.0 # Oldest supported version - - stable - - beta - - nightly - -# -# Environment Variables and Build Matrix -# +language: rust +services: docker +sudo: required + +# This is the Rust channel that build jobs will use by default but can be +# overridden on a case by case basis down below +rust: stable + env: global: - - PATH=$HOME/.local/bin:$PATH - - TRAVIS_CARGO_NIGHTLY_FEATURE="" - matrix: - - ARCH=x86_64 - - ARCH=i686 + - CRATE_NAME=nix -os: # OSX included in build matrix explicitly - - linux + # default job + - TARGET=x86_64-unknown-linux-gnu -# Failures on nightly shouldn't fail the overall build. matrix: - fast_finish: true + # These are all the build jobs. Adjust as necessary. Comment out what you + # don't need include: - # 32-bit and 64-bit OSX builds on oldest/stable - - os: osx - env: ARCH=x86_64 - rust: stable - - os: osx - env: ARCH=i686 - rust: stable - # Docker builds for other targets - - os: linux - env: TARGET=aarch64-unknown-linux-gnu DOCKER_IMAGE=posborne/rust-cross:arm - rust: 1.7.0 - sudo: true - - os: linux - env: TARGET=arm-unknown-linux-gnueabihf DOCKER_IMAGE=posborne/rust-cross:arm - rust: 1.7.0 - sudo: true - - os: linux - env: TARGET=mips-unknown-linux-gnu DOCKER_IMAGE=posborne/rust-cross:mips - rust: 1.7.0 - sudo: true - - os: linux - env: TARGET=mipsel-unknown-linux-gnu DOCKER_IMAGE=posborne/rust-cross:mips - rust: 1.7.0 - sudo: true - - os: linux - env: TARGET=arm-linux-androideabi DOCKER_IMAGE=posborne/rust-cross:android - rust: 1.7.0 - sudo: true - allow_failures: - - rust: nightly - # We need to upgrade the lowest supported version. However, the build - # infrastructure for arm/mips/android is not ready yet. - - rust: 1.7.0 - - env: TARGET=mips-unknown-linux-gnu DOCKER_IMAGE=posborne/rust-cross:mips - - env: TARGET=mipsel-unknown-linux-gnu DOCKER_IMAGE=posborne/rust-cross:mips - - env: TARGET=arm-linux-androideabi DOCKER_IMAGE=posborne/rust-cross:android - - -# -# Build/Test/Deploy Steps -# -before_script: - - pip install 'travis-cargo<0.2' --user + # Linux + - env: TARGET=i686-unknown-linux-gnu + - env: TARGET=i686-unknown-linux-musl + # - env: TARGET=x86_64-unknown-linux-gnu # this is the default job + - env: TARGET=x86_64-unknown-linux-musl + + # OSX + - env: TARGET=i686-apple-darwin + os: osx + - env: TARGET=x86_64-apple-darwin + os: osx + + # *BSD + - env: TARGET=i686-unknown-freebsd DISABLE_TESTS=1 + - env: TARGET=x86_64-unknown-freebsd DISABLE_TESTS=1 + - env: TARGET=x86_64-unknown-netbsd DISABLE_TESTS=1 + + # Other architectures + - env: TARGET=aarch64-unknown-linux-gnu + - env: TARGET=armv7-unknown-linux-gnueabihf + - env: TARGET=mips-unknown-linux-gnu + # - env: TARGET=mips64-unknown-linux-gnuabi64 + # - env: TARGET=mips64el-unknown-linux-gnuabi64 + - env: TARGET=mipsel-unknown-linux-gnu + - env: TARGET=powerpc-unknown-linux-gnu + # - env: TARGET=powerpc64-unknown-linux-gnu + # - env: TARGET=powerpc64le-unknown-linux-gnu + # - env: TARGET=s390x-unknown-linux-gnu + - env: TARGET=arm-unknown-linux-gnueabi + # - env: TARGET=arm-unknown-linux-musleabi + + # Testing other channels + - env: TARGET=x86_64-unknown-linux-gnu + rust: nightly + - env: TARGET=x86_64-apple-darwin + os: osx + rust: nightly + +install: + - sh ci/install.sh + - source ~/.cargo/env || true script: - - bash ci/run-travis.sh - - | - if [ "$TRAVIS_OS_NAME" = "linux" ]; then - travis-cargo --only stable doc - fi - -after_success: - - | - if [ "$TRAVIS_OS_NAME" = "linux" ] && \ - [ "$TRAVIS_RUST_VERSION" = "stable" ] && \ - [ "$ARCH" = "x86_64" ]; then - # Upload docs for stable (on master) to gh-pages - travis-cargo --only stable doc-upload - # Measure code coverage using kcov and upload to coveralls.io - travis-cargo coveralls --no-sudo --verify - fi + - bash ci/script.sh + +before_deploy: + - sh ci/before_deploy.sh + +deploy: + # TODO update `api_key.secure` + # - Create a `public_repo` GitHub token. Go to: https://github.com/settings/tokens/new + # - Encrypt it: `travis encrypt GH_TOKEN=0123456789012345678901234567890123456789` + # - Paste the output down here + api_key: + secure: S1ktt0eqmfrEHnYPf4WO7mZtatz/FWfYWBp8nwdc0nd8H6UNZ9Dwy3tJpVe0N9rpB9vAFnkdw6R4jdkIcgxfory2F3F8k/mh8cWn0mkvh2N34YjHMYLnuVzOoFrWai7IcPfROpdlY0tGBlwNj5KMkeBnHUJzd2q4j/4j/tlrfmg= + file_glob: true + file: $CRATE_NAME-$TRAVIS_TAG-$TARGET.* + on: + # Here you can pick which targets will generate binary releases + # In this example, there are some targets that are tested using the stable + # and nightly channels. This condition makes sure there is only one release + # for such targets and that's generated using the stable channel + # + # Here we make it so we never generate binary releases + condition: $DEPLOY = never + tags: true + provider: releases + skip_cleanup: true + +cache: cargo +before_cache: + # Travis can't cache files that are not readable by "others" + - chmod -R a+r $HOME/.cargo + +branches: + only: + # release tags + - /^v\d+\.\d+\.\d+.*$/ + - master + +notifications: + email: + on_success: never diff --git a/CHANGELOG.md b/CHANGELOG.md index bb3aeedb16..fd7bb0953a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ([#508](https://github.com/nix-rust/nix/pull/508)) - Fixed the style of many bitflags and use `libc` in more places. ([#503](https://github.com/nix-rust/nix/pull/503)) +- Added `ppoll` in `::nix::poll` + ([#520](https://github.com/nix-rust/nix/pull/520)) ### Changed - `::nix::sys::termios::{cfgetispeed, cfsetispeed, cfgetospeed, cfsetospeed}` diff --git a/ci/README.md b/ci/README.md deleted file mode 100644 index c86fd7157d..0000000000 --- a/ci/README.md +++ /dev/null @@ -1,48 +0,0 @@ -Test Infrastructure -=================== - -The ci directory contains scripts that aid in the testing of nix both -in our continuous integration environment (Travis CI) but also for -developers working locally. - -Nix interfaces very directly with the underlying platform (usually via -libc) and changes need to be tested on a large number of platforms to -avoid problems. - -Running Tests For Host Architecture ------------------------------------ - -Running the tests for one's host architecture can be done by simply -doing the following: - - $ cargo test - -Running Tests Against All Architectures/Versions ------------------------------------------------- - -Testing for other architectures is more involved. Currently, -developers may run tests against several architectures and versions of -rust by running the `ci/run-all.sh` script. This scripts requires -that docker be set up. This will take some time: - - $ ci/run-all.sh - -The list of versions and architectures tested by this can be -determined by looking at the contents of the script. The docker image -used is [posborne/rust-cross][posborne/rust-cross]. - -[posborne/rust-cross]: https://github.com/rust-embedded/docker-rust-cross - -Running Test for Specific Architectures/Versions ------------------------------------------------- - -Suppose we have a failing test with Rust 1.7 on the raspberry pi. In -that case, we can run the following: - - $ DOCKER_IMAGE=posborne/rust-cross:arm \ - RUST_VERSION=1.7.0 \ - RUST_TARGET=arm-unknown-linux-gnueabihf ci/run-docker.sh - -Currently, the docker images only support Rust 1.7. To get a better -idea of combinations that might work, look at the contents of the -[travis configuration](../.travis.yml) or [run-all.sh](run-all.sh). diff --git a/ci/before_deploy.ps1 b/ci/before_deploy.ps1 new file mode 100644 index 0000000000..191a30b88d --- /dev/null +++ b/ci/before_deploy.ps1 @@ -0,0 +1,23 @@ +# This script takes care of packaging the build artifacts that will go in the +# release zipfile + +$SRC_DIR = $PWD.Path +$STAGE = [System.Guid]::NewGuid().ToString() + +Set-Location $ENV:Temp +New-Item -Type Directory -Name $STAGE +Set-Location $STAGE + +$ZIP = "$SRC_DIR\$($Env:CRATE_NAME)-$($Env:APPVEYOR_REPO_TAG_NAME)-$($Env:TARGET).zip" + +# TODO Update this to package the right artifacts +Copy-Item "$SRC_DIR\target\$($Env:TARGET)\release\hello.exe" '.\' + +7z a "$ZIP" * + +Push-AppveyorArtifact "$ZIP" + +Remove-Item *.* -Force +Set-Location .. +Remove-Item $STAGE +Set-Location $SRC_DIR diff --git a/ci/before_deploy.sh b/ci/before_deploy.sh new file mode 100644 index 0000000000..026dc2898d --- /dev/null +++ b/ci/before_deploy.sh @@ -0,0 +1,33 @@ +# This script takes care of building your crate and packaging it for release + +set -ex + +main() { + local src=$(pwd) \ + stage= + + case $TRAVIS_OS_NAME in + linux) + stage=$(mktemp -d) + ;; + osx) + stage=$(mktemp -d -t tmp) + ;; + esac + + test -f Cargo.lock || cargo generate-lockfile + + # TODO Update this to build the artifacts that matter to you + cross rustc --bin hello --target $TARGET --release -- -C lto + + # TODO Update this to package the right artifacts + cp target/$TARGET/release/hello $stage/ + + cd $stage + tar czf $src/$CRATE_NAME-$TRAVIS_TAG-$TARGET.tar.gz * + cd $src + + rm -rf $stage +} + +main diff --git a/ci/cargo-config b/ci/cargo-config deleted file mode 100644 index 6fee5be7a8..0000000000 --- a/ci/cargo-config +++ /dev/null @@ -1,18 +0,0 @@ -# Configuration of which linkers to call on Travis for various architectures -[target.arm-linux-androideabi] -linker = "arm-linux-androideabi-gcc" - -[target.arm-unknown-linux-gnueabihf] -linker = "arm-linux-gnueabihf-gcc-4.7" - -[target.mips-unknown-linux-gnu] -linker = "mips-linux-gnu-gcc-5" - -[target.mipsel-unknown-linux-gnu] -linker = "mipsel-linux-gnu-gcc-5" - -[target.aarch64-unknown-linux-gnu] -linker = "aarch64-linux-gnu-gcc-4.8" - -[target.powerpc-unknown-linux-gnu] -linker = "powerpc-linux-gnu-gcc-4.8" diff --git a/ci/install.sh b/ci/install.sh new file mode 100644 index 0000000000..4093c9b2d7 --- /dev/null +++ b/ci/install.sh @@ -0,0 +1,24 @@ +set -ex + +main() { + curl https://sh.rustup.rs -sSf | \ + sh -s -- -y --default-toolchain $TRAVIS_RUST_VERSION + + local target= + if [ $TRAVIS_OS_NAME = linux ]; then + target=x86_64-unknown-linux-gnu + else + target=x86_64-apple-darwin + fi + + # TODO At some point you'll probably want to use a newer release of `cross`, + # simply change the argument to `--tag`. + curl -LSfs https://japaric.github.io/trust/install.sh | \ + sh -s -- \ + --force \ + --git japaric/cross \ + --tag v0.1.4 \ + --target $target +} + +main diff --git a/ci/run-all.sh b/ci/run-all.sh deleted file mode 100755 index a7d1ece9ea..0000000000 --- a/ci/run-all.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# -# Build nix and all tests for as many versions and platforms as can be -# managed. This requires docker. -# - -set -e - -BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -RUN_DOCKER="${BASE_DIR}/ci/run-docker.sh" - -export RUST_VERSION=1.7.0 - -export DOCKER_IMAGE=posborne/rust-cross:x86 -RUST_TARGET=i686-unknown-linux-gnu ${RUN_DOCKER} -RUST_TARGET=x86_64-unknown-linux-gnu ${RUN_DOCKER} -RUST_TARGET=x86_64-unknown-linux-musl ${RUN_DOCKER} - -export DOCKER_IMAGE=posborne/rust-cross:arm -RUST_TARGET=aarch64-unknown-linux-gnu ${RUN_DOCKER} -RUST_TARGET=arm-linux-gnueabi ${RUN_DOCKER} -RUST_TARGET=arm-linux-gnueabihf ${RUN_DOCKER} - -export DOCKER_IMAGE=posborne/rust-cross:mips -RUST_TARGET=mips-unknown-linux-gnu ${RUN_DOCKER} -RUST_TARGET=mipsel-unknown-linux-gnu ${RUN_DOCKER} - -export DOCKER_IMAGE=posborne/rust-cross:android ${RUN_DOCKER} -RUST_TARGET=arm-linux-androideabi ${RUN_DOCKER} diff --git a/ci/run-docker.sh b/ci/run-docker.sh deleted file mode 100755 index 3ef831c32c..0000000000 --- a/ci/run-docker.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# -# Run the nix tests in a docker container. This script expects the following -# environment variables to be set: -# - DOCKER_IMAGE : Docker image to use for testing (e.g. posborne/rust-cross:arm) -# - RUST_VERSION : Rust Version to test against (e.g. 1.7.0) -# - RUST_TARGET : Target Triple to test - -BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" - -docker run -i -t \ - -v ${BASE_DIR}:/source \ - -e CARGO_TARGET_DIR=/build \ - ${DOCKER_IMAGE} \ - /source/ci/run.sh ${RUST_VERSION} ${RUST_TARGET} diff --git a/ci/run-travis.sh b/ci/run-travis.sh deleted file mode 100644 index 5be6372e51..0000000000 --- a/ci/run-travis.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/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. -# -# Much of this script was liberally stolen from rust-lang/libc -# -# Key variables that may be set from Travis: -# - TRAVIS_RUST_VERSION: 1.1.0 ... stable/nightly/beta -# - TRAVIS_OS_NAME: linux/osx -# - DOCKER_IMAGE: posborne/rust-cross:arm -# - TARGET: e.g. arm-unknown-linux-gnueabihf - -set -ex - -BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" - -if [ "$TRAVIS_OS_NAME" = "linux" ]; then - OS=unknown-linux-gnu -elif [ "$TRAVIS_OS_NAME" = "osx" ]; then - OS=apple-darwin -else - echo "Unexpected TRAVIS_OS_NAME: $TRAVIS_OS_NAME" - exit 1 -fi - -export HOST=$ARCH-$OS -if [ "$TARGET" = "" ]; then - TARGET=$HOST -fi - -if [ "$DOCKER_IMAGE" = "" ]; then - export RUST_TEST_THREADS=1 - curl -sSL "https://raw.githubusercontent.com/carllerche/travis-rust-matrix/master/test" | bash -else - export RUST_VERSION=${TRAVIS_RUST_VERSION} - export RUST_TARGET=${TARGET} - export DOCKER_IMAGE=${DOCKER_IMAGE} - ${BASE_DIR}/ci/run-docker.sh -fi diff --git a/ci/run.sh b/ci/run.sh deleted file mode 100755 index 770f5aa712..0000000000 --- a/ci/run.sh +++ /dev/null @@ -1,137 +0,0 @@ -#!/bin/bash - -# Builds and runs tests for a particular target passed as an argument to this -# script. - -set -e - -# This should only be run in a docker container, so verify that -if [ ! $(pidof $0) = "1" ]; then - echo "run.sh should only be executed in a docker container" - echo "and that does not appear to be the case. Maybe you meant" - echo "to execute the tests via run-all.sh or run-docker.sh." - echo "" - echo "For more instructions, please refer to ci/README.md" - exit 1 -fi - -BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -MANIFEST_PATH="${BASE_DIR}/Cargo.toml" -BUILD_DIR="." - -VERSION="$1" -TARGET="$2" - -export DOCKER_ENVIRONMENT=1 -export RUST_TEST_THREADS=1 -export RUST_BACKTRACE=1 - -# -# Tell cargo what linker to use and whatever else is required -# -configure_cargo() { - mkdir -p .cargo - cp -b "${BASE_DIR}/ci/cargo-config" .cargo/config -} - -# -# We need to export CC for the tests to build properly (some C code is -# compiled) to work. We already tell Cargo about the compiler in the -# cargo config, so we just parse that info out of the cargo config -# -cc_for_target() { - awk "/\[target\.${TARGET}\]/{getline; print}" .cargo/config | - cut -d '=' -f2 | \ - tr -d '"' | tr -d ' ' -} - -cross_compile_tests() { - case "$TARGET" in - *-apple-ios) - cargo test --no-run --manifest-path="${MANIFEST_PATH}" --target "$TARGET" -- \ - -C link-args=-mios-simulator-version-min=7.0 - ;; - - *) - cargo test --no-run --verbose \ - --manifest-path="${MANIFEST_PATH}" \ - --target "$TARGET" - ;; - esac -} - -# This is a hack as we cannot currently -# ask cargo what test files it generated: -# https://github.com/rust-lang/cargo/issues/1924 -find_binaries() { - target_base_dir="${BUILD_DIR}/${TARGET}/debug" - - # find [[test]] sections and print the first line and - # hack it to what we want from there. Also "nix" for - # tests that are implicitly prsent - for test_base in $( awk '/\[\[test\]\]/{getline; print}' "${MANIFEST_PATH}" | \ - cut -d '=' -f2 | \ - tr -d '"' | \ - tr '-' '_' | \ - tr -d ' '; echo "nix" ); do - for path in ${target_base_dir}/${test_base}-* ; do - echo "${path} " - done - done -} - -test_binary() { - binary=$1 - - case "$TARGET" in - arm-linux-gnueabi-gcc) - qemu-arm -L /usr/arm-linux-gnueabihf "$binary" - ;; - - arm-unknown-linux-gnueabihf) - qemu-arm -L /usr/arm-linux-gnueabihf "$binary" - ;; - - mips-unknown-linux-gnu) - qemu-mips -L /usr/mips-linux-gnu "$binary" - ;; - - aarch64-unknown-linux-gnu) - qemu-aarch64 -L /usr/aarch64-linux-gnu "$binary" - ;; - - *-rumprun-netbsd) - rumprun-bake hw_virtio /tmp/nix-test.img "${binary}" - qemu-system-x86_64 -nographic -vga none -m 64 \ - -kernel /tmp/nix-test.img 2>&1 | tee /tmp/out & - sleep 5 - grep "^PASSED .* tests" /tmp/out - ;; - - *) - echo "Running binary: ${binary}" - ${binary} - ;; - esac -} - -echo "=======================================================" -echo "TESTING VERSION: ${VERSION}, TARGET: ${TARGET}" -echo "=======================================================" - -configure_cargo -export CC="$(cc_for_target)" -if [ "${CC}" = "" ]; then - unset CC -fi - -# select the proper version -multirust override ${VERSION} - -# build the tests -cross_compile_tests - -# and run the tests -for bin in $(find_binaries); do - test_binary "${bin}" -done diff --git a/ci/script.sh b/ci/script.sh new file mode 100644 index 0000000000..39c3aeec73 --- /dev/null +++ b/ci/script.sh @@ -0,0 +1,22 @@ +# This script takes care of testing your crate + +set -ex + +main() { + # Build debug and release targets + cross build --target $TARGET + cross build --target $TARGET --release + + if [ ! -z $DISABLE_TESTS ]; then + return + fi + + # Run tests on debug and release targets. + cross test --target $TARGET + cross test --target $TARGET --release +} + +# we don't run the "test phase" when doing deploys +if [ -z $TRAVIS_TAG ]; then + main +fi diff --git a/src/poll.rs b/src/poll.rs index 72988d8c3e..8a3de5f1da 100644 --- a/src/poll.rs +++ b/src/poll.rs @@ -1,3 +1,8 @@ +#[cfg(any(target_os = "linux", target_os = "android"))] +use sys::time::TimeSpec; +#[cfg(any(target_os = "linux", target_os = "android"))] +use sys::signal::SigSet; + use libc; use {Errno, Result}; @@ -47,3 +52,16 @@ pub fn poll(fds: &mut [PollFd], timeout: libc::c_int) -> Result { Errno::result(res) } + +#[cfg(any(target_os = "linux", target_os = "android"))] +pub fn ppoll(fds: &mut [PollFd], timeout: TimeSpec, sigmask: SigSet) -> Result { + + + let res = unsafe { + libc::ppoll(fds.as_mut_ptr() as *mut libc::pollfd, + fds.len() as libc::nfds_t, + timeout.as_ref(), + sigmask.as_ref()) + }; + Errno::result(res) +}