diff --git a/README.md b/README.md
index 13a8d741..3d9d3126 100644
--- a/README.md
+++ b/README.md
@@ -15,28 +15,28 @@ protocols and more.
## Supported platforms
-Libzmq is mainly written in C++98 with some optional C++11-fragments. For
-configuration either autotools or CMake is employed. See below for some lists
+Libzmq is mainly written in C++98 with some optional C++11-fragments. For
+configuration either autotools or CMake is employed. See below for some lists
of platforms, where libzmq has been successfully compiled on.
### Supported platforms with primary CI
-OS and version | Architecture | Compiler and version | Build system | Remarks
--------------- | ------------ | -------------------- | ------------ | -------
-Android NDK 11c | ARM | gcc ? | autotools |
-Ubuntu 14.04.5 LTS (trusty) | amd64 | clang 5.0.0 | autotools | STABLE, extras: GSSAPI, PGM, NORM, C++98 mode only
-Ubuntu 14.04.5 LTS (trusty) | amd64 | gcc 4.8.4 | autotools | STABLE, DRAFT, extras: GSSAPI, PGM, NORM, TIPC, IPV6, also POLLER=poll, POLLER=select, also valgrind and address sanitizer executions
-Ubuntu 14.04.5 LTS (trusty) | amd64 | gcc 4.8.4 | CMake 3.12.2 | STABLE
-Windows Server 2012 R2 | x86 | Visual Studio 2008 | CMake 3.12.2 | DRAFT
-Windows Server 2012 R2 | x86 | Visual Studio 2010 SP1 | CMake 3.12.2 | DRAFT
-Windows Server 2012 R2 | x86 | Visual Studio 2012 Update 5 | CMake 3.12.2 | DRAFT
-Windows Server 2012 R2 | x86, amd64 | Visual Studio 2013 Update 5 | CMake 3.12.2 | DRAFT, STABLE (x86 Release only), also POLLER=epoll
-Windows Server 2012 R2 | x86 | Visual Studio 2015 Update 3 | CMake 3.12.2 | DRAFT
-Windows Server 2016 | x86 | Visual Studio 2017 15.9.6 | CMake 3.13.3 | DRAFT
-cygwin 3.0.0 on Windows Server 2012 R2 | amd64 | gcc 7.4.0 | CMake 3.6.2 | DRAFT
-MSYS2 ? on Windows Server 2012 R2 | amd64 | gcc 6.4.0 | CMake ? | DRAFT
-Mac OS X 10.13 | amd64 | Xcode 9.4.1, Apple LLVM 9.1.0 | autotools | STABLE, DRAFT
-Mac OS X 10.13 | amd64 | Xcode 9.4.1, Apple LLVM 9.1.0 | CMake 3.11.4 | DRAFT
+| OS and version | Architecture | Compiler and version | Build system | Remarks |
+|----------------------------------------|-------------------------|-------------------------------|--------------|---------------------------------------------------------------------------------------------------------------------------------------|
+| Android NDK r20 | arm, arm64, x86, x86_64 | llvm (see NDK) | autotools | DRAFT |
+| Ubuntu 14.04.5 LTS (trusty) | amd64 | clang 5.0.0 | autotools | STABLE, extras: GSSAPI, PGM, NORM, C++98 mode only |
+| Ubuntu 14.04.5 LTS (trusty) | amd64 | gcc 4.8.4 | autotools | STABLE, DRAFT, extras: GSSAPI, PGM, NORM, TIPC, IPV6, also POLLER=poll, POLLER=select, also valgrind and address sanitizer executions |
+| Ubuntu 14.04.5 LTS (trusty) | amd64 | gcc 4.8.4 | CMake 3.12.2 | STABLE |
+| Windows Server 2012 R2 | x86 | Visual Studio 2008 | CMake 3.12.2 | DRAFT |
+| Windows Server 2012 R2 | x86 | Visual Studio 2010 SP1 | CMake 3.12.2 | DRAFT |
+| Windows Server 2012 R2 | x86 | Visual Studio 2012 Update 5 | CMake 3.12.2 | DRAFT |
+| Windows Server 2012 R2 | x86, amd64 | Visual Studio 2013 Update 5 | CMake 3.12.2 | DRAFT, STABLE (x86 Release only), also POLLER=epoll |
+| Windows Server 2012 R2 | x86 | Visual Studio 2015 Update 3 | CMake 3.12.2 | DRAFT |
+| Windows Server 2016 | x86 | Visual Studio 2017 15.9.6 | CMake 3.13.3 | DRAFT |
+| cygwin 3.0.0 on Windows Server 2012 R2 | amd64 | gcc 7.4.0 | CMake 3.6.2 | DRAFT |
+| MSYS2 ? on Windows Server 2012 R2 | amd64 | gcc 6.4.0 | CMake ? | DRAFT |
+| Mac OS X 10.13 | amd64 | Xcode 9.4.1, Apple LLVM 9.1.0 | autotools | STABLE, DRAFT |
+| Mac OS X 10.13 | amd64 | Xcode 9.4.1, Apple LLVM 9.1.0 | CMake 3.11.4 | DRAFT |
Note: the platforms are regularly updated by the service providers, so this information might get out of date
without any changes on the side of libzmq. For Appveyor, refer to https://www.appveyor.com/updates/ regarding
@@ -44,69 +44,69 @@ platform updates. For travis-ci, refer to https://changelog.travis-ci.com/ regar
### Supported platforms with secondary CI
-OS and version | Architecture | Compiler and version | Build system | Remarks
--------------- | ------------ | -------------------- | ------------ | -------
-CentOS 6 | x86, amd64 | ? | autotools |
-CentOS 7 | amd64 | ? | autotools |
-Debian 8.0 | x86, amd64 | ? | autotools |
-Debian 9.0 | ARM64, x86, amd64 | ? | autotools |
-Fedora 28 | ARM64, ARM32, amd64 | ? | autotools |
-Fedora 29 | ARM64, ARM32, amd64 | ? | autotools |
-Fedora Rawhide | ARM64, ARM32, amd64 | ? | autotools |
-RedHat Enterprise Linux 7 | amd64, ppc64 | ? | autotools |
-SuSE Linux Enterprise 12 SP4 | ARM64, amd64, ppc64, s390x | ? | autotools |
-SuSE Linux Enterprise 15 | amd64 | ? | autotools |
-xUbuntu 12.04 | x86, amd64 | ? | autotools |
-xUbuntu 14.04 | x86, amd64 | ? | autotools |
-xUbuntu 16.04 | x86, amd64 | ? | autotools |
-xUbuntu 18.04 | x86, amd64 | ? | autotools |
-xUbuntu 18.10 | x86, amd64 | ? | autotools |
+| OS and version | Architecture | Compiler and version | Build system | Remarks |
+|------------------------------|----------------------------|----------------------|--------------|---------|
+| CentOS 6 | x86, amd64 | ? | autotools | |
+| CentOS 7 | amd64 | ? | autotools | |
+| Debian 8.0 | x86, amd64 | ? | autotools | |
+| Debian 9.0 | ARM64, x86, amd64 | ? | autotools | |
+| Fedora 28 | ARM64, ARM32, amd64 | ? | autotools | |
+| Fedora 29 | ARM64, ARM32, amd64 | ? | autotools | |
+| Fedora Rawhide | ARM64, ARM32, amd64 | ? | autotools | |
+| RedHat Enterprise Linux 7 | amd64, ppc64 | ? | autotools | |
+| SuSE Linux Enterprise 12 SP4 | ARM64, amd64, ppc64, s390x | ? | autotools | |
+| SuSE Linux Enterprise 15 | amd64 | ? | autotools | |
+| xUbuntu 12.04 | x86, amd64 | ? | autotools | |
+| xUbuntu 14.04 | x86, amd64 | ? | autotools | |
+| xUbuntu 16.04 | x86, amd64 | ? | autotools | |
+| xUbuntu 18.04 | x86, amd64 | ? | autotools | |
+| xUbuntu 18.10 | x86, amd64 | ? | autotools | |
### Supported platforms with known active users
-At the time of writing, no explicit reports have been available. Please report your experiences by opening a PR
+At the time of writing, no explicit reports have been available. Please report your experiences by opening a PR
adding an entry or moving an entry from the section below.
-Under "last report", please name either the SHA1 in case of an unreleased version, or the version number in
+Under "last report", please name either the SHA1 in case of an unreleased version, or the version number in
case of a released version.
-OS and version | Architecture | Compiler and version | Build system | Last report | Remarks
--------------- | ------------ | -------------------- | ------------ | ----------- | -------
-Solaris 10 | x86, amd64, sparc | GCC 8.1.0 | CMake | 2019/03/18 |
-DragonFly BSD | amd64 | gcc 8.3 | autotools | 2018/08/07 git-72854e63 |
-IBM i | ppc64 | gcc 6.3 | autotools | 2019/10/02 git-25320a3 |
+| OS and version | Architecture | Compiler and version | Build system | Last report | Remarks |
+|----------------|-------------------|----------------------|--------------|-------------------------|---------|
+| Solaris 10 | x86, amd64, sparc | GCC 8.1.0 | CMake | 2019/03/18 | |
+| DragonFly BSD | amd64 | gcc 8.3 | autotools | 2018/08/07 git-72854e63 | |
+| IBM i | ppc64 | gcc 6.3 | autotools | 2019/10/02 git-25320a3 | |
### Supported platforms without known active users
Note: this list is incomplete and inaccurate and still needs some work.
-OS and version | Architecture | Compiler and version | Build system | Remarks
--------------- | ------------ | -------------------- | ------------ | -------
-Any Linux distribution | x86, amd64 | gcc ?+, clang ?+, icc ?+ | autotools, CMake |
-SunOS, Solaris | x86, amd64 | SunPro | autotools, CMake |
-GNU/kFreeBSD | ? | ? | autotools, CMake |
-FreeBSD | ? | ? | autotools, CMake |
-NetBSD | ? | ? | autotools, CMake |
-OpenBSD | ? | ? | autotools, CMake |
-DragonFly BSD | amd64 | gcc 8.3 | autotools, CMake |
-HP-UX | ? | ? | autotools, CMake |
-GNU/Hurd | ? | ? | autotools |
-VxWorks 6.8 | ? | ? | ? |
-Windows CE | ? | ? | ? |
-Windows UWP | ? | ? | ? |
-OpenVMS | ? | ? | ? |
+| OS and version | Architecture | Compiler and version | Build system | Remarks |
+|------------------------|--------------|--------------------------|------------------|---------|
+| Any Linux distribution | x86, amd64 | gcc ?+, clang ?+, icc ?+ | autotools, CMake | |
+| SunOS, Solaris | x86, amd64 | SunPro | autotools, CMake | |
+| GNU/kFreeBSD | ? | ? | autotools, CMake | |
+| FreeBSD | ? | ? | autotools, CMake | |
+| NetBSD | ? | ? | autotools, CMake | |
+| OpenBSD | ? | ? | autotools, CMake | |
+| DragonFly BSD | amd64 | gcc 8.3 | autotools, CMake | |
+| HP-UX | ? | ? | autotools, CMake | |
+| GNU/Hurd | ? | ? | autotools | |
+| VxWorks 6.8 | ? | ? | ? | |
+| Windows CE | ? | ? | ? | |
+| Windows UWP | ? | ? | ? | |
+| OpenVMS | ? | ? | ? | |
### Unsupported platforms
-OS and version | Architecture | Compiler and version | Remarks
--------------- | ------------ | -------------------- | -------
-QNX 6.3 | ? | gcc 3.3.5 | see #3371, support was added by a user, but not contributed to upstream
-Windows 10 | ARM, ARM64 | Visual Studio 2017 | see #3366, probably only minor issues
+| OS and version | Architecture | Compiler and version | Remarks |
+|----------------|--------------|----------------------|-------------------------------------------------------------------------|
+| QNX 6.3 | ? | gcc 3.3.5 | see #3371, support was added by a user, but not contributed to upstream |
+| Windows 10 | ARM, ARM64 | Visual Studio 2017 | see #3366, probably only minor issues |
For more details, see [here](SupportedPlatforms.md).
-For some platforms (Linux, Mac OS X), [prebuilt binary packages are supplied by the ZeroMQ organization](#installation).
+For some platforms (Linux, Mac OS X), [prebuilt binary packages are supplied by the ZeroMQ organization](#installation).
For other platforms, you need to [build your own binaries](#build).
## Installation of binary packages
@@ -157,6 +157,11 @@ For OSX users, packages are available via brew.
To build from sources, see the INSTALL file included with the distribution.
+### Android
+
+To build from source, see [REAMDE](./builds/android/README.md) file in the
+android build directory.
+
## Resources
Extensive documentation is provided with the distribution. Refer to
diff --git a/builds/android/README.md b/builds/android/README.md
index 37c152a4..112a2d5c 100644
--- a/builds/android/README.md
+++ b/builds/android/README.md
@@ -1,83 +1,29 @@
-LIBZMQ ANDROID COMPILATION STEPS
-================================
-To launch the docker build:
+# Android Build
- $ docker build .
+## Prerequisites
-To launch the android build, you have to first install the android-ndk first in your HOME directory:
+You need the Android Native Development Kit (NDK) installed. See
+[here](https://developer.android.com/ndk) to download it.
- $ cd ~
- $ export ANDROID_NDK_VERSION="r10e"
- $ wget -q https://dl.google.com/android/ndk/android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.bin -O android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.bin
- $ #check the hashes before executing this binary
- $ md5sum android-ndk-r10e-linux-x86_64.bin
- # 19af543b068bdb7f27787c2bc69aba7f android-ndk-r10e-linux-x86_64.bin
- $ sha256sum android-ndk-r10e-linux-x86_64.bin
- # 102d6723f67ff1384330d12c45854315d6452d6510286f4e5891e00a5a8f1d5a android-ndk-r10e-linux-x86_64.bin
- $ chmod +x android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.bin
- $ ./android-ndk-r10e-linux-x86_64.bin
- $ export ANDROID_NDK_ROOT=${HOME}/android-ndk-r10e
- $ export TOOLCHAIN_NAME=arm-linux-androideabi-4.9
- $ export TOOLCHAIN_HOST=arm-linux-androideabi
- $ export TOOLCHAIN_PATH=${ANDROID_NDK_ROOT}/toolchains/${TOOLCHAIN_NAME}/prebuilt/linux-x86_64/bin
- $ export TOOLCHAIN_ARCH=arm
+This project is tested against Android NDK version r20.
-Then you can launch the build:
+If you installed version r20 all you have to do is to expose the NDK root
+directory as environment variable, e.g:
- $ cd ~/libzmq/builds/android
- $ ./build.sh
- Cloning into 'libsodium'...
- remote: Counting objects: 15246, done.
- remote: Compressing objects: 100% (182/182), done.
- Receiving objects: 16% (2440/15246)
- [...]
+ export ANDROID_NDK_ROOT=$HOME/android-ndk-r20
-A successful build should finish with the following message and give you back your shell prompt:
+If you installed another version you have to expose the NDK root directory as
+well as the NDK version, e.g:
- [...]
- make[2]: Leaving directory '/tmp/android_build/arm-linux-androideabi-4.9/libzmq'
- make[1]: Leaving directory '/tmp/android_build/arm-linux-androideabi-4.9/libzmq'
- libzmq android build succeeded
- $
+ export ANDROID_NDK_ROOT=$HOME/android-ndk-r17c
+ export NDK_VERSION=android-ndk-r17c
-You will then be able to see libzmq.so compiled in the prefix/ directory:
+To specify the minimum sdk version set the environment variable below:
- $ cd ~/libzmq/builds/android/prefix/arm-linux-androideabi-4.9/lib
- $ ls
- libsodium.a libsodium.la libsodium.so libzmq.a libzmq.la libzmq.so pkgconfig
+ export MIN_SDK_VERSION=21 # Default value if unset
-You can then triple check that they are ARM libs:
+## Build
- $ cd ~/libzmq/builds/android/prefix/arm-linux-androideabi-4.9/lib
- $ file libzmq.so
- libzmq.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, not stripped
+In the android directory, run:
-
-COMPILE WITH DOCKERFILE
-=======================
-
-To launch the docker build with a tagged image as a result:
-
- $ cd ~/libzmq/builds/android
- $ docker build -t libzmq-android:`date +"%y%m%d-%H%M%S"` .
- $ docker build -t libzmq-android:latest .
-
-If it is successful, it will end by "libzmq android build succeeded" followed by the ContainerID "e53db616aff4":
-
- [...]
- make[2]: Leaving directory `/tmp/android_build/arm-linux-androideabi-4.9/libzmq'
- make[1]: Leaving directory `/tmp/android_build/arm-linux-androideabi-4.9/libzmq'
- libzmq android build succeeded
- ---> e53db616aff4
- Removing intermediate container 8a5f3e34f3da
- Successfully built e53db616aff4
- $
-
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
- libzmq-android 151218-101411 e53db616aff4 18 hours ago 5.495 GB
-
-If you want to collect the artifacts on the build, you can specify a directory in your HOME directory, such as "$HOME/libzmq-android-bins" for example:
-
- $ mkdir -pv $HOME/libzmq-android-bins
- $ docker run -v $HOME/libzmq-android-bins:/data libzmq-android:latest "cp -v /home/zmq/libzmq/builds/android/prefix/arm-linux-androideabi-4.9/lib/* /data"
+ ./build.sh [ arm | arm64 | x86 | x86_64 ]
diff --git a/builds/android/android_build_helper.sh b/builds/android/android_build_helper.sh
index be8e9e89..5738922a 100644
--- a/builds/android/android_build_helper.sh
+++ b/builds/android/android_build_helper.sh
@@ -69,72 +69,80 @@ function android_build_check_fail {
fi
}
+function android_build_arch {
+ export TOOLCHAIN_PATH="${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin"
+ export TOOLCHAIN_HOST=$1
+ export TOOLCHAIN_COMP=$2
+ export TOOLCHAIN_CXXSTL=$3
+ export TOOLCHAIN_ARCH=$4
+}
+
function android_build_env {
##
# Check that necessary environment variables are set
-
+
if [ -z "$ANDROID_NDK_ROOT" ]; then
ANDROID_BUILD_FAIL+=("Please set the ANDROID_NDK_ROOT environment variable")
ANDROID_BUILD_FAIL+=(" (eg. \"/home/user/android/android-ndk-r20\")")
fi
-
+
if [ -z "$TOOLCHAIN_PATH" ]; then
ANDROID_BUILD_FAIL+=("Please set the TOOLCHAIN_PATH environment variable")
ANDROID_BUILD_FAIL+=(" (eg. \"/home/user/android/android-ndk-r20/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin\")")
fi
-
+
if [ -z "$TOOLCHAIN_HOST" ]; then
ANDROID_BUILD_FAIL+=("Please set the TOOLCHAIN_HOST environment variable")
ANDROID_BUILD_FAIL+=(" (eg. \"arm-linux-androideabi\")")
fi
-
+
if [ -z "$TOOLCHAIN_COMP" ]; then
ANDROID_BUILD_FAIL+=("Please set the TOOLCHAIN_COMP environment variable")
ANDROID_BUILD_FAIL+=(" (eg. \"armv7a-linux-androideabi\")")
fi
-
+
if [ -z "$TOOLCHAIN_CXXSTL" ]; then
ANDROID_BUILD_FAIL+=("Please set the TOOLCHAIN_CXXSTL environment variable")
ANDROID_BUILD_FAIL+=(" (eg. \"armeabi-v7abi\")")
fi
-
+
if [ -z "$TOOLCHAIN_ARCH" ]; then
ANDROID_BUILD_FAIL+=("Please set the TOOLCHAIN_ARCH environment variable")
ANDROID_BUILD_FAIL+=(" (eg. \"arm\")")
fi
-
+
android_build_check_fail
-
+
##
# Check that directories given by environment variables exist
-
+
if [ ! -d "$ANDROID_NDK_ROOT" ]; then
ANDROID_BUILD_FAIL+=("The ANDROID_NDK_ROOT directory does not exist")
ANDROID_BUILD_FAIL+=(" ${ANDROID_NDK_ROOT}")
fi
-
+
if [ ! -d "$TOOLCHAIN_PATH" ]; then
ANDROID_BUILD_FAIL+=("The TOOLCHAIN_PATH directory does not exist")
ANDROID_BUILD_FAIL+=(" ${TOOLCHAIN_PATH}")
fi
-
+
##
# Set up some local variables and check them
-
+
ANDROID_BUILD_SYSROOT="${ANDROID_NDK_ROOT}/platforms/android-${MIN_SDK_VERSION}/arch-${TOOLCHAIN_ARCH}"
-
+
if [ ! -d "$ANDROID_BUILD_SYSROOT" ]; then
ANDROID_BUILD_FAIL+=("The ANDROID_BUILD_SYSROOT directory does not exist")
ANDROID_BUILD_FAIL+=(" ${ANDROID_BUILD_SYSROOT}")
fi
-
- ANDROID_BUILD_PREFIX="${ANDROID_BUILD_DIR}/prefix/${TOOLCHAIN_NAME}"
-
+
+ ANDROID_BUILD_PREFIX="${ANDROID_BUILD_DIR}/prefix/${TOOLCHAIN_ARCH}"
+
mkdir -p "$ANDROID_BUILD_PREFIX" || {
ANDROID_BUILD_FAIL+=("Failed to make ANDROID_BUILD_PREFIX directory")
ANDROID_BUILD_FAIL+=(" ${ANDROID_BUILD_PREFIX}")
}
-
+
android_build_check_fail
}
@@ -147,37 +155,37 @@ function _android_build_opts_process_binaries {
local AR="${TOOLCHAIN_PATH}/${TOOLCHAIN_HOST}-ar"
local RANLIB="${TOOLCHAIN_PATH}/${TOOLCHAIN_HOST}-ranlib"
local STRIP="${TOOLCHAIN_PATH}/${TOOLCHAIN_HOST}-strip"
-
+
if [ ! -x "${CC}" ]; then
ANDROID_BUILD_FAIL+=("The CC binary does not exist or is not executable")
ANDROID_BUILD_FAIL+=(" ${CC}")
fi
-
+
if [ ! -x "${CXX}" ]; then
ANDROID_BUILD_FAIL+=("The CXX binary does not exist or is not executable")
ANDROID_BUILD_FAIL+=(" ${CXX}")
fi
-
+
if [ ! -x "${LD}" ]; then
ANDROID_BUILD_FAIL+=("The LD binary does not exist or is not executable")
ANDROID_BUILD_FAIL+=(" ${LD}")
fi
-
+
if [ ! -x "${AS}" ]; then
ANDROID_BUILD_FAIL+=("The AS binary does not exist or is not executable")
ANDROID_BUILD_FAIL+=(" ${AS}")
fi
-
+
if [ ! -x "${AR}" ]; then
ANDROID_BUILD_FAIL+=("The AR binary does not exist or is not executable")
ANDROID_BUILD_FAIL+=(" ${AR}")
fi
-
+
if [ ! -x "${RANLIB}" ]; then
ANDROID_BUILD_FAIL+=("The RANLIB binary does not exist or is not executable")
ANDROID_BUILD_FAIL+=(" ${RANLIB}")
fi
-
+
if [ ! -x "${STRIP}" ]; then
ANDROID_BUILD_FAIL+=("The STRIP binary does not exist or is not executable")
ANDROID_BUILD_FAIL+=(" ${STRIP}")
@@ -191,17 +199,17 @@ function _android_build_opts_process_binaries {
ANDROID_BUILD_OPTS+=("AR=${AR}")
ANDROID_BUILD_OPTS+=("RANLIB=${RANLIB}")
ANDROID_BUILD_OPTS+=("STRIP=${STRIP}")
-
+
android_build_check_fail
}
# Set the ANDROID_BUILD_OPTS variable to a bash array of configure options
function android_build_opts {
ANDROID_BUILD_OPTS=()
-
+
_android_build_opts_process_binaries
- local LIBS="-lc -lgcc -ldl -lc++_shared"
+ local LIBS="-lc -lgcc -ldl -lm -llog -lc++_shared"
local LDFLAGS="-L${ANDROID_BUILD_PREFIX}/lib"
LDFLAGS+=" -L${ANDROID_NDK_ROOT}/sources/cxx-stl/llvm-libc++/libs/${TOOLCHAIN_CXXSTL}"
CFLAGS+=" -D_GNU_SOURCE -D_REENTRANT -D_THREAD_SAFE"
@@ -212,7 +220,7 @@ function android_build_opts {
ANDROID_BUILD_OPTS+=("CXXFLAGS=${CXXFLAGS} ${ANDROID_BUILD_EXTRA_CXXFLAGS}")
ANDROID_BUILD_OPTS+=("LDFLAGS=${LDFLAGS} ${ANDROID_BUILD_EXTRA_LDFLAGS}")
ANDROID_BUILD_OPTS+=("LIBS=${LIBS} ${ANDROID_BUILD_EXTRA_LIBS}")
-
+
ANDROID_BUILD_OPTS+=("PKG_CONFIG_LIBDIR=${ANDROID_NDK_ROOT}/prebuilt/${HOST_PLATFORM}/lib/pkgconfig")
ANDROID_BUILD_OPTS+=("PKG_CONFIG_PATH=${ANDROID_BUILD_PREFIX}/lib/pkgconfig")
ANDROID_BUILD_OPTS+=("PKG_CONFIG_SYSROOT_DIR=${ANDROID_BUILD_SYSROOT}")
@@ -220,7 +228,7 @@ function android_build_opts {
ANDROID_BUILD_OPTS+=("--with-sysroot=${ANDROID_BUILD_SYSROOT}")
ANDROID_BUILD_OPTS+=("--host=${TOOLCHAIN_HOST}")
ANDROID_BUILD_OPTS+=("--prefix=${ANDROID_BUILD_PREFIX}")
-
+
android_build_check_fail
}
@@ -231,14 +239,14 @@ function android_build_opts {
function android_build_verify_so {
local soname="$1"
shift # Get rid of first argument - the rest represent dependencies
-
+
local sofile="${ANDROID_BUILD_PREFIX}/lib/${soname}"
if [ ! -f "${sofile}" ]; then
ANDROID_BUILD_FAIL+=("Found no library named ${soname}")
ANDROID_BUILD_FAIL+=(" ${sofile}")
fi
android_build_check_fail
-
+
if command -v readelf >/dev/null 2>&1 ; then
local readelf_bin="readelf"
elif command -v greadelf >/dev/null 2>&1 ; then
@@ -249,7 +257,7 @@ function android_build_verify_so {
android_build_check_fail
local elfoutput=$(LC_ALL=C $readelf_bin -d ${sofile})
-
+
local soname_regexp='soname: \[([[:alnum:]\.]+)\]'
if [[ $elfoutput =~ $soname_regexp ]]; then
local parsed_soname="${BASH_REMATCH[1]}"
@@ -261,13 +269,13 @@ function android_build_verify_so {
ANDROID_BUILD_FAIL+=("Failed to meaningfully parse readelf output for library ${soname}:")
ANDROID_BUILD_FAIL+=(" ${elfoutput}")
fi
-
+
for dep_soname do
if [[ $elfoutput != *"library: [${dep_soname}]"* ]]; then
ANDROID_BUILD_FAIL+=("Library ${soname} was expected to be linked to library with soname:")
ANDROID_BUILD_FAIL+=(" ${dep_soname}")
fi
done
-
+
android_build_check_fail
}
diff --git a/builds/android/build.sh b/builds/android/build.sh
index 2e3515ba..b9d61878 100755
--- a/builds/android/build.sh
+++ b/builds/android/build.sh
@@ -1,5 +1,9 @@
#!/usr/bin/env bash
+function usage {
+ echo "Usage ./build.sh [ arm | arm64 | x86 | x86_64 ]"
+}
+
# Use directory of current script as the build directory and working directory
cd "$( dirname "${BASH_SOURCE[0]}" )"
ANDROID_BUILD_DIR="$(pwd)"
@@ -10,12 +14,73 @@ source ${ANDROID_BUILD_DIR}/android_build_helper.sh
# Choose a C++ standard library implementation from the ndk
ANDROID_BUILD_CXXSTL="gnustl_shared_49"
+BUILD_ARCH=$1
+
+if [ -z $BUILD_ARCH ]; then
+ usage
+ exit 1
+fi
+
+case $(uname | tr '[:upper:]' '[:lower:]') in
+ linux*)
+ export HOST_PLATFORM=linux-x86_64
+ ;;
+ darwin*)
+ export HOST_PLATFORM=darwin-x86_64
+ ;;
+ *)
+ echo "Unsupported platform"
+ exit 1
+ ;;
+esac
+
+# Set default values used in ci builds
+
+export NDK_VERSION=${NDK_VERSION:-android-ndk-r20}
+# With NDK r20, the minimum SDK version range is [16, 29].
+# SDK version 21 is the minimum version for 64-bit builds.
+export MIN_SDK_VERSION=${MIN_SDK_VERSION:-21}
+
+# Set variables for each architecture
+HOST_ARM="arm-linux-androideabi"
+HOST_ARM64="aarch64-linux-android"
+HOST_X86="i686-linux-android"
+HOST_X86_64="x86_64-linux-android"
+
+COMP_ARM="armv7a-linux-androideabi${MIN_SDK_VERSION}"
+COMP_ARM64="aarch64-linux-android${MIN_SDK_VERSION}"
+COMP_X86="i686-linux-android${MIN_SDK_VERSION}"
+COMP_X86_64="x86_64-linux-android${MIN_SDK_VERSION}"
+
+CXXSTL_ARM="armeabi-v7a"
+CXXSTL_ARM64="arm64-v8a"
+CXXSTL_X86="x86"
+CXXSTL_X86_64="x86_64"
+
+ARCH_ARM="arm"
+ARCH_ARM64="arm64"
+ARCH_X86="x86"
+ARCH_X86_64="x86_64"
+
+if [ $BUILD_ARCH == "arm" ]; then
+ android_build_arch $HOST_ARM $COMP_ARM $CXXSTL_ARM $ARCH_ARM
+elif [ $BUILD_ARCH == "x86" ]; then
+ android_build_arch $HOST_X86 $COMP_X86 $CXXSTL_X86 $ARCH_X86
+elif [ $BUILD_ARCH == "arm64" ]; then
+ android_build_arch $HOST_ARM64 $COMP_ARM64 $CXXSTL_ARM64 $ARCH_ARM64
+elif [ $BUILD_ARCH == "x86_64" ]; then
+ android_build_arch $HOST_X86_64 $COMP_X86_64 $CXXSTL_X86_64 $ARCH_X86_64
+else
+ usage
+ exit 1
+fi
+
# Set up android build environment and set ANDROID_BUILD_OPTS array
android_build_env
android_build_opts
# Use a temporary build directory
-cache="/tmp/android_build/${TOOLCHAIN_NAME}"
+cache="/tmp/android_build/${TOOLCHAIN_ARCH}"
rm -rf "${cache}"
mkdir -p "${cache}"
@@ -56,7 +121,7 @@ LIBTOOL_EXTRA_LDFLAGS='-avoid-version'
(android_build_verify_so ${VERIFY} &> /dev/null) || {
rm -rf "${cache}/libzmq"
(cp -r ../.. "${cache}/libzmq" && cd "${cache}/libzmq" && make clean)
-
+
(cd "${cache}/libzmq" && ./autogen.sh \
&& ./configure --quiet "${ANDROID_BUILD_OPTS[@]}" ${CURVE} --without-docs \
&& make -j 4 \
diff --git a/builds/android/ci_build.sh b/builds/android/ci_build.sh
index 60443b03..baa89b97 100755
--- a/builds/android/ci_build.sh
+++ b/builds/android/ci_build.sh
@@ -1,69 +1,31 @@
#!/usr/bin/env bash
-NDK_VERSION=android-ndk-r20
-NDK_ABI_VERSION=4.9
+export NDK_VERSION=android-ndk-r20
+export ANDROID_NDK_ROOT="/tmp/${NDK_VERSION}"
-if [ $TRAVIS_OS_NAME == "linux" ]
-then
+case $(uname | tr '[:upper:]' '[:lower:]') in
+ linux*)
HOST_PLATFORM=linux-x86_64
-elif [ $TRAVIS_OS_NAME == "osx" ]
-then
+ ;;
+ darwin*)
HOST_PLATFORM=darwin-x86_64
-else
- echo "Unsupported platform $TRAVIS_OS_NAME"
+ ;;
+ *)
+ echo "Unsupported platform"
exit 1
-fi
+ ;;
+esac
-if [ ! -d "/tmp/${NDK_VERSION}" ] ; then
+if [ ! -d "${ANDROID_NDK_ROOT}" ]; then
export FILENAME=$NDK_VERSION-$HOST_PLATFORM.zip
(cd '/tmp' \
- && wget http://dl.google.com/android/repository/$FILENAME -O $FILENAME \
+ && wget http://dl.google.com/android/repository/$FILENAME -O $FILENAME &> /dev/null \
&& unzip -q $FILENAME) || exit 1
unset FILENAME
fi
-function _build_arch {
- export ANDROID_NDK_ROOT="/tmp/${NDK_VERSION}"
- export TOOLCHAIN_PATH="${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin"
- export TOOLCHAIN_HOST=$1
- export TOOLCHAIN_COMP=$2
- export TOOLCHAIN_CXXSTL=$3
- export TOOLCHAIN_ARCH=$4
- export TOOLCHAIN_NAME="${TOOLCHAIN_HOST}-${NDK_ABI_VERSION}"
-
- source ./build.sh
-}
-
-# Define the minimum Android API level for the library to run.
-# With NDK r20, the minimum SDK version range is [16, 29]
-export MIN_SDK_VERSION="21"
-
-HOST_ARM="arm-linux-androideabi"
-HOST_ARM64="aarch64-linux-android"
-HOST_X86="i686-linux-android"
-HOST_X86_64="x86_64-linux-android"
-
-COMP_ARM="armv7a-linux-androideabi${MIN_SDK_VERSION}"
-COMP_ARM64="aarch64-linux-android${MIN_SDK_VERSION}"
-COMP_X86="i686-linux-android${MIN_SDK_VERSION}"
-COMP_X86_64="x86_64-linux-android${MIN_SDK_VERSION}"
-
-CXXSTL_ARM="armeabi-v7a"
-CXXSTL_ARM64="arm64-v8a"
-CXXSTL_X86="x86"
-CXXSTL_X86_64="x86_64"
-
-ARCH_ARM="arm"
-ARCH_ARM64="arm64"
-ARCH_X86="x86"
-ARCH_X86_64="x86_64"
-
-_build_arch $HOST_ARM $COMP_ARM $CXXSTL_ARM $ARCH_ARM
-_build_arch $HOST_X86 $COMP_X86 $CXXSTL_X86 $ARCH_X86
-
-if [[ $MIN_SDK_VERSION -ge 21 ]] ; then
- _build_arch $HOST_ARM64 $COMP_ARM64 $CXXSTL_ARM64 $ARCH_ARM64
- _build_arch $HOST_X86_64 $COMP_X86_64 $CXXSTL_X86_64 $ARCH_X86_64
-fi
-
+./build.sh "arm"
+./build.sh "arm64"
+./build.sh "x86"
+./build.sh "x86_64"