diff options
author | Andreas Tolfsen <ato@mozilla.com> | 2016-09-06 13:07:10 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-06 13:07:10 +0300 |
commit | 39b2b269df496d17c8041bd579a4a409ee2e3050 (patch) | |
tree | 663bbb74af473adbc74f4046ede2362e032b595e | |
parent | c0c134fe611d77fdd6dfc4a85fa3a40e8caa9119 (diff) | |
parent | 994cb3177414e51ac7bef8bdeb143beef2fda4d6 (diff) |
Merge pull request #213 from mozilla/win32_docker
Cross-compile on win32 using Docker image from port-of-rust
-rw-r--r-- | .travis.yml | 20 | ||||
-rw-r--r-- | build.sh | 148 | ||||
-rw-r--r-- | ci.sh | 136 |
3 files changed, 181 insertions, 123 deletions
diff --git a/.travis.yml b/.travis.yml index 7437898..7d0c623 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,9 @@ language: generic +cache: + directories: + - $HOME/.cargo + - $TRAVIS_BUILD_DIR/target + - $HOME/docker/ matrix: include: @@ -38,18 +43,21 @@ matrix: - gcc-mingw-w64-x86-64 - binutils-mingw-w64-x86-64 - libbz2-dev + - os: linux + env: + - TARGET=i686-pc-windows-gnu + - NAME=win32 + - EXT=zip + - USE_DOCKER=1 + dist: trusty + services: + - docker - os: osx env: - TARGET=x86_64-apple-darwin - NAME=macos - EXT=tar.gz -install: - - export PATH="$PATH:$HOME/.cargo/bin" - - curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=beta - - rustc -V - - cargo -V - script: - bash ci.sh diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..186363e --- /dev/null +++ b/build.sh @@ -0,0 +1,148 @@ +set -ex + +print_versions() { + rustc -V + cargo -V +} + +rustup_install() { + export PATH="$PATH:$HOME/.cargo/bin" + curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=beta +} + +# Add provided target to current Rust toolchain if it is not already +# the default or installed. +rustup_target_add() { + if ! rustup target list | grep -E "$1 \((default|installed)\)" + then + rustup target add $1 + fi +} + +setup_docker() { + apt-get -qq -y install zip + cd /mnt/host +} + +# Configure rustc target for cross compilation. Provided with a build +# target, this will determine which linker to use for cross compilation. +cargo_config() { + local prefix + + case "$TARGET" in + aarch64-unknown-linux-gnu) + prefix=aarch64-linux-gnu + ;; + arm*-unknown-linux-gnueabihf) + prefix=arm-linux-gnueabihf + ;; + arm-unknown-linux-gnueabi) + prefix=arm-linux-gnueabi + ;; + mipsel-unknown-linux-musl) + prefix=mipsel-openwrt-linux + ;; + x86_64-pc-windows-gnu) + prefix=x86_64-w64-mingw32 + ;; + *) + return + ;; + esac + + mkdir -p ~/.cargo + cat >~/.cargo/config <<EOF +[target.$TARGET] +linker = "$prefix-gcc" +EOF +} + +# Build current crate for given target and print file type information. +# If the second argument is set, a release build will be made. +cargo_build() { + local mode + if [ -z "$2" ] + then + mode=debug + else + mode=release + fi + + local modeflag + if [ "$mode" == "release" ] + then + modeflag=--release + fi + + cargo build --target $1 $modeflag + + file $(get_binary $1 $mode) +} + +# Run current crate's tests if the current system supports it. +cargo_test() { + if echo "$1" | grep -E "(i686|x86_64)-unknown-linux-(gnu|musl)|darwin" + then + cargo test --target $1 + fi +} + +# Returns relative path to binary +# based on build target and type ("release"/"debug"). +get_binary() { + local ext + if [[ "$1" =~ "windows" ]] + then + ext=".exe" + fi + echo "target/$1/$2/geckodriver$ext" +} + +# Create a compressed archive of the binary +# for the given given git tag, build target, and build type. +package_binary() { + local bin + bin=$(get_binary $2 $4) + cp $bin . + + if [[ "$2" =~ "windows" ]] + then + filename="geckodriver-$1-$3.zip" + zip "$filename" geckodriver.exe + file "$filename" + else + filename="geckodriver-$1-$3.tar.gz" + tar zcvf "$filename" geckodriver + file "$filename" + fi + if [ ! -z "$USE_DOCKER" ] + then + chown "$USER_ID:$GROUP_ID" "$filename" + fi +} + +main() { + if [ ! -z "$USE_DOCKER" ] + then + setup_docker + print_versions + else + rustup_install + print_versions + rustup_target_add $TARGET + fi + + cargo_config $TARGET + cargo_build $TARGET + cargo_test $TARGET + + # when something is tagged, + # also create a release build and package it + if [ ! -z "$TRAVIS_TAG" ] + then + cargo_build $TARGET 1 + package_binary $TRAVIS_TAG $TARGET $NAME "release" + fi +} + +main @@ -1,119 +1,21 @@ set -ex -# Add provided target to current Rust toolchain if it is not already -# the default or installed. -rustup_target_add() { - if ! rustup target list | grep -E "$1 \((default|installed)\)" - then - rustup target add $1 - fi -} - -# Configure rustc target for cross compilation. Provided with a build -# target, this will determine which linker to use for cross compilation. -cargo_config() { - local prefix - - case "$TARGET" in - aarch64-unknown-linux-gnu) - prefix=aarch64-linux-gnu - ;; - arm*-unknown-linux-gnueabihf) - prefix=arm-linux-gnueabihf - ;; - arm-unknown-linux-gnueabi) - prefix=arm-linux-gnueabi - ;; - mipsel-unknown-linux-musl) - prefix=mipsel-openwrt-linux - ;; - x86_64-pc-windows-gnu) - prefix=x86_64-w64-mingw32 - ;; - *) - return - ;; - esac - - mkdir -p ~/.cargo - cat >>~/.cargo/config <<EOF -[target.$TARGET] -linker = "$prefix-gcc" -EOF -} - -# Build current crate for given target and print file type information. -# If the second argument is set, a release build will be made. -cargo_build() { - local mode - if [ -z "$2" ] - then - mode=debug - else - mode=release - fi - - local modeflag - if [ "$mode" == "release" ] - then - modeflag=--release - fi - - cargo build --target $1 $modeflag - - file $(get_binary $1 $mode) -} - -# Run current crate's tests if the current system supports it. -cargo_test() { - if echo "$1" | grep -E "(i686|x86_64)-unknown-linux-(gnu|musl)|darwin" - then - cargo test --target $1 - fi -} - -# Returns relative path to binary -# based on build target and type ("release"/"debug"). -get_binary() { - local ext - if [[ "$1" =~ "windows" ]] - then - ext=".exe" - fi - echo "target/$1/$2/geckodriver$ext" -} - -# Create a compressed archive of the binary -# for the given given git tag, build target, and build type. -package_binary() { - local bin - bin=$(get_binary $2 $4) - cp $bin . - - if [[ "$2" =~ "windows" ]] - then - zip geckodriver-$1-$3.zip geckodriver.exe - file geckodriver-$1-$3.zip - else - tar zcvf geckodriver-$1-$3.tar.gz geckodriver - file geckodriver-$1-$3.tar.gz - fi -} - -main() { - rustup_target_add $TARGET - - cargo_config $TARGET - cargo_build $TARGET - cargo_test $TARGET - - # when something is tagged, - # also create a release build and package it - if [ ! -z "$TRAVIS_TAG" ] - then - cargo_build $TARGET 1 - package_binary $TRAVIS_TAG $TARGET $NAME "release" - fi -} - -main +if [ ! -z "$USE_DOCKER" ] +then + ls . + tag="port-of-rust/$TARGET/latest" + docker build https://github.com/alexcrichton/port-of-rust.git -f "$TARGET/Dockerfile" -t $tag + docker run\ + -e USER="$USER"\ + -e TARGET="$TARGET"\ + -e USE_DOCKER=1\ + -e NAME="$NAME"\ + -e TRAVIS_TAG="$TRAVIS_TAG"\ + -e USER_ID=$(id -u)\ + -e GROUP_ID=$(id -g)\ + -v $PWD:/mnt/host\ + -i $tag\ + bash -s -- < build.sh +else + bash build.sh +fi |