2014-11-02 17:33:23 -08:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
2022-10-02 02:27:12 +02:00
|
|
|
set -e
|
|
|
|
|
2022-10-21 11:55:33 +02:00
|
|
|
# Use directory of current script as the working directory
|
|
|
|
cd "$( dirname "${BASH_SOURCE[0]}" )"
|
2022-10-24 12:29:29 +02:00
|
|
|
LIBZMQ_ROOT="$(cd ../.. && pwd)"
|
2022-10-21 11:55:33 +02:00
|
|
|
|
|
|
|
########################################################################
|
|
|
|
# Configuration & tuning options.
|
|
|
|
########################################################################
|
|
|
|
# Set default values used in ci builds
|
|
|
|
export NDK_VERSION="${NDK_VERSION:-android-ndk-r25}"
|
|
|
|
|
|
|
|
# Set default path to find Android NDK.
|
|
|
|
# Must be of the form <path>/${NDK_VERSION} !!
|
|
|
|
export ANDROID_NDK_ROOT="${ANDROID_NDK_ROOT:-/tmp/${NDK_VERSION}}"
|
|
|
|
|
|
|
|
# With NDK r22b, the minimum SDK version range is [16, 31].
|
|
|
|
# Since NDK r24, the minimum SDK version range is [19, 31].
|
|
|
|
# SDK version 21 is the minimum version for 64-bit builds.
|
|
|
|
export MIN_SDK_VERSION=${MIN_SDK_VERSION:-21}
|
|
|
|
|
|
|
|
# Use directory of current script as the build directory
|
|
|
|
# ${ANDROID_BUILD_DIR}/prefix/<build_arch>/lib will contain produced libraries
|
|
|
|
export ANDROID_BUILD_DIR="${ANDROID_BUILD_DIR:-${PWD}}"
|
|
|
|
|
|
|
|
# Clean before processing
|
|
|
|
export ANDROID_BUILD_CLEAN="${ANDROID_BUILD_CLEAN:-}"
|
|
|
|
|
|
|
|
# Select CURVE implementation:
|
|
|
|
# - "" # Do not use any CURVE implementation.
|
|
|
|
# - "libsodium" # Use LIBSODIUM implementation.
|
|
|
|
# - "tweetnacl" # Use internal TWEETNACL implementation.
|
|
|
|
export CURVE="${CURVE:-}"
|
|
|
|
|
|
|
|
########################################################################
|
|
|
|
# Utilities
|
|
|
|
########################################################################
|
2020-02-12 12:14:32 +01:00
|
|
|
function usage {
|
2022-10-21 11:55:33 +02:00
|
|
|
echo "LIBZMQ - Usage:"
|
|
|
|
echo " export XXX=yyy"
|
|
|
|
echo " ./build.sh [ arm | arm64 | x86 | x86_64 ]"
|
|
|
|
echo ""
|
|
|
|
echo "See this file (configuration & tuning options) for details"
|
|
|
|
echo "on variables XXX and their values xxx"
|
|
|
|
exit 1
|
2020-02-12 12:14:32 +01:00
|
|
|
}
|
|
|
|
|
2022-10-24 12:29:29 +02:00
|
|
|
# Initialize env variable XXX_ROOT, given dependency name "xxx".
|
|
|
|
# If XXX_ROOT is not set:
|
|
|
|
# If a folder xxx exists close to current clone, set XXX_ROOT with it.
|
|
|
|
# Else, set XXX_ROOT with /tmp/tmp-deps/xxx.
|
|
|
|
# Else
|
|
|
|
# Verify that folder XXX_ROOT exists.
|
|
|
|
function init_dependency_root {
|
|
|
|
local lib_name
|
|
|
|
lib_name="$1"
|
|
|
|
local variable_name
|
|
|
|
variable_name="$(echo "${lib_name}" | tr '[:lower:]' '[:upper:]')_ROOT"
|
|
|
|
local variable_value
|
|
|
|
variable_value="$(eval echo "\${${variable_name}}")"
|
|
|
|
|
|
|
|
if [ -z "${variable_value}" ] ; then
|
|
|
|
if [ -d "${LIBZMQ_ROOT}/../${lib_name}" ] ; then
|
|
|
|
eval "export ${variable_name}=\"$(cd "${LIBZMQ_ROOT}/../${lib_name}" && pwd)\""
|
|
|
|
else
|
|
|
|
eval "export ${variable_name}=\"/tmp/tmp-deps/${lib_name}\""
|
|
|
|
fi
|
|
|
|
variable_value="$(eval echo "\${${variable_name}}")"
|
|
|
|
elif [ ! -d "${variable_value}" ] ; then
|
|
|
|
echo "LIBZMQ - Error: Folder '${variable_value}' does not exist."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "LIBZMQ - ${variable_name}=${variable_value}"
|
|
|
|
}
|
|
|
|
|
2022-10-21 11:55:33 +02:00
|
|
|
########################################################################
|
|
|
|
# Sanity checks
|
|
|
|
########################################################################
|
|
|
|
BUILD_ARCH="$1"
|
|
|
|
[ -z "${BUILD_ARCH}" ] && usage
|
2014-11-02 17:33:23 -08:00
|
|
|
|
2022-10-24 12:29:29 +02:00
|
|
|
# Set ROOT path for LIBSODIUM source tree, if CURVE is "libsodium"
|
|
|
|
if [ "${CURVE}x" = "libsodiumx" ] ; then
|
|
|
|
init_dependency_root "libsodium"
|
|
|
|
fi
|
|
|
|
|
2022-10-21 11:55:33 +02:00
|
|
|
########################################################################
|
|
|
|
# Compilation
|
|
|
|
########################################################################
|
2022-05-10 15:21:06 +02:00
|
|
|
# Choose a C++ standard library implementation from the ndk
|
2022-10-11 22:40:13 +02:00
|
|
|
export ANDROID_BUILD_CXXSTL="gnustl_shared_49"
|
|
|
|
|
|
|
|
# Additional flags for LIBTOOL, for LIBZMQ and other dependencies.
|
|
|
|
export LIBTOOL_EXTRA_LDFLAGS='-avoid-version'
|
2022-05-10 15:21:06 +02:00
|
|
|
|
2022-10-24 12:29:29 +02:00
|
|
|
# Get access to android_build functions and variables
|
|
|
|
# Perform some sanity checks and calculate some variables.
|
|
|
|
source ./android_build_helper.sh
|
|
|
|
|
2014-11-02 17:33:23 -08:00
|
|
|
# Set up android build environment and set ANDROID_BUILD_OPTS array
|
2022-10-21 11:55:33 +02:00
|
|
|
android_build_set_env "${BUILD_ARCH}"
|
Problem: Android NDK 22 download broken since support of NDK 23. (#4444)
* Problem: Android NDK 22 download broken since support of NDK 23.
Due to the PR to support NDK 23.
With NDK 23, the archive file name has changed.
This change is handled by the PR to support NDK23, but now, only 23 and after
are supported.
Also, NDK 23 support introduced a 2nd occurence of the variable
HOST_PLATFORM, with another value. One occurence being exported,
this may confuse next developpers (and it actually confused me).
Solution: Code review
1st occurence is simply dropped, and the algorithm around is changed so that
there is no need of a 'host_platform' kind of stuff.
2nd occurrence is renamed to ANDROID_BUILD_PLATFORM.
Note that 'HOST' is replaced by 'BUILD', as this is the common naming
when talking about the build/compilation machine, when cross compiling.
A dedicated function is created in the helpers, to actually download
the NDK. As this function is made 'public', more checks are performed.
Note:
To be reported in CZMQ & ZYRE, via ZPROJECT, where NDK is downloaded
in 2 different files.
2022-10-21 18:36:38 +02:00
|
|
|
android_download_ndk
|
2014-11-02 17:33:23 -08:00
|
|
|
android_build_env
|
|
|
|
android_build_opts
|
|
|
|
|
2015-01-28 17:30:35 -08:00
|
|
|
# Check for environment variable to clear the prefix and do a clean build
|
|
|
|
if [[ $ANDROID_BUILD_CLEAN ]]; then
|
2022-10-21 16:32:19 +02:00
|
|
|
android_build_trace "Doing a clean build (removing previous build and dependencies)..."
|
2022-10-21 11:55:33 +02:00
|
|
|
rm -rf "${ANDROID_BUILD_PREFIX:-android-build-prefix-not-set}"/*
|
|
|
|
|
|
|
|
# Called shells MUST not clean after ourselves !
|
|
|
|
export ANDROID_BUILD_CLEAN=""
|
2015-01-28 17:30:35 -08:00
|
|
|
fi
|
|
|
|
|
2022-10-12 02:42:28 +02:00
|
|
|
VERIFY=("libzmq.so")
|
2022-10-21 11:55:33 +02:00
|
|
|
if [ -z "${CURVE}" ]; then
|
2016-02-11 22:06:33 +00:00
|
|
|
CURVE="--disable-curve"
|
2022-10-21 11:55:33 +02:00
|
|
|
elif [ "${CURVE}" == "libsodium" ]; then
|
2016-02-11 22:06:33 +00:00
|
|
|
CURVE="--with-libsodium=yes"
|
2022-10-12 02:42:28 +02:00
|
|
|
VERIFY+=("libsodium.so")
|
2016-02-11 22:06:33 +00:00
|
|
|
##
|
2022-10-21 11:55:33 +02:00
|
|
|
# Build LIBSODIUM from latest STABLE branch
|
2014-11-04 12:57:39 -08:00
|
|
|
|
2016-02-11 22:06:33 +00:00
|
|
|
(android_build_verify_so "libsodium.so" &> /dev/null) || {
|
2022-10-24 12:29:29 +02:00
|
|
|
if [ ! -d "${LIBSODIUM_ROOT}" ] ; then
|
2022-10-24 17:34:27 +02:00
|
|
|
android_clone_library "LIBSODIUM" "${LIBSODIUM_ROOT}" "https://github.com/jedisct1/libsodium.git" "stable"
|
2022-10-24 12:29:29 +02:00
|
|
|
fi
|
|
|
|
|
2022-10-05 18:17:46 +02:00
|
|
|
(
|
|
|
|
CONFIG_OPTS=()
|
|
|
|
CONFIG_OPTS+=("--quiet")
|
|
|
|
CONFIG_OPTS+=("${ANDROID_BUILD_OPTS[@]}")
|
2022-10-21 11:55:33 +02:00
|
|
|
CONFIG_OPTS+=("--disable-soname-versions")
|
2022-10-05 18:17:46 +02:00
|
|
|
|
2022-10-24 17:34:27 +02:00
|
|
|
android_build_library "LIBSODIUM" "${LIBSODIUM_ROOT}"
|
2022-10-05 18:17:46 +02:00
|
|
|
) || exit 1
|
2016-02-11 22:06:33 +00:00
|
|
|
}
|
|
|
|
elif [ $CURVE == "tweetnacl" ]; then
|
|
|
|
# Default
|
|
|
|
CURVE=""
|
|
|
|
fi
|
2014-11-04 12:57:39 -08:00
|
|
|
|
|
|
|
##
|
|
|
|
# Build libzmq from local source
|
|
|
|
|
2022-10-12 02:42:28 +02:00
|
|
|
(android_build_verify_so "${VERIFY[@]}" &> /dev/null) || {
|
2022-10-24 12:29:29 +02:00
|
|
|
(cd "${LIBZMQ_ROOT}" && ( make clean || : ) && rm -f ./config.status ) || exit 1
|
2020-02-12 12:14:32 +01:00
|
|
|
|
2022-10-05 18:17:46 +02:00
|
|
|
(
|
|
|
|
CONFIG_OPTS=()
|
|
|
|
CONFIG_OPTS+=("--quiet")
|
|
|
|
CONFIG_OPTS+=("${ANDROID_BUILD_OPTS[@]}")
|
|
|
|
CONFIG_OPTS+=("${CURVE}")
|
|
|
|
CONFIG_OPTS+=("--without-docs")
|
2022-10-21 11:55:33 +02:00
|
|
|
|
2022-10-24 17:34:27 +02:00
|
|
|
android_build_library "LIBZMQ" "${LIBZMQ_ROOT}"
|
2022-10-05 18:17:46 +02:00
|
|
|
) || exit 1
|
2014-11-04 12:57:39 -08:00
|
|
|
}
|
|
|
|
|
2022-10-11 22:40:13 +02:00
|
|
|
##
|
|
|
|
# Fetch the STL as well.
|
|
|
|
|
|
|
|
cp "${ANDROID_STL_ROOT}/${ANDROID_STL}" "${ANDROID_BUILD_PREFIX}/lib/."
|
|
|
|
|
2014-11-04 12:57:39 -08:00
|
|
|
##
|
|
|
|
# Verify shared libraries in prefix
|
2014-11-02 17:33:23 -08:00
|
|
|
|
2022-10-12 02:42:28 +02:00
|
|
|
android_build_verify_so "${VERIFY[@]}" "${ANDROID_STL}"
|
2022-10-21 16:32:19 +02:00
|
|
|
android_build_trace "Android build successful"
|