xref: /OK3568_Linux_fs/external/mpp/build/android/env_setup.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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