Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add Android docker images #107

Merged
merged 2 commits into from
Mar 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
SSE4 marked this conversation as resolved.
Show resolved Hide resolved
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
49 changes: 49 additions & 0 deletions android-clang_8/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
FROM conanio/gcc8
SSE4 marked this conversation as resolved.
Show resolved Hide resolved

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

ARG ANDROID_NDK=/android-ndk-r19c
ARG STANDALONE_TOOLCHAIN=/android-ndk-r19c/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-r19c-linux-x86_64.zip -O \
&& sudo unzip -qq android-ndk-r19c-linux-x86_64.zip -d / \
&& sudo rm -f android-ndk-r19c-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
17 changes: 17 additions & 0 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,5 +130,22 @@ jobs:
CLANG_VERSIONS: "7"
DOCKER_ARCHS: "x86"

Android Clang 8 x86:
DOCKER_CROSS: "android"
CLANG_VERSIONS: "8"
DOCKER_ARCHS: "x86"
Android Clang 8 x86_64:
DOCKER_CROSS: "android"
CLANG_VERSIONS: "8"
DOCKER_ARCHS: "x86_64"
Android Clang 8 armv7:
DOCKER_CROSS: "android"
CLANG_VERSIONS: "8"
DOCKER_ARCHS: "armv7"
Android Clang 8 armv8:
DOCKER_CROSS: "android"
CLANG_VERSIONS: "8"
DOCKER_ARCHS: "armv8"

Conan Server:
BUILD_CONAN_SERVER_IMAGE: 1
21 changes: 14 additions & 7 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,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 @@ -66,10 +68,12 @@ def _get_variables(self):
"docker_username, docker_login_username, "
"gcc_versions, docker_distro, "
"clang_versions, build_server, "
"docker_build_tag, docker_archs, docker_upload_only_when_stable")
"docker_build_tag, docker_archs, docker_upload_only_when_stable, "
"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_upload_only_when_stable)
docker_build_tag, docker_archs, docker_upload_only_when_stable,
docker_cross, docker_cache)

def _get_boolean_var(self, var, default="false"):
""" Parse environment variable as boolean type
Expand Down Expand Up @@ -126,8 +130,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 @@ -154,6 +158,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 @@ -218,7 +224,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 @@ -271,12 +277,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 @@ -309,3 +309,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