1#!/bin/bash 2 3################################################# 4# Arguments 5################################################# 6while [ $# -gt 0 ]; do 7 case $1 in 8 --help | -h) 9 echo "Execute make-Android.sh in *arm/* or *aarch64/* with some args." 10 echo " use --ndk to set ANDROID_NDK" 11 echo " use --cmake to specify which cmake to use" 12 echo " use --debug to enable debug build" 13 exit 1 14 ;; 15 --debug) 16 BUILD_TYPE="Debug" 17 ;; 18 -B) 19 if [ -f "CMakeCache.txt" ]; then 20 rm CMakeCache.txt 21 fi 22 ;; 23 --ndk) 24 ANDROID_NDK=$2 25 shift 26 ;; 27 --cmake) 28 CMAKE_PROGRAM=$2 29 shift 30 ;; 31 esac 32 shift 33done 34 35CMAKE_PARALLEL_ENABLE=0 36 37# Run this from within a bash shell 38MAKE_PROGRAM=`which make` 39 40################################################# 41# Detect cmake version 42################################################# 43if [ -z $CMAKE_PROGRAM ]; then 44 CMAKE_PROGRAM=`which cmake` 45fi 46 47CMAKE_VERSION=$(${CMAKE_PROGRAM} --version | grep "version" | cut -d " " -f 3) 48CMAKE_MAJOR_VERSION=`echo ${CMAKE_VERSION} | cut -d "." -f 1` 49CMAKE_MINOR_VERSION=`echo ${CMAKE_VERSION} | cut -d "." -f 2` 50 51if [ -z ${CMAKE_VERSION} ]; then 52 echo -e "\e[1;31m cmake in ${CMAKE_PROGRAM} is invalid, please check!\e[0m" 53 exit 1 54else 55 echo "Found cmake in ${CMAKE_PROGRAM}, version: ${CMAKE_VERSION}" 56fi 57 58if [ ${CMAKE_MAJOR_VERSION} -ge 3 ] && [ ${CMAKE_MINOR_VERSION} -ge 12 ]; then 59 CMAKE_PARALLEL_ENABLE=1 60 echo "use cmake parallel build." 61fi 62 63################################################# 64# Detect ndk path and version 65################################################# 66 67NDK_SEARCH_PATH=( 68 /home/pub/ndk/ 69 ~/work/android/ndk/ 70) 71 72FOUND_NDK=0 73 74if [ -z "$ANDROID_NDK" ]; then 75 # try find ndk path in CMakeCache.txt 76 if [ -f "CMakeCache.txt" ]; then 77 ANDROID_NDK=`grep ANDROID_NDK CMakeCache.txt | awk -F '=' '{ print $2 }'` 78 79 if [ -d "${ANDROID_NDK}" ]; then 80 echo "use android ndk from CMakeCache.txt : ${ANDROID_NDK}" 81 FOUND_NDK=1 82 fi 83 fi 84else 85 FOUND_NDK=1 86fi 87 88################################################# 89# search possible path to get ndk with higher version 90################################################# 91NDK_OPTION="" 92NDK_COUNT=0 93 94if [ "${FOUND_NDK}" = "0" ]; then 95 echo "trying to find android ndk in the following paths:" 96 for NDK_BASE in ${NDK_SEARCH_PATH[@]}; 97 do 98 echo "${NDK_BASE}" 99 done 100 101 echo "find valid android ndk:" 102 103 for NDK_BASE in ${NDK_SEARCH_PATH[@]}; 104 do 105 if [ -d ${NDK_BASE} ]; then 106 NDKS=`ls -r -d ${NDK_BASE}android-ndk-r*/` 107 108 for NDK_PATH in ${NDKS[@]}; 109 do 110 if [ -d ${NDK_PATH} ]; then 111 NDK_COUNT=$[${NDK_COUNT}+1] 112 NDK_OPT="${NDK_COUNT} - ${NDK_PATH}" 113 114 echo ${NDK_OPT} 115 116 NDK_OPTION+="${NDK_PATH} " 117 fi 118 done 119 fi 120 121 if [ "${FOUND_NDK}" = "1" ]; then 122 break 123 fi 124 done 125fi 126 127case ${NDK_COUNT} in 128 0) 129 ;; 130 1) 131 ANDROID_NDK=${NDK_PATH[0]} 132 FOUND_NDK=1 133 134 echo "use ndk: ${ANDROID_NDK}" 135 ;; 136 *) 137 read -p "select [1-${NDK_COUNT}] ndk used for compiling: " -ra NDK_INTPUT 138 139 NDK_INDEX=0 140 141 for NDK_PATH in ${NDK_OPTION[@]}; 142 do 143 NDK_INDEX=$[${NDK_INDEX}+1] 144 145 if [ "${NDK_INDEX}" -eq "${NDK_INTPUT}" ]; then 146 echo "${NDK_INTPUT} - ${NDK_PATH} selected as ANDROID_NDK" 147 ANDROID_NDK=${NDK_PATH} 148 FOUND_NDK=1 149 break 150 fi 151 done 152 153 if [ $FOUND_NDK -eq 0 ]; then 154 echo "invalid input option ${NDK_INTPUT}" 155 fi 156esac 157 158if [ $FOUND_NDK -eq 0 ]; then 159 echo "can not found any valid android ndk" 160 exit 1 161fi 162 163################################################# 164# try to detect NDK version 165# for ndk > 10, ndk version is presented at $ANDROID_NDK/source.properties 166# for ndk <=10, ndk version is presented at $ANDROID_NDK/RELEASE.TXT 167# parameter: ndk path 168# return: ndk version, 0 if not found 169################################################# 170detect_ndk_version() 171{ 172 RET=0 173 174 if [ -f "$1/source.properties" ]; then 175 # NDK version is greater than 10 176 RET=$(grep -o '^Pkg.Revision.*[0-9]*.*' $ANDROID_NDK/source.properties |cut -d " " -f 3 | cut -d "." -f 1) 177 elif [ -f "$1/RELEASE.TXT" ]; then 178 # NDK version is less than 11 179 RET=$(grep -o '^r[0-9]*.*' $ANDROID_NDK/RELEASE.TXT | cut -d " " -f 1 | cut -b2- | sed 's/[a-z]//g') 180 else 181 # A correct NDK directory must be pointed 182 RET=0 183 fi 184 185 echo $RET 186} 187 188NDK_VERSION=$(detect_ndk_version ${ANDROID_NDK}) 189 190echo "NDK: ${ANDROID_NDK} version: ${NDK_VERSION}" 191 192if [ $NDK_VERSION -eq 0 ]; then 193 echo "NDK version isn't detected, please check $ANDROID_NDK" 194 FOUND_NDK=0 195else 196 FOUND_NDK=1 197 198 if [ $NDK_VERSION -ge 16 ]; then 199 TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake 200 NATIVE_API_LEVEL="android-27" 201 elif [ $NDK_VERSION -gt 12 ]; then 202 TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake 203 NATIVE_API_LEVEL="android-21" 204 elif [ $NDK_VERSION -le 12 ]; then 205 TOOLCHAIN_FILE=../android.toolchain.cmake 206 NATIVE_API_LEVEL="android-21" 207 fi 208 209 if [ $NDK_VERSION -lt 18 ]; then 210 ################################################# 211 # Set platform tools 212 ################################################# 213 if [ "${ANDROID_ABI}" = "armeabi-v7a" ] || [ "${ANDROID_ABI}" = "armeabi-v7a with NEON" ]; then 214 TOOLCHAIN_NAME="arm-linux-androideabi-4.9" 215 PLATFORM=$ANDROID_NDK/platforms/${NATIVE_API_LEVEL}/arch-arm 216 elif [ "${ANDROID_ABI}" = "arm64-v8a" ]; then 217 TOOLCHAIN_NAME="aarch64-linux-android-4.9" 218 PLATFORM=$ANDROID_NDK/platforms/${NATIVE_API_LEVEL}/arch-arm64 219 fi 220 ANDROID_STL="system" 221 else 222 # From NDK 18, GCC is deprecated 223 TOOLCHAIN_NAME="" 224 PLATFORM="" 225 ANDROID_STL="c++_static" 226 fi 227fi 228 229if [ "${FOUND_NDK}" = "0" ]; then 230 echo -e "\e[1;31m No ndk path found. You should add your ndk path\e[0m" 231 exit 1 232else 233 echo "ndk path: $ANDROID_NDK" 234 echo "toolchain file: $TOOLCHAIN_FILE" 235 echo "toolchain name: $TOOLCHAIN_NAME" 236 echo "api level: $NATIVE_API_LEVEL" 237fi 238