xref: /rockchip-linux_mpp/build/android/env_setup.sh (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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