xref: /aosp_15_r20/external/armnn/scripts/build_android_ndk_guide.sh (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker#!/bin/bash
2*89c4ff92SAndroid Build Coastguard Worker#
3*89c4ff92SAndroid Build Coastguard Worker# Copyright © 2023 Arm Ltd and Contributors. All rights reserved.
4*89c4ff92SAndroid Build Coastguard Worker#
5*89c4ff92SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT
6*89c4ff92SAndroid Build Coastguard Worker#
7*89c4ff92SAndroid Build Coastguard Worker
8*89c4ff92SAndroid Build Coastguard Workerfunction Usage() {
9*89c4ff92SAndroid Build Coastguard Worker  echo "This script builds Arm NN for Android using the Android NDK. The script builds"
10*89c4ff92SAndroid Build Coastguard Worker  echo "the Arm NN core library and its dependencies."
11*89c4ff92SAndroid Build Coastguard Worker  echo ""
12*89c4ff92SAndroid Build Coastguard Worker  echo "Usage: $CMD [options]"
13*89c4ff92SAndroid Build Coastguard Worker  echo "Options:"
14*89c4ff92SAndroid Build Coastguard Worker  echo "    -l Use this copy of Arm NN and ComputeLibrary instead of cloning new copies"
15*89c4ff92SAndroid Build Coastguard Worker  echo "       <1 or 0> defaults to 1"
16*89c4ff92SAndroid Build Coastguard Worker  echo "    -a Override Arm NN branch (defaults to latest release branches/armnn_23_02)"
17*89c4ff92SAndroid Build Coastguard Worker  echo "    -b Override ACL branch (defaults to latest release v23.02)"
18*89c4ff92SAndroid Build Coastguard Worker  echo "    -A Android API level defaults to 30"
19*89c4ff92SAndroid Build Coastguard Worker  echo "    -n Neon (CpuAcc backend) enabled <1 or 0> defaults to 1"
20*89c4ff92SAndroid Build Coastguard Worker  echo "    -g CL (GpuAcc backend) enabled <1 or 0> defaults to 1"
21*89c4ff92SAndroid Build Coastguard Worker  echo "    -r Reference (CpuRef backend) enabled <1 or 0> defaults to 1"
22*89c4ff92SAndroid Build Coastguard Worker  echo "    -u Build tests and test applications <1 or 0> defaults to 1"
23*89c4ff92SAndroid Build Coastguard Worker  echo "    -d TfLite Delegate enabled <1 or 0> defaults to 1"
24*89c4ff92SAndroid Build Coastguard Worker  echo "    -p TfLite Parser enabled <1 or 0> defaults to 1"
25*89c4ff92SAndroid Build Coastguard Worker  echo "    -s Dynamic Sample enabled <1 or 0> defaults to 0"
26*89c4ff92SAndroid Build Coastguard Worker  echo "    -i Installation directory defaults to ~/armnn-devenv"
27*89c4ff92SAndroid Build Coastguard Worker  echo "    -t Push to board and run tests <1 or 0> defaults to 0"
28*89c4ff92SAndroid Build Coastguard Worker
29*89c4ff92SAndroid Build Coastguard Worker  exit 1
30*89c4ff92SAndroid Build Coastguard Worker}
31*89c4ff92SAndroid Build Coastguard Worker
32*89c4ff92SAndroid Build Coastguard Workerfunction AssertZeroExitCode {
33*89c4ff92SAndroid Build Coastguard Worker  EXITCODE=$?
34*89c4ff92SAndroid Build Coastguard Worker  if [[ $EXITCODE -ne 0 ]]; then
35*89c4ff92SAndroid Build Coastguard Worker    echo -e "Previous command exited with code $EXITCODE"
36*89c4ff92SAndroid Build Coastguard Worker    exit 1
37*89c4ff92SAndroid Build Coastguard Worker  fi
38*89c4ff92SAndroid Build Coastguard Worker}
39*89c4ff92SAndroid Build Coastguard Worker
40*89c4ff92SAndroid Build Coastguard WorkerTHIS_FILE=$(readlink -f "$0")
41*89c4ff92SAndroid Build Coastguard WorkerBASE_DIR=$(dirname "$THIS_FILE")
42*89c4ff92SAndroid Build Coastguard Worker
43*89c4ff92SAndroid Build Coastguard Worker# Set variables and working directory
44*89c4ff92SAndroid Build Coastguard WorkerCREATE_LINKS=1
45*89c4ff92SAndroid Build Coastguard WorkerARMNN_BRANCH=branches/armnn_23_02
46*89c4ff92SAndroid Build Coastguard WorkerACL_BRANCH=v23.02
47*89c4ff92SAndroid Build Coastguard WorkerACL_NEON=1
48*89c4ff92SAndroid Build Coastguard WorkerACL_CL=1
49*89c4ff92SAndroid Build Coastguard WorkerREFERENCE=1
50*89c4ff92SAndroid Build Coastguard WorkerBUILD_TESTS=1
51*89c4ff92SAndroid Build Coastguard WorkerDELEGATE=1
52*89c4ff92SAndroid Build Coastguard WorkerTFLITE_PARSER=1
53*89c4ff92SAndroid Build Coastguard WorkerDYNAMIC_SAMPLE=0
54*89c4ff92SAndroid Build Coastguard WorkerCMAKE=$(which cmake)
55*89c4ff92SAndroid Build Coastguard WorkerWORKING_DIR=$HOME/armnn-devenv
56*89c4ff92SAndroid Build Coastguard Worker
57*89c4ff92SAndroid Build Coastguard WorkerANDROID_API=30
58*89c4ff92SAndroid Build Coastguard WorkerPUSH_TO_BOARD=0
59*89c4ff92SAndroid Build Coastguard Worker
60*89c4ff92SAndroid Build Coastguard Worker# Parse the command line arguments to get build type
61*89c4ff92SAndroid Build Coastguard Workerwhile getopts "hl:a:c:A:n:g:r:u:d:p:s:i:t:" opt; do
62*89c4ff92SAndroid Build Coastguard Worker  ((OPTION_COUNTER+=1))
63*89c4ff92SAndroid Build Coastguard Worker  case "$opt" in
64*89c4ff92SAndroid Build Coastguard Worker    h|\?) Usage;;
65*89c4ff92SAndroid Build Coastguard Worker    l) CREATE_LINKS=$OPTARG;;
66*89c4ff92SAndroid Build Coastguard Worker    a) ARMNN_BRANCH=$OPTARG;;
67*89c4ff92SAndroid Build Coastguard Worker    c) ACL_BRANCH=$OPTARG;;
68*89c4ff92SAndroid Build Coastguard Worker    A) ANDROID_API=$OPTARG;;
69*89c4ff92SAndroid Build Coastguard Worker    n) ACL_NEON=$OPTARG;;
70*89c4ff92SAndroid Build Coastguard Worker    g) ACL_CL=$OPTARG;;
71*89c4ff92SAndroid Build Coastguard Worker    r) REFERENCE=$OPTARG;;
72*89c4ff92SAndroid Build Coastguard Worker    u) BUILD_TESTS=$OPTARG;;
73*89c4ff92SAndroid Build Coastguard Worker    d) DELEGATE=$OPTARG;;
74*89c4ff92SAndroid Build Coastguard Worker    p) TFLITE_PARSER=$OPTARG;;
75*89c4ff92SAndroid Build Coastguard Worker    s) DYNAMIC_SAMPLE=$OPTARG;;
76*89c4ff92SAndroid Build Coastguard Worker    i) WORKING_DIR=$OPTARG;;
77*89c4ff92SAndroid Build Coastguard Worker    t) PUSH_TO_BOARD=$OPTARG;;
78*89c4ff92SAndroid Build Coastguard Worker  esac
79*89c4ff92SAndroid Build Coastguard Workerdone
80*89c4ff92SAndroid Build Coastguard Workershift $((OPTIND - 1))
81*89c4ff92SAndroid Build Coastguard Worker
82*89c4ff92SAndroid Build Coastguard Workerexport NDK_DIR=$WORKING_DIR/android-ndk-r25
83*89c4ff92SAndroid Build Coastguard Workerexport NDK_TOOLCHAIN_ROOT=$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64
84*89c4ff92SAndroid Build Coastguard Workerexport PATH=$NDK_TOOLCHAIN_ROOT/bin/:$PATH
85*89c4ff92SAndroid Build Coastguard Worker
86*89c4ff92SAndroid Build Coastguard Workerpushd $WORKING_DIR
87*89c4ff92SAndroid Build Coastguard Worker
88*89c4ff92SAndroid Build Coastguard Workerfunction GetAndroidNDK {
89*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR
90*89c4ff92SAndroid Build Coastguard Worker    if [[ ! -d android-ndk-r25 ]]; then
91*89c4ff92SAndroid Build Coastguard Worker        echo "+++ Getting Android NDK"
92*89c4ff92SAndroid Build Coastguard Worker        wget https://dl.google.com/android/repository/android-ndk-r25-linux.zip
93*89c4ff92SAndroid Build Coastguard Worker        unzip android-ndk-r25-linux.zip
94*89c4ff92SAndroid Build Coastguard Worker    fi
95*89c4ff92SAndroid Build Coastguard Worker}
96*89c4ff92SAndroid Build Coastguard Worker
97*89c4ff92SAndroid Build Coastguard Workerfunction GetAndBuildCmake319 {
98*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Building Cmake 3.19rc3"
99*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR
100*89c4ff92SAndroid Build Coastguard Worker    sudo apt-get install libssl-dev
101*89c4ff92SAndroid Build Coastguard Worker    wget https://github.com/Kitware/CMake/releases/download/v3.19.0-rc3/cmake-3.19.0-rc3.tar.gz
102*89c4ff92SAndroid Build Coastguard Worker    tar -zxf cmake-3.19.0-rc3.tar.gz
103*89c4ff92SAndroid Build Coastguard Worker    pushd cmake-3.19.0-rc3
104*89c4ff92SAndroid Build Coastguard Worker    ./bootstrap --prefix=$WORKING_DIR/cmake/install
105*89c4ff92SAndroid Build Coastguard Worker    make all install
106*89c4ff92SAndroid Build Coastguard Worker    popd
107*89c4ff92SAndroid Build Coastguard Worker}
108*89c4ff92SAndroid Build Coastguard Worker
109*89c4ff92SAndroid Build Coastguard Workerfunction GetAndBuildFlatbuffers {
110*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR
111*89c4ff92SAndroid Build Coastguard Worker
112*89c4ff92SAndroid Build Coastguard Worker    if [[ ! -d flatbuffers-2.0.6 ]]; then
113*89c4ff92SAndroid Build Coastguard Worker        echo "+++ Getting Flatbuffers"
114*89c4ff92SAndroid Build Coastguard Worker        wget https://github.com/google/flatbuffers/archive/v2.0.6.tar.gz
115*89c4ff92SAndroid Build Coastguard Worker        tar xf v2.0.6.tar.gz
116*89c4ff92SAndroid Build Coastguard Worker    fi
117*89c4ff92SAndroid Build Coastguard Worker    #Build FlatBuffers
118*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Building x86 Flatbuffers library"
119*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR/flatbuffers-2.0.6
120*89c4ff92SAndroid Build Coastguard Worker
121*89c4ff92SAndroid Build Coastguard Worker    rm -f CMakeCache.txt
122*89c4ff92SAndroid Build Coastguard Worker
123*89c4ff92SAndroid Build Coastguard Worker    rm -rf build-x86
124*89c4ff92SAndroid Build Coastguard Worker    mkdir build-x86
125*89c4ff92SAndroid Build Coastguard Worker    cd build-x86
126*89c4ff92SAndroid Build Coastguard Worker
127*89c4ff92SAndroid Build Coastguard Worker    rm -rf $WORKING_DIR/flatbuffers-x86
128*89c4ff92SAndroid Build Coastguard Worker    mkdir $WORKING_DIR/flatbuffers-x86
129*89c4ff92SAndroid Build Coastguard Worker
130*89c4ff92SAndroid Build Coastguard Worker    CXXFLAGS="-fPIC" $CMAKE .. \
131*89c4ff92SAndroid Build Coastguard Worker          -DFLATBUFFERS_BUILD_FLATC=1 \
132*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_INSTALL_PREFIX:PATH=$WORKING_DIR/flatbuffers-x86
133*89c4ff92SAndroid Build Coastguard Worker
134*89c4ff92SAndroid Build Coastguard Worker    make all install -j16
135*89c4ff92SAndroid Build Coastguard Worker
136*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Building Android Flatbuffers library"
137*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR/flatbuffers-2.0.6
138*89c4ff92SAndroid Build Coastguard Worker
139*89c4ff92SAndroid Build Coastguard Worker    rm -f CMakeCache.txt
140*89c4ff92SAndroid Build Coastguard Worker
141*89c4ff92SAndroid Build Coastguard Worker    rm -rf build-android
142*89c4ff92SAndroid Build Coastguard Worker    mkdir build-android
143*89c4ff92SAndroid Build Coastguard Worker    cd build-android
144*89c4ff92SAndroid Build Coastguard Worker
145*89c4ff92SAndroid Build Coastguard Worker    rm -rf $WORKING_DIR/flatbuffers-android
146*89c4ff92SAndroid Build Coastguard Worker    mkdir $WORKING_DIR/flatbuffers-android
147*89c4ff92SAndroid Build Coastguard Worker
148*89c4ff92SAndroid Build Coastguard Worker    CC=/usr/bin/aarch64-linux-gnu-gcc CXX=/usr/bin/aarch64-linux-gnu-g++ \
149*89c4ff92SAndroid Build Coastguard Worker    CXXFLAGS="-fPIC" $CMAKE .. \
150*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_ANDROID_NDK=$NDK_DIR \
151*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_SYSTEM_NAME=Android \
152*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_SYSTEM_VERSION=$ANDROID_API \
153*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
154*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_CXX_FLAGS=--std=c++14 \
155*89c4ff92SAndroid Build Coastguard Worker          -DFLATBUFFERS_BUILD_FLATC=OFF \
156*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_BUILD_TYPE=Release \
157*89c4ff92SAndroid Build Coastguard Worker          -DFLATBUFFERS_BUILD_TESTS=OFF \
158*89c4ff92SAndroid Build Coastguard Worker          -DCMAKE_INSTALL_PREFIX=$WORKING_DIR/flatbuffers-android
159*89c4ff92SAndroid Build Coastguard Worker
160*89c4ff92SAndroid Build Coastguard Worker    make all install -j16
161*89c4ff92SAndroid Build Coastguard Worker}
162*89c4ff92SAndroid Build Coastguard Worker
163*89c4ff92SAndroid Build Coastguard Workerfunction GetArmNN {
164*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR
165*89c4ff92SAndroid Build Coastguard Worker
166*89c4ff92SAndroid Build Coastguard Worker    if [[ ! -d armnn ]]; then
167*89c4ff92SAndroid Build Coastguard Worker        if [[ $CREATE_LINKS = 1  && -d $BASE_DIR/../../armnn ]]; then
168*89c4ff92SAndroid Build Coastguard Worker            echo "+++ Linking Arm NN"
169*89c4ff92SAndroid Build Coastguard Worker            ln -s $BASE_DIR/../../armnn $WORKING_DIR/armnn
170*89c4ff92SAndroid Build Coastguard Worker        else
171*89c4ff92SAndroid Build Coastguard Worker            echo "+++ Cloning Arm NN"
172*89c4ff92SAndroid Build Coastguard Worker            git clone https://review.mlplatform.org/ml/armnn.git armnn
173*89c4ff92SAndroid Build Coastguard Worker            cd armnn
174*89c4ff92SAndroid Build Coastguard Worker
175*89c4ff92SAndroid Build Coastguard Worker            git checkout $ARMNN_BRANCH
176*89c4ff92SAndroid Build Coastguard Worker            git log -1
177*89c4ff92SAndroid Build Coastguard Worker        fi
178*89c4ff92SAndroid Build Coastguard Worker    fi
179*89c4ff92SAndroid Build Coastguard Worker}
180*89c4ff92SAndroid Build Coastguard Worker
181*89c4ff92SAndroid Build Coastguard Workerfunction GetAndBuildComputeLibrary {
182*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR
183*89c4ff92SAndroid Build Coastguard Worker
184*89c4ff92SAndroid Build Coastguard Worker    if [[ ! -d ComputeLibrary ]]; then
185*89c4ff92SAndroid Build Coastguard Worker        if [[ $CREATE_LINKS = 1 ]]; then
186*89c4ff92SAndroid Build Coastguard Worker            if [[ -d $BASE_DIR/../../ComputeLibrary ]]; then
187*89c4ff92SAndroid Build Coastguard Worker                echo "+++ Linking ComputeLibrary"
188*89c4ff92SAndroid Build Coastguard Worker                ln -s $BASE_DIR/../../ComputeLibrary $WORKING_DIR/ComputeLibrary
189*89c4ff92SAndroid Build Coastguard Worker            else
190*89c4ff92SAndroid Build Coastguard Worker                echo "+++ Cloning ComputeLibrary"
191*89c4ff92SAndroid Build Coastguard Worker                git clone https://review.mlplatform.org/ml/ComputeLibrary.git ComputeLibrary
192*89c4ff92SAndroid Build Coastguard Worker                cd ComputeLibrary
193*89c4ff92SAndroid Build Coastguard Worker                git checkout $($BASE_DIR/../../armnn/scripts/get_compute_library.sh -p)
194*89c4ff92SAndroid Build Coastguard Worker                git log -1
195*89c4ff92SAndroid Build Coastguard Worker            fi
196*89c4ff92SAndroid Build Coastguard Worker        else
197*89c4ff92SAndroid Build Coastguard Worker            echo "+++ Cloning ComputeLibrary"
198*89c4ff92SAndroid Build Coastguard Worker
199*89c4ff92SAndroid Build Coastguard Worker            git clone https://review.mlplatform.org/ml/ComputeLibrary.git ComputeLibrary
200*89c4ff92SAndroid Build Coastguard Worker            cd ComputeLibrary
201*89c4ff92SAndroid Build Coastguard Worker            git checkout $ACL_BRANCH
202*89c4ff92SAndroid Build Coastguard Worker            git log -1
203*89c4ff92SAndroid Build Coastguard Worker        fi
204*89c4ff92SAndroid Build Coastguard Worker    fi
205*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR/ComputeLibrary
206*89c4ff92SAndroid Build Coastguard Worker
207*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Building Compute Library"
208*89c4ff92SAndroid Build Coastguard Worker    scons toolchain_prefix=llvm- compiler_prefix=aarch64-linux-android$ANDROID_API- arch=arm64-v8a neon=$ACL_NEON opencl=$ACL_CL embed_kernels=$ACL_CL extra_cxx_flags="-fPIC" \
209*89c4ff92SAndroid Build Coastguard Worker    benchmark_tests=0 validation_tests=0 os=android -j16
210*89c4ff92SAndroid Build Coastguard Worker}
211*89c4ff92SAndroid Build Coastguard Worker
212*89c4ff92SAndroid Build Coastguard Workerfunction GetAndBuildTFLite {
213*89c4ff92SAndroid Build Coastguard Worker    TENSORFLOW_REVISION="tags/v2.10.0" # Release 2.10.0 tag
214*89c4ff92SAndroid Build Coastguard Worker    TFLITE_ROOT_DIR=${WORKING_DIR}/tensorflow/tensorflow/lite
215*89c4ff92SAndroid Build Coastguard Worker
216*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR
217*89c4ff92SAndroid Build Coastguard Worker
218*89c4ff92SAndroid Build Coastguard Worker    if [[ ! -d tensorflow ]]; then
219*89c4ff92SAndroid Build Coastguard Worker        if [[ -d $BASE_DIR/../../armnn ]]; then
220*89c4ff92SAndroid Build Coastguard Worker            TENSORFLOW_REVISION=$($BASE_DIR/../../armnn/scripts/get_tensorflow.sh -p)
221*89c4ff92SAndroid Build Coastguard Worker        fi
222*89c4ff92SAndroid Build Coastguard Worker        echo "+++ Cloning TensorFlow"
223*89c4ff92SAndroid Build Coastguard Worker        git clone https://github.com/tensorflow/tensorflow.git
224*89c4ff92SAndroid Build Coastguard Worker        AssertZeroExitCode "Cloning TensorFlow failed"
225*89c4ff92SAndroid Build Coastguard Worker
226*89c4ff92SAndroid Build Coastguard Worker        cd tensorflow
227*89c4ff92SAndroid Build Coastguard Worker
228*89c4ff92SAndroid Build Coastguard Worker        echo "Checking out ${TENSORFLOW_REVISION}"
229*89c4ff92SAndroid Build Coastguard Worker        git fetch && git checkout $TENSORFLOW_REVISION
230*89c4ff92SAndroid Build Coastguard Worker
231*89c4ff92SAndroid Build Coastguard Worker        cd $WORKING_DIR
232*89c4ff92SAndroid Build Coastguard Worker    fi
233*89c4ff92SAndroid Build Coastguard Worker
234*89c4ff92SAndroid Build Coastguard Worker    CMARGS="-DTFLITE_ENABLE_XNNPACK=OFF"
235*89c4ff92SAndroid Build Coastguard Worker
236*89c4ff92SAndroid Build Coastguard Worker    # Two different naming conventions; one for build and the other for CC_OPT_FLAGS
237*89c4ff92SAndroid Build Coastguard Worker    ANDROID_ARM_ARCH="arm64-v8a"
238*89c4ff92SAndroid Build Coastguard Worker
239*89c4ff92SAndroid Build Coastguard Worker    mkdir -p tflite-out/android
240*89c4ff92SAndroid Build Coastguard Worker    cd tflite-out/android
241*89c4ff92SAndroid Build Coastguard Worker
242*89c4ff92SAndroid Build Coastguard Worker    echo "*** Configure and Cross-Compile TfLite for ${TARGET_MACHINE} with architecture ${ANDROID_ARM_ARCH}"
243*89c4ff92SAndroid Build Coastguard Worker    echo "*** Outputting files to ${TFLITE_OUTPUT_DIR}/${TARGET_MACHINE}"
244*89c4ff92SAndroid Build Coastguard Worker
245*89c4ff92SAndroid Build Coastguard Worker    CMARGS="$CMARGS -DCMAKE_TOOLCHAIN_FILE=$NDK_DIR/build/cmake/android.toolchain.cmake \
246*89c4ff92SAndroid Build Coastguard Worker        -DANDROID_ABI=$ANDROID_ARM_ARCH \
247*89c4ff92SAndroid Build Coastguard Worker        -DANDROID_PLATFORM=$ANDROID_API" \
248*89c4ff92SAndroid Build Coastguard Worker
249*89c4ff92SAndroid Build Coastguard Worker    $CMAKE $CMARGS $TFLITE_ROOT_DIR
250*89c4ff92SAndroid Build Coastguard Worker    AssertZeroExitCode "Failed to configure Tensorflow Lite from source"
251*89c4ff92SAndroid Build Coastguard Worker
252*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR
253*89c4ff92SAndroid Build Coastguard Worker
254*89c4ff92SAndroid Build Coastguard Worker    $CMAKE --build tflite-out/android -j 16
255*89c4ff92SAndroid Build Coastguard Worker    AssertZeroExitCode "Failed to build Tensorflow Lite from source"
256*89c4ff92SAndroid Build Coastguard Worker
257*89c4ff92SAndroid Build Coastguard Worker    mkdir -p $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema
258*89c4ff92SAndroid Build Coastguard Worker
259*89c4ff92SAndroid Build Coastguard Worker    SCHEMA_LOCATION=$WORKING_DIR/tensorflow/tensorflow/lite/schema/schema.fbs
260*89c4ff92SAndroid Build Coastguard Worker
261*89c4ff92SAndroid Build Coastguard Worker    cp $SCHEMA_LOCATION $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema
262*89c4ff92SAndroid Build Coastguard Worker
263*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema
264*89c4ff92SAndroid Build Coastguard Worker    $WORKING_DIR/flatbuffers-x86/bin/flatc -c --gen-object-api --reflect-types --reflect-names schema.fbs
265*89c4ff92SAndroid Build Coastguard Worker    AssertZeroExitCode "Failed to generate C++ schema from $SCHEMA_LOCATION"
266*89c4ff92SAndroid Build Coastguard Worker}
267*89c4ff92SAndroid Build Coastguard Worker
268*89c4ff92SAndroid Build Coastguard Workerfunction BuildArmNN {
269*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Building Arm NN"
270*89c4ff92SAndroid Build Coastguard Worker
271*89c4ff92SAndroid Build Coastguard Worker    rm -rf $WORKING_DIR/armnn/build
272*89c4ff92SAndroid Build Coastguard Worker
273*89c4ff92SAndroid Build Coastguard Worker    mkdir $WORKING_DIR/armnn/build
274*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR/armnn/build
275*89c4ff92SAndroid Build Coastguard Worker
276*89c4ff92SAndroid Build Coastguard Worker    CMARGS="-DCMAKE_BUILD_TYPE=Release \
277*89c4ff92SAndroid Build Coastguard Worker            -DCMAKE_ANDROID_NDK=$NDK_DIR \
278*89c4ff92SAndroid Build Coastguard Worker            -DNDK_VERSION=r25 \
279*89c4ff92SAndroid Build Coastguard Worker            -DCMAKE_SYSTEM_NAME=Android \
280*89c4ff92SAndroid Build Coastguard Worker            -DCMAKE_SYSTEM_VERSION=$ANDROID_API \
281*89c4ff92SAndroid Build Coastguard Worker            -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
282*89c4ff92SAndroid Build Coastguard Worker            -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
283*89c4ff92SAndroid Build Coastguard Worker            -DARMCOMPUTE_ROOT=$WORKING_DIR/ComputeLibrary \
284*89c4ff92SAndroid Build Coastguard Worker            -DARMCOMPUTE_BUILD_DIR=$WORKING_DIR/ComputeLibrary/build \
285*89c4ff92SAndroid Build Coastguard Worker            -DARMCOMPUTENEON=$ACL_NEON -DARMCOMPUTECL=$ACL_CL -DARMNNREF=$REFERENCE \
286*89c4ff92SAndroid Build Coastguard Worker            -DFLATBUFFERS_INCLUDE_PATH=$WORKING_DIR/flatbuffers-x86/include \
287*89c4ff92SAndroid Build Coastguard Worker            -DFLATBUFFERS_ROOT=$WORKING_DIR/flatbuffers-android \
288*89c4ff92SAndroid Build Coastguard Worker            -DFLATC_DIR=$WORKING_DIR/flatbuffers-x86 \
289*89c4ff92SAndroid Build Coastguard Worker            -DBUILD_UNIT_TESTS=$BUILD_TESTS \
290*89c4ff92SAndroid Build Coastguard Worker            -DBUILD_TESTS=$BUILD_TESTS \
291*89c4ff92SAndroid Build Coastguard Worker            -fexceptions"
292*89c4ff92SAndroid Build Coastguard Worker
293*89c4ff92SAndroid Build Coastguard Worker    if [[ $TFLITE_PARSER == 1 ]]; then
294*89c4ff92SAndroid Build Coastguard Worker        CMARGS="$CMARGS \
295*89c4ff92SAndroid Build Coastguard Worker            -DBUILD_TF_LITE_PARSER=1 \
296*89c4ff92SAndroid Build Coastguard Worker            -DTF_LITE_GENERATED_PATH=$WORKING_DIR/tflite-out/tensorflow/tensorflow/lite/schema \
297*89c4ff92SAndroid Build Coastguard Worker            -DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \
298*89c4ff92SAndroid Build Coastguard Worker            -DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android"
299*89c4ff92SAndroid Build Coastguard Worker    fi
300*89c4ff92SAndroid Build Coastguard Worker
301*89c4ff92SAndroid Build Coastguard Worker    if [[ $DELEGATE == 1 ]]; then
302*89c4ff92SAndroid Build Coastguard Worker        CMARGS="$CMARGS \
303*89c4ff92SAndroid Build Coastguard Worker            -DBUILD_ARMNN_TFLITE_DELEGATE=1 \
304*89c4ff92SAndroid Build Coastguard Worker            -DTENSORFLOW_ROOT=$WORKING_DIR/tensorflow \
305*89c4ff92SAndroid Build Coastguard Worker            -DTFLITE_LIB_ROOT=$WORKING_DIR/tflite-out/android \
306*89c4ff92SAndroid Build Coastguard Worker            -DTFLITE_ROOT_DIR=$WORKING_DIR/tensorflow/tensorflow/lite"
307*89c4ff92SAndroid Build Coastguard Worker    fi
308*89c4ff92SAndroid Build Coastguard Worker
309*89c4ff92SAndroid Build Coastguard Worker    if [[ $DYNAMIC_SAMPLE == 1 ]]; then
310*89c4ff92SAndroid Build Coastguard Worker        DYNAMIC_SAMPLE_PATH="/data/local/tmp/dynamic/sample"
311*89c4ff92SAndroid Build Coastguard Worker        CMARGS="$CMARGS \
312*89c4ff92SAndroid Build Coastguard Worker                -DDYNAMIC_BACKEND_PATHS=$DYNAMIC_SAMPLE_PATH \
313*89c4ff92SAndroid Build Coastguard Worker                -DSAMPLE_DYNAMIC_BACKEND=1"
314*89c4ff92SAndroid Build Coastguard Worker    fi
315*89c4ff92SAndroid Build Coastguard Worker    echo "args"
316*89c4ff92SAndroid Build Coastguard Worker    echo $CMARGS
317*89c4ff92SAndroid Build Coastguard Worker    CXX=aarch64-linux-android$ANDROID_API-clang++ \
318*89c4ff92SAndroid Build Coastguard Worker    CC=aarch64-linux-android$ANDROID_API-clang \
319*89c4ff92SAndroid Build Coastguard Worker    CXX_FLAGS="-fPIE -fPIC" \
320*89c4ff92SAndroid Build Coastguard Worker    $CMAKE $CMARGS ..
321*89c4ff92SAndroid Build Coastguard Worker    make -j16
322*89c4ff92SAndroid Build Coastguard Worker}
323*89c4ff92SAndroid Build Coastguard Worker
324*89c4ff92SAndroid Build Coastguard Workerfunction BuildStandaloneDynamicBackend {
325*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Building Standalone Dynamic Sample Backend"
326*89c4ff92SAndroid Build Coastguard Worker    cd $WORKING_DIR/armnn/src/dynamic/sample
327*89c4ff92SAndroid Build Coastguard Worker    BUILD_DIR=build
328*89c4ff92SAndroid Build Coastguard Worker    rm -rf $BUILD_DIR
329*89c4ff92SAndroid Build Coastguard Worker    mkdir -p $BUILD_DIR
330*89c4ff92SAndroid Build Coastguard Worker    cd $BUILD_DIR
331*89c4ff92SAndroid Build Coastguard Worker    CXX=aarch64-linux-android$ANDROID_API-clang++ \
332*89c4ff92SAndroid Build Coastguard Worker    CC=aarch64-linux-android$ANDROID_API-clang \
333*89c4ff92SAndroid Build Coastguard Worker    CXX_FLAGS="-fPIE -fPIC" \
334*89c4ff92SAndroid Build Coastguard Worker    $CMAKE \
335*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_C_COMPILER_WORKS=TRUE \
336*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_CXX_COMPILER_WORKS=TRUE \
337*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_ANDROID_NDK=$NDK_DIR \
338*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_SYSTEM_NAME=Android \
339*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_SYSTEM_VERSION=$ANDROID_API \
340*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
341*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_SYSROOT=$WORKING_DIR/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
342*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_CXX_FLAGS=--std=c++14 \
343*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_EXE_LINKER_FLAGS="-pie -llog" \
344*89c4ff92SAndroid Build Coastguard Worker    -DCMAKE_MODULE_LINKER_FLAGS="-llog" \
345*89c4ff92SAndroid Build Coastguard Worker    -DARMNN_PATH=$WORKING_DIR/armnn/build/libarmnn.so ..
346*89c4ff92SAndroid Build Coastguard Worker    make
347*89c4ff92SAndroid Build Coastguard Worker}
348*89c4ff92SAndroid Build Coastguard Worker
349*89c4ff92SAndroid Build Coastguard Worker# push sources to board
350*89c4ff92SAndroid Build Coastguard Workerfunction PushBuildSourcesToBoard {
351*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Removing files and symbolic links from previous runs"
352*89c4ff92SAndroid Build Coastguard Worker    adb start-server
353*89c4ff92SAndroid Build Coastguard Worker    adb shell rm -rf /data/local/tmp/*
354*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Pushing sources to board"
355*89c4ff92SAndroid Build Coastguard Worker    adb root
356*89c4ff92SAndroid Build Coastguard Worker    adb remount
357*89c4ff92SAndroid Build Coastguard Worker    sleep 10s
358*89c4ff92SAndroid Build Coastguard Worker    adb version
359*89c4ff92SAndroid Build Coastguard Worker    adb push libarmnn.so /data/local/tmp/
360*89c4ff92SAndroid Build Coastguard Worker    adb push libtimelineDecoder.so /data/local/tmp/
361*89c4ff92SAndroid Build Coastguard Worker    adb push libtimelineDecoderJson.so /data/local/tmp/
362*89c4ff92SAndroid Build Coastguard Worker    adb push GatordMock /data/local/tmp/
363*89c4ff92SAndroid Build Coastguard Worker    adb push libarmnnBasePipeServer.so /data/local/tmp/
364*89c4ff92SAndroid Build Coastguard Worker    adb push libarmnnTestUtils.so /data/local/tmp/
365*89c4ff92SAndroid Build Coastguard Worker    adb push UnitTests /data/local/tmp/
366*89c4ff92SAndroid Build Coastguard Worker    if [[ $DELEGATE == 1 ]]; then
367*89c4ff92SAndroid Build Coastguard Worker        adb push ${WORKING_DIR}/armnn/build/delegate/DelegateUnitTests /data/local/tmp/
368*89c4ff92SAndroid Build Coastguard Worker        adb push ${WORKING_DIR}/armnn/build/delegate/libarmnnDelegate.so /data/local/tmp/
369*89c4ff92SAndroid Build Coastguard Worker    fi
370*89c4ff92SAndroid Build Coastguard Worker    adb push $NDK_DIR/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so /data/local/tmp/
371*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Pushing test files to board"
372*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testSharedObject
373*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/testSharedObject/* /data/local/tmp/src/backends/backendsCommon/test/testSharedObject/
374*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend
375*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/testDynamicBackend/* /data/local/tmp/src/backends/backendsCommon/test/testDynamicBackend/
376*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1
377*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/backendsTestPath1/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath1/
378*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2
379*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/
380*89c4ff92SAndroid Build Coastguard Worker    adb shell 'ln -s Arm_CpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1'
381*89c4ff92SAndroid Build Coastguard Worker    adb shell 'ln -s Arm_CpuAcc_backend.so.1 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2'
382*89c4ff92SAndroid Build Coastguard Worker    adb shell 'ln -s Arm_CpuAcc_backend.so.1.2 /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_CpuAcc_backend.so.1.2.3'
383*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/backendsTestPath2/Arm_GpuAcc_backend.so /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/
384*89c4ff92SAndroid Build Coastguard Worker    adb shell 'ln -s nothing /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath2/Arm_no_backend.so'
385*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath3
386*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5
387*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/backendsTestPath5/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath5/
388*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6
389*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/backendsTestPath6/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath6/
390*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath7
391*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9
392*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/backendsCommon/test/backendsTestPath9/* /data/local/tmp/src/backends/backendsCommon/test/backendsTestPath9/
393*89c4ff92SAndroid Build Coastguard Worker    adb shell mkdir -p /data/local/tmp/src/backends/dynamic/reference
394*89c4ff92SAndroid Build Coastguard Worker    adb push -p ${WORKING_DIR}/armnn/build/src/backends/dynamic/reference/Arm_CpuRef_backend.so /data/local/tmp/src/backends/dynamic/reference/
395*89c4ff92SAndroid Build Coastguard Worker    if [[ $DYNAMIC_SAMPLE == 1 ]]; then
396*89c4ff92SAndroid Build Coastguard Worker        adb shell mkdir -p /data/local/tmp/dynamic/sample/
397*89c4ff92SAndroid Build Coastguard Worker        adb push -p ${WORKING_DIR}/armnn/src/dynamic/sample/build/libArm_SampleDynamic_backend.so /data/local/tmp/dynamic/sample/
398*89c4ff92SAndroid Build Coastguard Worker    fi
399*89c4ff92SAndroid Build Coastguard Worker    echo "+++ Running UnitTests"
400*89c4ff92SAndroid Build Coastguard Worker    adb shell LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/UnitTests ; printf $?
401*89c4ff92SAndroid Build Coastguard Worker    if [[ $DELEGATE == 1 ]]; then
402*89c4ff92SAndroid Build Coastguard Worker        adb shell LD_LIBRARY_PATH=/data/local/tmp:/vendor/lib64:/vendor/lib64/egl /data/local/tmp/DelegateUnitTests ; printf $?
403*89c4ff92SAndroid Build Coastguard Worker    fi
404*89c4ff92SAndroid Build Coastguard Worker}
405*89c4ff92SAndroid Build Coastguard Worker
406*89c4ff92SAndroid Build Coastguard Worker# Cleanup any previous runs, setup clean directories
407*89c4ff92SAndroid Build Coastguard Workerecho "+++ Creating $WORKING_DIR directory"
408*89c4ff92SAndroid Build Coastguard Workermkdir -p $WORKING_DIR
409*89c4ff92SAndroid Build Coastguard WorkerAssertZeroExitCode "Creating $WORKING_DIR directory failed"
410*89c4ff92SAndroid Build Coastguard Worker
411*89c4ff92SAndroid Build Coastguard WorkerGetAndroidNDK
412*89c4ff92SAndroid Build Coastguard Workerif [[ $? != 0 ]] ; then
413*89c4ff92SAndroid Build Coastguard Worker    echo "Downloading Android NDK failed"
414*89c4ff92SAndroid Build Coastguard Worker    exit 1
415*89c4ff92SAndroid Build Coastguard Workerfi
416*89c4ff92SAndroid Build Coastguard WorkerGetAndBuildFlatbuffers
417*89c4ff92SAndroid Build Coastguard Workerif [[ $? != 0 ]] ; then
418*89c4ff92SAndroid Build Coastguard Worker    echo "Building Flatbuffers failed"
419*89c4ff92SAndroid Build Coastguard Worker    exit 1
420*89c4ff92SAndroid Build Coastguard Workerfi
421*89c4ff92SAndroid Build Coastguard Workerif [[ $(lsb_release -rs) == "18.04" ]]; then
422*89c4ff92SAndroid Build Coastguard Worker  # We know this is necessary for 18.04 builds.
423*89c4ff92SAndroid Build Coastguard Worker  GetAndBuildCmake319
424*89c4ff92SAndroid Build Coastguard Worker  CMAKE=$WORKING_DIR/cmake/install/bin/cmake
425*89c4ff92SAndroid Build Coastguard Workerfi
426*89c4ff92SAndroid Build Coastguard WorkerGetArmNN
427*89c4ff92SAndroid Build Coastguard Workerif [[ $? != 0 ]] ; then
428*89c4ff92SAndroid Build Coastguard Worker    echo "Cloning Arm NN failed"
429*89c4ff92SAndroid Build Coastguard Worker    exit 1
430*89c4ff92SAndroid Build Coastguard Workerfi
431*89c4ff92SAndroid Build Coastguard Worker# Build TFLite if the Delegate or Parser is required
432*89c4ff92SAndroid Build Coastguard Workerif [[ $DELEGATE == 1 || $TFLITE_PARSER ]]; then
433*89c4ff92SAndroid Build Coastguard Worker    GetAndBuildTFLite
434*89c4ff92SAndroid Build Coastguard Workerfi
435*89c4ff92SAndroid Build Coastguard Workerif [[ $? != 0 ]] ; then
436*89c4ff92SAndroid Build Coastguard Worker    echo "Building tflite failed"
437*89c4ff92SAndroid Build Coastguard Worker    exit 1
438*89c4ff92SAndroid Build Coastguard Workerfi
439*89c4ff92SAndroid Build Coastguard WorkerGetAndBuildComputeLibrary
440*89c4ff92SAndroid Build Coastguard Workerif [[ $? != 0 ]] ; then
441*89c4ff92SAndroid Build Coastguard Worker    echo "Building ComputeLibrary failed"
442*89c4ff92SAndroid Build Coastguard Worker    exit 1
443*89c4ff92SAndroid Build Coastguard Workerfi
444*89c4ff92SAndroid Build Coastguard WorkerBuildArmNN
445*89c4ff92SAndroid Build Coastguard Workerif [[ $? != 0 ]] ; then
446*89c4ff92SAndroid Build Coastguard Worker    echo "Building Arm NN failed"
447*89c4ff92SAndroid Build Coastguard Worker    exit 1
448*89c4ff92SAndroid Build Coastguard Workerfi
449*89c4ff92SAndroid Build Coastguard Workerif [[ $DYNAMIC_SAMPLE == 1 ]]; then
450*89c4ff92SAndroid Build Coastguard Worker  BuildStandaloneDynamicBackend
451*89c4ff92SAndroid Build Coastguard Workerfi
452*89c4ff92SAndroid Build Coastguard Workerif [[ $PUSH_TO_BOARD == 1 ]]; then
453*89c4ff92SAndroid Build Coastguard Worker  PushBuildSourcesToBoard
454*89c4ff92SAndroid Build Coastguard Workerfi
455*89c4ff92SAndroid Build Coastguard Workerif [[ "$R_new" -eq 0 ]]; then
456*89c4ff92SAndroid Build Coastguard Worker    echo "Success!"
457*89c4ff92SAndroid Build Coastguard Workerelse
458*89c4ff92SAndroid Build Coastguard Worker    echo "Failed to run UnitTests"
459*89c4ff92SAndroid Build Coastguard Worker    exit 1
460*89c4ff92SAndroid Build Coastguard Workerfi
461