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