Skip to content

Commit

Permalink
- add Android docker image
Browse files Browse the repository at this point in the history
Signed-off-by: SSE4 <tomskside@gmail.com>
  • Loading branch information
SSE4 committed Mar 12, 2019
1 parent ce7ad69 commit d267d41
Show file tree
Hide file tree
Showing 21 changed files with 256 additions and 7 deletions.
5 changes: 5 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ env:
- GCC_VERSIONS="8" DOCKER_ARCHS="x86_64,armv7"
- GCC_VERSIONS="8" DOCKER_ARCHS="x86_64,armv7hf"

- DOCKER_CROSS="android" CLANG_VERSION="8" DOCKER_ARCH="x86"
- DOCKER_CROSS="android" CLANG_VERSION="8" DOCKER_ARCH="x86_64"
- DOCKER_CROSS="android" CLANG_VERSION="8" DOCKER_ARCH="armv7"
- DOCKER_CROSS="android" CLANG_VERSION="8" DOCKER_ARCH="armv8"

- BUILD_CONAN_SERVER_IMAGE=1

install:
Expand Down
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@ GCC>=5 is ABI compatible for minor versions. To solve multiple minors, there are
| - [conanio/clang7: clang 7](https://hub.docker.com/r/conanio/clang7/) | x86_64 | Supported |


#### Android

| Version | Arch | Status, Life cycle |
|-----------------------------------------------------------------------------------------------|--------|------------|
| - [conanio/android-clang8: Android clang 3.8](https://hub.docker.com/r/conanio/android-clang8/) | x86_64 | Supported |
| - [conanio/android-clang8-x86: Android clang 3.8](https://hub.docker.com/r/conanio/android-clang8-x86/) | x86 | Supported |
| - [conanio/android-clang8-armv7: Android clang 3.8](https://hub.docker.com/r/conanio/android-clang8-armv7/) | x86 | Supported |
| - [conanio/android-clang8-armv8: Android clang 3.8](https://hub.docker.com/r/conanio/android-clang8-armv8/) | x86 | Supported |

#### Conan Server

Conan Docker Tools provides an image version with only Conan Server installed, very useful for the cases it is necessary to run a server without touching the host.
Expand Down Expand Up @@ -232,6 +241,8 @@ Build and Test variables:
- **GCC_VERSIONS**: GCC versions to build, test and deploy, comma separated, e.g. "4.6,4.8,4.9,5.2,5.3,5.4,6.2.6.3"
- **CLANG_VERSIONS**: Clang versions to build, test and deploy, comma separated, e.g. "3.8,3.9,4.0"
- **DOCKER_BUILD_TAG**: Docker image tag, e.g "latest", "0.28.1"
- **DOCKER_CACHE**: Allow to cache docker layers during the build, to speed up local testing
- **DOCKER_CROSS**: Cross-compiling image prefix, currently only "android" is supported

Upload related variables:

Expand Down
7 changes: 7 additions & 0 deletions android-clang_8-armv7/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.git/
.idea/

*.md
*.py
*.yml
**/*.sh
23 changes: 23 additions & 0 deletions android-clang_8-armv7/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
FROM conanio/android-clang8

LABEL maintainer="Luis Martinez de Bartolome <luism@jfrog.com>"

ENV ANDROID_ABI=armeabi-v7a \
ANDROID_PLATFORM=android-16 \
CC=$STANDALONE_TOOLCHAIN/bin/armv7a-linux-androideabi16-clang \
CXX=$STANDALONE_TOOLCHAIN/bin/armv7a-linux-androideabi16-clang++ \
LD=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-ld \
AR=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-ar \
AS=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-as \
RANLIB=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-ranlib \
STRIP=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-strip \
ADDR2LINE=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-addr2line \
NM=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-nm \
OBJCOPY=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-objcopy \
OBJDUMP=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-objdump \
READELF=$STANDALONE_TOOLCHAIN/bin/arm-linux-androideabi-readelf

RUN conan profile update settings.arch=armv7 default \
&& conan profile update settings.os=Android default \
&& conan profile update settings.os.api_level=16 default \
&& conan profile update settings.compiler.libcxx=libc++ default
2 changes: 2 additions & 0 deletions android-clang_8-armv7/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker build --no-cache -t conanio/android-clang8-armv7 .
2 changes: 2 additions & 0 deletions android-clang_8-armv7/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker run --rm -v ~/.conan/data:/home/conan/.conan/data -it conanio/android-clang8-armv7 /bin/bash
7 changes: 7 additions & 0 deletions android-clang_8-armv8/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.git/
.idea/

*.md
*.py
*.yml
**/*.sh
22 changes: 22 additions & 0 deletions android-clang_8-armv8/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM conanio/android-clang8

LABEL maintainer="Luis Martinez de Bartolome <luism@jfrog.com>"

ENV ANDROID_ABI=arm64-v8a \
CC=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android21-clang \
CXX=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android21-clang++ \
LD=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-ld \
AR=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-ar \
AS=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-as \
RANLIB=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-ranlib \
STRIP=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-strip \
ADDR2LINE=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-addr2line \
NM=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-nm \
OBJCOPY=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-objcopy \
OBJDUMP=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-objdump \
READELF=$STANDALONE_TOOLCHAIN/bin/aarch64-linux-android-readelf

RUN conan profile update settings.arch=armv8 default \
&& conan profile update settings.os=Android default \
&& conan profile update settings.os.api_level=21 default \
&& conan profile update settings.compiler.libcxx=libc++ default
2 changes: 2 additions & 0 deletions android-clang_8-armv8/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker build --no-cache -t conanio/android-clang8-armv8 .
2 changes: 2 additions & 0 deletions android-clang_8-armv8/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker run --rm -v ~/.conan/data:/home/conan/.conan/data -it conanio/android-clang8-armv8 /bin/bash
7 changes: 7 additions & 0 deletions android-clang_8-x86/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.git/
.idea/

*.md
*.py
*.yml
**/*.sh
23 changes: 23 additions & 0 deletions android-clang_8-x86/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
FROM conanio/android-clang8

LABEL maintainer="Luis Martinez de Bartolome <luism@jfrog.com>"

ENV ANDROID_ABI=x86 \
ANDROID_PLATFORM=android-16 \
CC=$STANDALONE_TOOLCHAIN/bin/i686-linux-android16-clang \
CXX=$STANDALONE_TOOLCHAIN/bin/i686-linux-android16-clang++ \
LD=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-ld \
AR=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-ar \
AS=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-as \
RANLIB=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-ranlib \
STRIP=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-strip \
ADDR2LINE=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-addr2line \
NM=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-nm \
OBJCOPY=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-objcopy \
OBJDUMP=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-objdump \
READELF=$STANDALONE_TOOLCHAIN/bin/i686-linux-android-readelf

RUN conan profile update settings.arch=x86 default \
&& conan profile update settings.os=Android default \
&& conan profile update settings.os.api_level=16 default \
&& conan profile update settings.compiler.libcxx=libc++ default
2 changes: 2 additions & 0 deletions android-clang_8-x86/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker build --no-cache -t conanio/android-clang8-x86 .
2 changes: 2 additions & 0 deletions android-clang_8-x86/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker run --rm -v ~/.conan/data:/home/conan/.conan/data -it conanio/android-clang8-x86 /bin/bash
7 changes: 7 additions & 0 deletions android-clang_8/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.git/
.idea/

*.md
*.py
*.yml
**/*.sh
50 changes: 50 additions & 0 deletions android-clang_8/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
FROM conanio/gcc8

LABEL maintainer="Luis Martinez de Bartolome <luism@jfrog.com>"

ARG ANDROID_NDK=/android-ndk-r19b
ARG STANDALONE_TOOLCHAIN=/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64

ENV ANDROID_NDK=$ANDROID_NDK \
ANDROID_NDK_HOME=$ANDROID_NDK \
STANDALONE_TOOLCHAIN=$STANDALONE_TOOLCHAIN \
ANDROID_STL=c++_shared \
ANDROID_ABI=x86_64 \
ANDROID_PLATFORM=android-21 \
ANDROID_TOOLCHAIN=clang \
CC=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android21-clang \
CXX=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android21-clang++ \
LD=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-ld \
AR=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-ar \
AS=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-as \
RANLIB=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-ranlib \
STRIP=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-strip \
ADDR2LINE=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-addr2line \
NM=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-nm \
OBJCOPY=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-objcopy \
OBJDUMP=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-objdump \
READELF=$STANDALONE_TOOLCHAIN/bin/x86_64-linux-android-readelf \
SYSROOT=$STANDALONE_TOOLCHAIN/sysroot \
CONAN_CMAKE_FIND_ROOT_PATH=$STANDALONE_TOOLCHAIN/sysroot \
CONAN_CMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
CONAN_CMAKE_PROGRAM=/cmake-wrapper \
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM=BOTH \
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH \
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH \
CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH \
PATH=$PATH:$STANDALONE_TOOLCHAIN/bin

COPY cmake-wrapper /cmake-wrapper

RUN sudo apt-get update \
&& sudo apt-get -qq install -y --no-install-recommends unzip \
&& sudo rm -rf /var/lib/apt/lists/* \
&& sudo curl -s https://dl.google.com/android/repository/android-ndk-r19b-linux-x86_64.zip -O \
&& sudo unzip -qq android-ndk-r19b-linux-x86_64.zip -d / \
&& sudo rm -f android-ndk-r19b-linux-x86_64.zip \
&& sudo chmod +x /cmake-wrapper \
&& conan profile new default --detect \
&& conan profile update settings.os=Android default \
&& conan profile update settings.os.api_level=21 default \
&& conan profile update settings.compiler.libcxx=libc++ default

2 changes: 2 additions & 0 deletions android-clang_8/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker build --no-cache -t conanio/android-clang8 .
37 changes: 37 additions & 0 deletions android-clang_8/cmake-wrapper
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash

ALL_ARGS=$@

BUILD=no
for i in "$@":
do
case $i in
--build)
BUILD=yes
;;
*)
;;
esac
done

# https://gitlab.kitware.com/cmake/cmake/issues/18739 Android: NDK r19 support
# https://github.com/conan-io/conan/issues/2402 Android and CONAN_LIBCXX do not play well together
# https://github.com/conan-io/conan/issues/4537 Pass ANDROID_ABI & ANDROID_NDK variables to cmake
# https://github.com/conan-io/conan/issues/4629 set(CMAKE_FIND_ROOT_PATH_MODE_* ONLY) when cross-compiling, for Android at least

if [ $BUILD == "yes" ]; then
cmake "$@"
else
cmake \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=$CMAKE_FIND_ROOT_PATH_MODE_PROGRAM \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=$CMAKE_FIND_ROOT_PATH_MODE_LIBRARY \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=$CMAKE_FIND_ROOT_PATH_MODE_INCLUDE \
-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=$CMAKE_FIND_ROOT_PATH_MODE_PACKAGE \
-DANDROID_STL=$ANDROID_STL \
-DANDROID_NDK=$ANDROID_NDK \
-DANDROID_ABI=$ANDROID_ABI \
-DANDROID_PLATFORM=$ANDROID_PLATFORM \
-DANDROID_TOOLCHAIN=$ANDROID_TOOLCHAIN \
"$@"
fi

2 changes: 2 additions & 0 deletions android-clang_8/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
sudo docker run --rm -v ~/.conan/data:/home/conan/.conan/data -it conanio/android-clang8 /bin/bash
20 changes: 13 additions & 7 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ def _get_variables(self):
docker_archs = os.getenv("DOCKER_ARCHS").split(",") if os.getenv("DOCKER_ARCHS") else [
"x86_64"
]
docker_cross = os.getenv("DOCKER_CROSS", False)
docker_cache = os.getenv("DOCKER_CACHE", False)
docker_distro = os.getenv("DOCKER_DISTRO", False)
conan_version = os.getenv("CONAN_VERSION", client_version)
os.environ["CONAN_VERSION"] = conan_version
Expand All @@ -63,10 +65,11 @@ def _get_variables(self):
"docker_username, docker_login_username, "
"gcc_versions, docker_distro, "
"clang_versions, build_server, "
"docker_build_tag, docker_archs")
"docker_build_tag, docker_archs, "
"docker_cross, docker_cache")
return Variables(docker_upload, docker_password, docker_username, docker_login_username,
gcc_versions, docker_distro, clang_versions, build_server,
docker_build_tag, docker_archs)
docker_build_tag, docker_archs, docker_cross, docker_cache)

def _get_boolean_var(self, var, default="false"):
""" Parse environment variable as boolean type
Expand Down Expand Up @@ -116,8 +119,8 @@ def build(self):
:param service: service in compose e.g gcc54
"""
logging.info("Starting build for service %s." % self.service)
# --no-cache
subprocess.check_call("docker-compose build --no-cache %s" % self.service, shell=True)
no_cache = "" if self.variables.docker_cache else "--no-cache"
subprocess.check_call("docker-compose build %s %s" % (no_cache, self.service), shell=True)

output = subprocess.check_output("docker image inspect %s --format '{{.Size}}'"
% self.created_image_name, shell=True)
Expand All @@ -144,6 +147,8 @@ def test(self, arch, compiler_name, compiler_version, distro):
logging.info("Testing Docker by service %s." % self.service)
try:
libcxx_list = ["libstdc++"] if compiler_name == "gcc" else ["libstdc++", "libc++"]
if self.variables.docker_cross == "android":
libcxx_list = ["libc++"]
sudo_commands = ["", "sudo"] if distro else ["", "sudo", "sudo -E"]
subprocess.check_call("docker run -t -d --name %s %s" % (self.service,
self.created_image_name), shell=True)
Expand Down Expand Up @@ -208,7 +213,7 @@ def test(self, arch, compiler_name, compiler_version, distro):
compiler_version, libcxx),
shell=True)

if "arm" in arch:
if "arm" in arch or self.variables.docker_cross == "android":
logging.warn("Skipping cmake_installer: cross-building results in Unverified HTTPS error")
else:
subprocess.check_call(
Expand Down Expand Up @@ -261,12 +266,13 @@ def run(self):
"""Execute all 3 stages for all versions in compilers list
"""
distro = "" if not self.variables.docker_distro else "-%s" % self.variables.docker_distro
cross = "" if not self.variables.docker_cross else "%s-" % self.variables.docker_cross
for arch in self.variables.docker_archs:
for compiler in [self.gcc_compiler, self.clang_compiler]:
for version in compiler.versions:
tag_arch = "" if arch == "x86_64" else "-%s" % arch
service = "%s%s%s%s" % (compiler.name, version.replace(".", ""), distro, tag_arch)
build_dir = "%s_%s%s%s" % (compiler.name, version, distro, tag_arch)
service = "%s%s%s%s%s" % (cross, compiler.name, version.replace(".", ""), distro, tag_arch)
build_dir = "%s%s_%s%s%s" % (cross, compiler.name, version, distro, tag_arch)

self.service = service
self.login()
Expand Down
28 changes: 28 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -302,3 +302,31 @@ services:
image: "${DOCKER_USERNAME}/gcc7-centos6-x86:${DOCKER_BUILD_TAG}"
container_name: gcc7-centos6-x86
tty: true
android-clang8:
build:
context: android-clang_8
dockerfile: Dockerfile
image: "${DOCKER_USERNAME}/android-clang8:${DOCKER_BUILD_TAG}"
container_name: android-clang8
tty: true
android-clang8-x86:
build:
context: android-clang_8-x86
dockerfile: Dockerfile
image: "${DOCKER_USERNAME}/android-clang8-x86:${DOCKER_BUILD_TAG}"
container_name: android-clang8-x86
tty: true
android-clang8-armv7:
build:
context: android-clang_8-armv7
dockerfile: Dockerfile
image: "${DOCKER_USERNAME}/android-clang8-armv7:${DOCKER_BUILD_TAG}"
container_name: android-clang8-armv7
tty: true
android-clang8-armv8:
build:
context: android-clang_8-armv8
dockerfile: Dockerfile
image: "${DOCKER_USERNAME}/android-clang8-armv8:${DOCKER_BUILD_TAG}"
container_name: android-clang8-armv8
tty: true

0 comments on commit d267d41

Please sign in to comment.