diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2017-02-20 19:24:21 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2017-02-22 18:06:20 +0100 |
commit | 341e65f7d51e7acc0bf73893317251adc4d23cb6 (patch) | |
tree | cd549c3a57e7dc7737efa7c89298a7ea7777b900 /platform/android/scripts | |
parent | 586ae94ec4cfd3ea5b223ba36fc519ef8ada5eff (diff) | |
download | qtlocation-mapboxgl-341e65f7d51e7acc0bf73893317251adc4d23cb6.tar.gz |
[build] use system-provided Android NDK when available
and fall back to Mason if it isn't
Diffstat (limited to 'platform/android/scripts')
-rwxr-xr-x | platform/android/scripts/ndk.sh | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/platform/android/scripts/ndk.sh b/platform/android/scripts/ndk.sh new file mode 100755 index 0000000000..96a314a3c2 --- /dev/null +++ b/platform/android/scripts/ndk.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail +set -u + +# This script produces an env.sh file, which contains the paths to CMake, and the flags required to +# create a build. It first tries to use the Android NDK, but falls back to installing it via Mason. + +function error { >&2 echo -e "\033[1m\033[31m$@\033[0m"; } +function warning { >&2 echo -e "\033[1m\033[33m$@\033[0m"; } +function status { >&2 echo -e "\033[1m\033[36m$@\033[0m"; } +function info { >&2 echo -e "\033[1m\033[32m$@\033[0m"; } + +if [ "$#" -ne 3 ]; then + error "Usage: $0 <short arch> <long arch> <api level>" +fi + +NDK_ANDROID_VERSION=$1-$3 +ANDROID_NATIVE_API_LEVEL=$3 +ANDROID_ABI=$2 + +function mason_ndk { + local CMAKE=${CMAKE:-cmake} + MASON_XC_ROOT="`${CMAKE} -P cmake/mason.cmake PREFIX android-ndk VERSION ${NDK_ANDROID_VERSION}-r13b`" + + local TOOLCHAIN="${MASON_XC_ROOT}/toolchain.cmake" + if [ ! -f "${TOOLCHAIN}" ]; then + error "Can't find CMake toolchain file at ${TOOLCHAIN}." + exit 1 + fi + + info "Using Mason-provided Android NDK at ${MASON_XC_ROOT}" + echo CMAKE=\"${CMAKE}\" + echo CMAKE_GENERATOR=\"Ninja\" + echo CMAKE_ARGS=\" \ + -DCMAKE_MAKE_PROGRAM=`pwd`/${NINJA} \ + -DMASON_XC_ROOT=${MASON_XC_ROOT} \ + -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} \ + \" +} + +function system_ndk { + if [[ ${USE_MASON_NDK:-} ]]; then + return 1 + fi + + if [ -f platform/android/local.properties ]; then + local SDK_DIR=$(sed -n -e 's/^sdk.dir=\(.*\)$/\1/p' platform/android/local.properties) + fi + + if [ ! -d "${SDK_DIR:-}" ]; then + if [ ! -z "${ANDROID_HOME:-}" ]; then + local SDK_DIR="${ANDROID_HOME}" + else + error "Can't find the Android SDK. Set \$ANDROID_HOME to the SDK path." + exit 1 + fi + fi + + local NDK_DIR="${ANDROID_NDK_HOME:-${SDK_DIR}/ndk-bundle}" + if [ ! -d "${NDK_DIR}" ]; then + warning "Can't find the Android NDK. If it is installed, set \$ANDROID_NDK_HOME to the NDK path." + return 1 + fi + + # Try to install CMake if it's not installed yet. + mkdir -p "${SDK_DIR}/cmake" + local CMAKE_VERSION=/$(ls "${SDK_DIR}/cmake" | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1) + local CMAKE="${SDK_DIR}/cmake${CMAKE_VERSION:-}/bin/cmake" + if [ ! -f "${CMAKE}" ]; then + status "Trying to install CMake..." + mkdir -p "${SDK_DIR}/licenses" + echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "${SDK_DIR}/licenses/android-sdk-license" + "${SDK_DIR}/tools/bin/sdkmanager" --list | grep cmake | tail -n 1 | cut -d \| -f 1 | xargs "${SDK_DIR}/tools/bin/sdkmanager" >&2 + CMAKE_VERSION=/$(ls "${SDK_DIR}/cmake" | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1) + CMAKE="${SDK_DIR}/cmake${CMAKE_VERSION:-}/bin/cmake" + if [ ! -f "${CMAKE}" ]; then + error "Can't find CMake at ${CMAKE}." + return 1 + fi + fi + + local NINJA="${SDK_DIR}/cmake${CMAKE_VERSION:-}/bin/ninja" + if [ ! -f "${NINJA}" ]; then + error "Can't find Ninja at ${NINJA}." + return 1 + fi + + local TOOLCHAIN="${NDK_DIR}/build/cmake/android.toolchain.cmake" + if [ ! -f "${TOOLCHAIN}" ]; then + error "Can't find CMake toolchain file at ${TOOLCHAIN}." + return 1 + fi + + info "Using system-provided Android NDK at ${NDK_DIR}" + echo CMAKE=\"${CMAKE}\" + echo CMAKE_GENERATOR=\"Android Gradle - Ninja\" + echo CMAKE_ARGS=\" \ + -DANDROID_ABI=${ANDROID_ABI} \ + -DANDROID_NDK=${NDK_DIR} \ + -DCMAKE_MAKE_PROGRAM=${NINJA} \ + -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN} \ + -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \ + -DANDROID_TOOLCHAIN=clang \ + -DANDROID_STL=c++_static \ + -DANDROID_CPP_FEATURES=rtti\;exceptions \ + \" +} + +system_ndk || mason_ndk |