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