geckodriver: Merge pull request #213 from mozilla/win32_docker

Cross-compile on win32 using Docker image from port-of-rust

Source-Repo: https://github.com/mozilla/geckodriver
Source-Revision: 39b2b269df496d17c8041bd579a4a409ee2e3050

--HG--
rename : testing/geckodriver/ci.sh => testing/geckodriver/build.sh
extra : rebase_source : 2549ca79b2acbe17e0807d3c1a339459397fc311
This commit is contained in:
James Graham 2016-09-06 11:07:10 +01:00
parent 390ed07f10
commit 90ef98cd1e
3 changed files with 181 additions and 123 deletions

View File

@ -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

View File

@ -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

View File

@ -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