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