mirror of
https://github.com/fluencelabs/wasmer
synced 2024-12-05 02:20:19 +00:00
enable testing on Android x86_64
Currently, at the time of 2020/03/11, testing on AArch64 is not supported in the upstream repository
This commit is contained in:
parent
96a0f851c2
commit
93f6a9b91b
4
.gitignore
vendored
4
.gitignore
vendored
@ -8,3 +8,7 @@ install/
|
|||||||
capi/
|
capi/
|
||||||
api-docs/
|
api-docs/
|
||||||
api-docs-repo/
|
api-docs-repo/
|
||||||
|
|
||||||
|
# Generated by tests on Android
|
||||||
|
/avd
|
||||||
|
/core
|
||||||
|
9
Cargo.lock
generated
9
Cargo.lock
generated
@ -748,8 +748,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.67"
|
version = "0.2.68"
|
||||||
source = "git+https://github.com/rust-lang/libc.git#b22922f7d86a7e5cccc7bc039a375b23d11436b4"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "llvm-sys"
|
name = "llvm-sys"
|
||||||
@ -1775,9 +1776,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wabt-sys"
|
name = "wabt-sys"
|
||||||
version = "0.7.0"
|
version = "0.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "af5d153dc96aad7dc13ab90835b892c69867948112d95299e522d370c4e13a08"
|
checksum = "23d7043ebb3e5d96fad7a8d3ca22ee9880748ff8c3e18092cfb2a49d3b8f9084"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"cmake",
|
"cmake",
|
||||||
|
3
ci/README.md
Normal file
3
ci/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# About this directory
|
||||||
|
|
||||||
|
This directory is originally copied from [rust-lang/libc/ci](https://github.com/rust-lang/libc/tree/master/ci).
|
19
ci/android-install-ndk.sh
Normal file
19
ci/android-install-ndk.sh
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
# file at the top-level directory of this distribution and at
|
||||||
|
# http://rust-lang.org/COPYRIGHT.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
# option. This file may not be copied, modified, or distributed
|
||||||
|
# except according to those terms.
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
NDK=android-ndk-r19c
|
||||||
|
curl --retry 20 -O https://dl.google.com/android/repository/${NDK}-linux-x86_64.zip
|
||||||
|
unzip -q -d ndk ${NDK}-linux-x86_64.zip
|
||||||
|
mv ./ndk/"$NDK"/* ./ndk/
|
||||||
|
|
||||||
|
rm -rf ./${NDK}-linux-x86_64.zip
|
73
ci/android-install-sdk.sh
Normal file
73
ci/android-install-sdk.sh
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
# file at the top-level directory of this distribution and at
|
||||||
|
# http://rust-lang.org/COPYRIGHT.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
# option. This file may not be copied, modified, or distributed
|
||||||
|
# except according to those terms.
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
# Prep the SDK and emulator
|
||||||
|
#
|
||||||
|
# Note that the update process requires that we accept a bunch of licenses, and
|
||||||
|
# we can't just pipe `yes` into it for some reason, so we take the same strategy
|
||||||
|
# located in https://github.com/appunite/docker by just wrapping it in a script
|
||||||
|
# which apparently magically accepts the licenses.
|
||||||
|
|
||||||
|
SDK=4333796
|
||||||
|
mkdir sdk
|
||||||
|
curl --retry 20 https://dl.google.com/android/repository/sdk-tools-linux-${SDK}.zip -O
|
||||||
|
unzip -q -d sdk sdk-tools-linux-${SDK}.zip
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
arm | armv7)
|
||||||
|
api=24
|
||||||
|
image="system-images;android-${api};google_apis;armeabi-v7a"
|
||||||
|
;;
|
||||||
|
aarch64)
|
||||||
|
api=24
|
||||||
|
image="system-images;android-${api};google_apis;arm64-v8a"
|
||||||
|
;;
|
||||||
|
i686)
|
||||||
|
api=28
|
||||||
|
image="system-images;android-${api};default;x86"
|
||||||
|
;;
|
||||||
|
x86_64)
|
||||||
|
api=28
|
||||||
|
image="system-images;android-${api};default;x86_64"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "invalid arch: $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac;
|
||||||
|
|
||||||
|
# Try to fix warning about missing file.
|
||||||
|
# See https://askubuntu.com/a/1078784
|
||||||
|
mkdir -p /root/.android/
|
||||||
|
echo '### User Sources for Android SDK Manager' >> /root/.android/repositories.cfg
|
||||||
|
echo '#Fri Nov 03 10:11:27 CET 2017 count=0' >> /root/.android/repositories.cfg
|
||||||
|
|
||||||
|
# Print all available packages
|
||||||
|
# yes | ./sdk/tools/bin/sdkmanager --list --verbose
|
||||||
|
|
||||||
|
# --no_https avoids
|
||||||
|
# javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
|
||||||
|
#
|
||||||
|
# | grep -v = || true removes the progress bar output from the sdkmanager
|
||||||
|
# which produces an insane amount of output.
|
||||||
|
yes | ./sdk/tools/bin/sdkmanager --licenses --no_https | grep -v = || true
|
||||||
|
yes | ./sdk/tools/bin/sdkmanager --no_https \
|
||||||
|
"emulator" \
|
||||||
|
"platform-tools" \
|
||||||
|
"platforms;android-${api}" \
|
||||||
|
"${image}" | grep -v = || true
|
||||||
|
|
||||||
|
echo "no" |
|
||||||
|
./sdk/tools/bin/avdmanager create avd \
|
||||||
|
--name "${1}" \
|
||||||
|
--package "${image}" | grep -v = || true
|
56
ci/android-sysimage.sh
Normal file
56
ci/android-sysimage.sh
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
# file at the top-level directory of this distribution and at
|
||||||
|
# http://rust-lang.org/COPYRIGHT.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
# option. This file may not be copied, modified, or distributed
|
||||||
|
# except according to those terms.
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
URL=https://dl.google.com/android/repository/sys-img/android
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local arch="${1}"
|
||||||
|
local name="${2}"
|
||||||
|
local dest=/system
|
||||||
|
local td
|
||||||
|
td="$(mktemp -d)"
|
||||||
|
|
||||||
|
apt-get install --no-install-recommends e2tools
|
||||||
|
|
||||||
|
pushd "${td}"
|
||||||
|
curl --retry 5 -O "${URL}/${name}"
|
||||||
|
unzip -q "${name}"
|
||||||
|
|
||||||
|
local system
|
||||||
|
system="$(find . -name system.img)"
|
||||||
|
mkdir -p ${dest}/{bin,lib,lib64}
|
||||||
|
|
||||||
|
# Extract android linker and libraries to /system
|
||||||
|
# This allows android executables to be run directly (or with qemu)
|
||||||
|
if [ "${arch}" = "x86_64" ] || [ "${arch}" = "arm64" ]; then
|
||||||
|
e2cp -p "${system}:/bin/linker64" "${dest}/bin/"
|
||||||
|
e2cp -p "${system}:/lib64/libdl.so" "${dest}/lib64/"
|
||||||
|
e2cp -p "${system}:/lib64/libc.so" "${dest}/lib64/"
|
||||||
|
e2cp -p "${system}:/lib64/libm.so" "${dest}/lib64/"
|
||||||
|
else
|
||||||
|
e2cp -p "${system}:/bin/linker" "${dest}/bin/"
|
||||||
|
e2cp -p "${system}:/lib/libdl.so" "${dest}/lib/"
|
||||||
|
e2cp -p "${system}:/lib/libc.so" "${dest}/lib/"
|
||||||
|
e2cp -p "${system}:/lib/libm.so" "${dest}/lib/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# clean up
|
||||||
|
apt-get purge --auto-remove -y e2tools
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
rm -rf "${td}"
|
||||||
|
}
|
||||||
|
|
||||||
|
main "${@}"
|
53
ci/docker/aarch64-linux-android/Dockerfile
Normal file
53
ci/docker/aarch64-linux-android/Dockerfile
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
FROM ubuntu:19.04
|
||||||
|
|
||||||
|
RUN dpkg --add-architecture i386 && \
|
||||||
|
apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
file \
|
||||||
|
curl \
|
||||||
|
ca-certificates \
|
||||||
|
python \
|
||||||
|
unzip \
|
||||||
|
expect \
|
||||||
|
openjdk-8-jre \
|
||||||
|
libstdc++6:i386 \
|
||||||
|
libpulse0 \
|
||||||
|
gcc \
|
||||||
|
libc6-dev \
|
||||||
|
make \
|
||||||
|
cmake # cmake is necessary to build wabt
|
||||||
|
|
||||||
|
WORKDIR /android/
|
||||||
|
COPY android* /android/
|
||||||
|
|
||||||
|
ENV ANDROID_ARCH=aarch64
|
||||||
|
ENV PATH=$PATH:/android/sdk/tools:/android/sdk/platform-tools
|
||||||
|
|
||||||
|
RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
|
||||||
|
RUN sh /android/android-install-sdk.sh $ANDROID_ARCH
|
||||||
|
ENV ANDROID_NDK_HOME=/android/ndk
|
||||||
|
|
||||||
|
RUN mv /root/.android /tmp
|
||||||
|
RUN chmod 777 -R /tmp/.android
|
||||||
|
RUN chmod 755 /android/sdk/tools/* /android/sdk/emulator/qemu/linux-x86_64/*
|
||||||
|
|
||||||
|
ENV PATH=$PATH:/rust/bin:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin \
|
||||||
|
CARGO_TARGET_AARCH64_LINUX_ANDROID_AR=aarch64-linux-android-ar \
|
||||||
|
CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android28-clang++ \
|
||||||
|
CC_aarch64_linux_android=aarch64-linux-android28-clang \
|
||||||
|
CXX_aarch64_linux_android=aarch64-linux-android28-clang++ \
|
||||||
|
CARGO_TARGET_AARCH64_LINUX_ANDROID_RUNNER=/tmp/runtest \
|
||||||
|
HOME=/tmp
|
||||||
|
|
||||||
|
ADD runtest-android.rs /tmp/runtest.rs
|
||||||
|
|
||||||
|
ENTRYPOINT [ \
|
||||||
|
"bash", \
|
||||||
|
"-c", \
|
||||||
|
# set SHELL so android can detect a 64bits system, see
|
||||||
|
# http://stackoverflow.com/a/41789144
|
||||||
|
"SHELL=/bin/dash /android/sdk/emulator/emulator @aarch64 -no-window & \
|
||||||
|
rustc /tmp/runtest.rs -o /tmp/runtest && \
|
||||||
|
exec \"$@\"", \
|
||||||
|
"--" \
|
||||||
|
]
|
31
ci/docker/x86_64-linux-android/Dockerfile
Normal file
31
ci/docker/x86_64-linux-android/Dockerfile
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
FROM ubuntu:19.04
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
gcc \
|
||||||
|
libc-dev \
|
||||||
|
python \
|
||||||
|
unzip \
|
||||||
|
make \
|
||||||
|
cmake # cmake is necessary to build wabt
|
||||||
|
|
||||||
|
WORKDIR /android/
|
||||||
|
ENV ANDROID_ARCH=x86_64
|
||||||
|
COPY android-install-ndk.sh /android/
|
||||||
|
RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
|
||||||
|
ENV ANDROID_NDK_HOME=/android/ndk/
|
||||||
|
|
||||||
|
# We do not run x86_64-linux-android tests on an android emulator.
|
||||||
|
# See ci/android-sysimage.sh for informations about how tests are run.
|
||||||
|
COPY android-sysimage.sh /android/
|
||||||
|
RUN bash /android/android-sysimage.sh x86_64 x86_64-24_r07.zip
|
||||||
|
|
||||||
|
ENV PATH=$PATH:/rust/bin:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin \
|
||||||
|
CARGO_TARGET_X86_64_LINUX_ANDROID_AR=x86_64-linux-android-ar \
|
||||||
|
CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=x86_64-linux-android28-clang++ \
|
||||||
|
CC_x86_64_linux_android=x86_64-linux-android28-clang \
|
||||||
|
CXX_x86_64_linux_android=x86_64-linux-android28-clang++ \
|
||||||
|
LD_LIBRARY_PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/ \
|
||||||
|
HOME=/tmp
|
35
ci/run-docker.sh
Executable file
35
ci/run-docker.sh
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
# Small script to run tests for a target (or all targets) inside all the
|
||||||
|
# respective docker images.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "${HOME}"
|
||||||
|
pwd
|
||||||
|
|
||||||
|
TARGET="${1}"
|
||||||
|
shift
|
||||||
|
|
||||||
|
echo "Building docker container for target $target"
|
||||||
|
|
||||||
|
# use -f so we can use ci/ as build context
|
||||||
|
image_tag=test-"$TARGET"
|
||||||
|
docker build -t "$image_tag" -f "ci/docker/${TARGET}/Dockerfile" ci/
|
||||||
|
mkdir -p target
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
|
docker run \
|
||||||
|
--rm \
|
||||||
|
--user "$(id -u)":"$(id -g)" \
|
||||||
|
--env CARGO_HOME=/cargo \
|
||||||
|
--env CARGO_TARGET_DIR=/checkout/target \
|
||||||
|
--volume "$(dirname "$(dirname "$(command -v cargo)")")":/cargo \
|
||||||
|
--volume "$(rustc --print sysroot)":/rust:ro \
|
||||||
|
--volume "$(pwd)":/checkout:ro \
|
||||||
|
--volume "$(pwd)"/target:/checkout/target \
|
||||||
|
--init \
|
||||||
|
--workdir /checkout \
|
||||||
|
"$image_tag" \
|
||||||
|
sh -c "HOME=/tmp PATH=\$PATH:/rust/bin exec cargo test --target ${TARGET} $@"
|
60
ci/runtest-android.rs
Normal file
60
ci/runtest-android.rs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
use std::env;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args = env::args_os()
|
||||||
|
.skip(1)
|
||||||
|
.filter(|arg| arg != "--quiet")
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
assert_eq!(args.len(), 1);
|
||||||
|
let test = PathBuf::from(&args[0]);
|
||||||
|
|
||||||
|
// required to run an executable depending on wabt-rs
|
||||||
|
let android_ndk_home = env::var("ANDROID_NDK_HOME").expect("Can't get ANDROID_NDK_HOME!");
|
||||||
|
let path = format!("{}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so", android_ndk_home);
|
||||||
|
let libcpp_shared = Path::new(&path);
|
||||||
|
|
||||||
|
let dst = Path::new("/data/local/tmp");
|
||||||
|
let dst_exec = Path::new("/data/local/tmp").join(test.file_name().unwrap());
|
||||||
|
|
||||||
|
let status = Command::new("adb")
|
||||||
|
.arg("wait-for-device")
|
||||||
|
.status()
|
||||||
|
.expect("failed to run: adb wait-for-device");
|
||||||
|
assert!(status.success());
|
||||||
|
|
||||||
|
let status = Command::new("adb")
|
||||||
|
.arg("push")
|
||||||
|
.arg(&test)
|
||||||
|
.arg(&libcpp_shared)
|
||||||
|
.arg(&dst)
|
||||||
|
.status()
|
||||||
|
.expect("failed to run: adb pushr");
|
||||||
|
assert!(status.success());
|
||||||
|
|
||||||
|
let output = Command::new("adb")
|
||||||
|
.arg("shell")
|
||||||
|
.arg("LD_LIBRARY_PATH=/data/local/tmp/")
|
||||||
|
.arg(&dst_exec)
|
||||||
|
.output()
|
||||||
|
.expect("failed to run: adb shell");
|
||||||
|
assert!(status.success());
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"status: {}\nstdout ---\n{}\nstderr ---\n{}",
|
||||||
|
output.status,
|
||||||
|
String::from_utf8_lossy(&output.stdout),
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
|
|
||||||
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||||
|
stdout
|
||||||
|
.lines()
|
||||||
|
.find(|l| {
|
||||||
|
(l.starts_with("PASSED ") && l.contains(" tests")) || l.starts_with("test result: ok")
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
panic!("failed to find successful test run");
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user