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