1*89c4ff92SAndroid Build Coastguard Worker#!/bin/bash 2*89c4ff92SAndroid Build Coastguard Worker 3*89c4ff92SAndroid Build Coastguard Worker# 4*89c4ff92SAndroid Build Coastguard Worker# Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved. 5*89c4ff92SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT 6*89c4ff92SAndroid Build Coastguard Worker# 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker# Script which builds Arm NN and ACL 9*89c4ff92SAndroid Build Coastguard Worker# setup-armnn.sh must be executed in the same directory, before running this script 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Workerset -o nounset # Catch references to undefined variables. 12*89c4ff92SAndroid Build Coastguard Workerset -o pipefail # Catch non zero exit codes within pipelines. 13*89c4ff92SAndroid Build Coastguard Workerset -o errexit # Catch and propagate non zero exit codes. 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Workerrel_path=$(dirname "$0") # relative path from where script is executed to script location 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Workerbuild_acl() 18*89c4ff92SAndroid Build Coastguard Worker{ 19*89c4ff92SAndroid Build Coastguard Worker cd "$ACL_SRC" 20*89c4ff92SAndroid Build Coastguard Worker 21*89c4ff92SAndroid Build Coastguard Worker # $acl_scons_params are additional options provided by the user and will overwrite any previously defined args 22*89c4ff92SAndroid Build Coastguard Worker local acl_params="neon=$flag_neon_backend opencl=$flag_cl_backend Werror=0 embed_kernels=1 examples=0 validation_tests=0 benchmark_tests=0 benchmark_examples=0 $acl_scons_params" 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker if [ "$flag_debug" -eq 1 ]; then 25*89c4ff92SAndroid Build Coastguard Worker acl_params="$acl_params debug=1 asserts=1" 26*89c4ff92SAndroid Build Coastguard Worker fi 27*89c4ff92SAndroid Build Coastguard Worker 28*89c4ff92SAndroid Build Coastguard Worker local native_flag="" 29*89c4ff92SAndroid Build Coastguard Worker if [ "$NATIVE_BUILD" ]; then 30*89c4ff92SAndroid Build Coastguard Worker native_flag="build=native" 31*89c4ff92SAndroid Build Coastguard Worker fi 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker # Force -fPIC so that ACL is suitable for inclusion in Arm NN library 34*89c4ff92SAndroid Build Coastguard Worker local extra_cxx_flags="extra_cxx_flags='-fPIC'" 35*89c4ff92SAndroid Build Coastguard Worker 36*89c4ff92SAndroid Build Coastguard Worker local compile_flags="" 37*89c4ff92SAndroid Build Coastguard Worker local acl_arch="" 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker case "$TARGET_ARCH" in 40*89c4ff92SAndroid Build Coastguard Worker "aarch64") 41*89c4ff92SAndroid Build Coastguard Worker compile_flags+="$AARCH64_COMPILER_FLAGS" 42*89c4ff92SAndroid Build Coastguard Worker acl_arch="arch=arm64-v8a" 43*89c4ff92SAndroid Build Coastguard Worker ;; 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker "x86_64") 46*89c4ff92SAndroid Build Coastguard Worker acl_arch="arch=x86_64" 47*89c4ff92SAndroid Build Coastguard Worker ;; 48*89c4ff92SAndroid Build Coastguard Worker esac 49*89c4ff92SAndroid Build Coastguard Worker 50*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Building ACL for $TARGET_ARCH *****" 51*89c4ff92SAndroid Build Coastguard Worker 52*89c4ff92SAndroid Build Coastguard Worker if [ "$flag_clean" -eq 1 ]; then 53*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Clean flag detected: removing existing ACL build *****" 54*89c4ff92SAndroid Build Coastguard Worker rm -rf "$ACL_BUILD_TARGET" 55*89c4ff92SAndroid Build Coastguard Worker fi 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker mkdir -p "$ACL_BUILD_TARGET" 58*89c4ff92SAndroid Build Coastguard Worker 59*89c4ff92SAndroid Build Coastguard Worker eval "$compile_flags" \ 60*89c4ff92SAndroid Build Coastguard Worker scons "$native_flag" \ 61*89c4ff92SAndroid Build Coastguard Worker "$acl_arch" \ 62*89c4ff92SAndroid Build Coastguard Worker "$acl_params" \ 63*89c4ff92SAndroid Build Coastguard Worker build_dir="$ACL_BUILD_TARGET" \ 64*89c4ff92SAndroid Build Coastguard Worker "$extra_cxx_flags" \ 65*89c4ff92SAndroid Build Coastguard Worker -j "$NUM_THREADS" 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Built ACL for $TARGET_ARCH *****" 68*89c4ff92SAndroid Build Coastguard Worker 69*89c4ff92SAndroid Build Coastguard Worker return 0 70*89c4ff92SAndroid Build Coastguard Worker} 71*89c4ff92SAndroid Build Coastguard Worker 72*89c4ff92SAndroid Build Coastguard Workerbuild_armnn() 73*89c4ff92SAndroid Build Coastguard Worker{ 74*89c4ff92SAndroid Build Coastguard Worker mkdir -p "$ARMNN_BUILD_TARGET" 75*89c4ff92SAndroid Build Coastguard Worker cd "$ARMNN_BUILD_TARGET" 76*89c4ff92SAndroid Build Coastguard Worker 77*89c4ff92SAndroid Build Coastguard Worker local build_type="Release" 78*89c4ff92SAndroid Build Coastguard Worker if [ "$flag_debug" -eq 1 ]; then 79*89c4ff92SAndroid Build Coastguard Worker build_type="Debug" 80*89c4ff92SAndroid Build Coastguard Worker fi 81*89c4ff92SAndroid Build Coastguard Worker 82*89c4ff92SAndroid Build Coastguard Worker local compile_flags="" 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker case "$TARGET_ARCH" in 85*89c4ff92SAndroid Build Coastguard Worker "aarch64") 86*89c4ff92SAndroid Build Coastguard Worker compile_flags+="$AARCH64_COMPILER_FLAGS" 87*89c4ff92SAndroid Build Coastguard Worker ;; 88*89c4ff92SAndroid Build Coastguard Worker esac 89*89c4ff92SAndroid Build Coastguard Worker 90*89c4ff92SAndroid Build Coastguard Worker if [ "$flag_clean" -eq 1 ]; then 91*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Clean flag detected: removing existing Arm NN build *****" 92*89c4ff92SAndroid Build Coastguard Worker rm -rf "$ARMNN_BUILD_TARGET" 93*89c4ff92SAndroid Build Coastguard Worker fi 94*89c4ff92SAndroid Build Coastguard Worker 95*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Building Arm NN for $TARGET_ARCH *****" 96*89c4ff92SAndroid Build Coastguard Worker 97*89c4ff92SAndroid Build Coastguard Worker eval "$compile_flags" \ 98*89c4ff92SAndroid Build Coastguard Worker cmake -DCMAKE_BUILD_TYPE="$build_type" \ 99*89c4ff92SAndroid Build Coastguard Worker -DBUILD_CLASSIC_DELEGATE="$flag_tflite_delegate" \ 100*89c4ff92SAndroid Build Coastguard Worker -DBUILD_TF_LITE_PARSER="$flag_tflite_parser" \ 101*89c4ff92SAndroid Build Coastguard Worker -DBUILD_ONNX_PARSER="$flag_onnx_parser" \ 102*89c4ff92SAndroid Build Coastguard Worker -DARMCOMPUTENEON="$flag_neon_backend" \ 103*89c4ff92SAndroid Build Coastguard Worker -DARMCOMPUTECL="$flag_cl_backend" \ 104*89c4ff92SAndroid Build Coastguard Worker -DARMNNREF="$flag_ref_backend" \ 105*89c4ff92SAndroid Build Coastguard Worker -DARMCOMPUTE_ROOT="$ACL_SRC" \ 106*89c4ff92SAndroid Build Coastguard Worker -DARMCOMPUTE_BUILD_DIR="$ACL_BUILD_TARGET" \ 107*89c4ff92SAndroid Build Coastguard Worker -DTENSORFLOW_ROOT="$TENSORFLOW_SRC" \ 108*89c4ff92SAndroid Build Coastguard Worker -DTF_LITE_SCHEMA_INCLUDE_PATH="$TFLITE_BUILD_ROOT" \ 109*89c4ff92SAndroid Build Coastguard Worker -DTFLITE_LIB_ROOT="$TFLITE_BUILD_TARGET" \ 110*89c4ff92SAndroid Build Coastguard Worker -DFLATBUFFERS_ROOT="$FLATBUFFERS_BUILD_TARGET" \ 111*89c4ff92SAndroid Build Coastguard Worker -DFLATC_DIR="$FLATBUFFERS_BUILD_HOST" \ 112*89c4ff92SAndroid Build Coastguard Worker -DONNX_GENERATED_SOURCES="$ONNX_BUILD_TARGET" \ 113*89c4ff92SAndroid Build Coastguard Worker -DPROTOBUF_ROOT="$PROTOBUF_BUILD_HOST" \ 114*89c4ff92SAndroid Build Coastguard Worker -DPROTOBUF_LIBRARY_DEBUG="$PROTOBUF_LIBRARY_TARGET" \ 115*89c4ff92SAndroid Build Coastguard Worker -DPROTOBUF_LIBRARY_RELEASE="$PROTOBUF_LIBRARY_TARGET" \ 116*89c4ff92SAndroid Build Coastguard Worker "$armnn_cmake_args" \ 117*89c4ff92SAndroid Build Coastguard Worker "$ARMNN_SRC" 118*89c4ff92SAndroid Build Coastguard Worker 119*89c4ff92SAndroid Build Coastguard Worker make -j "$NUM_THREADS" 120*89c4ff92SAndroid Build Coastguard Worker 121*89c4ff92SAndroid Build Coastguard Worker # Copy protobuf library into Arm NN build directory, if ONNX Parser is enabled 122*89c4ff92SAndroid Build Coastguard Worker if [ "$flag_onnx_parser" -eq 1 ]; then 123*89c4ff92SAndroid Build Coastguard Worker cd "$ARMNN_BUILD_TARGET" 124*89c4ff92SAndroid Build Coastguard Worker rm -f libprotobuf.so libprotobuf.so.23 libprotobuf.so.23.0.0 125*89c4ff92SAndroid Build Coastguard Worker cp "$PROTOBUF_LIBRARY_TARGET" . 126*89c4ff92SAndroid Build Coastguard Worker ln -s libprotobuf.so.23.0.0 ./libprotobuf.so.23 127*89c4ff92SAndroid Build Coastguard Worker ln -s libprotobuf.so.23.0.0 ./libprotobuf.so 128*89c4ff92SAndroid Build Coastguard Worker fi 129*89c4ff92SAndroid Build Coastguard Worker 130*89c4ff92SAndroid Build Coastguard Worker # Copy Arm NN include directory into build output 131*89c4ff92SAndroid Build Coastguard Worker cd "$ARMNN_BUILD_TARGET" 132*89c4ff92SAndroid Build Coastguard Worker rm -rf include 133*89c4ff92SAndroid Build Coastguard Worker cp -r "$SOURCE_DIR"/armnn/include . 134*89c4ff92SAndroid Build Coastguard Worker 135*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Built Arm NN for $TARGET_ARCH *****" 136*89c4ff92SAndroid Build Coastguard Worker 137*89c4ff92SAndroid Build Coastguard Worker local tarball_path="$ROOT_DIR/armnn_$ARMNN_BUILD_DIR_NAME.tar.gz" 138*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Creating tarball of Arm NN build at $tarball_path *****" 139*89c4ff92SAndroid Build Coastguard Worker 140*89c4ff92SAndroid Build Coastguard Worker cd "$ARMNN_BUILD_ROOT" 141*89c4ff92SAndroid Build Coastguard Worker rm -f "$tarball_path" 142*89c4ff92SAndroid Build Coastguard Worker tar -czf "$tarball_path" "$ARMNN_BUILD_DIR_NAME" 143*89c4ff92SAndroid Build Coastguard Worker 144*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Created tarball of Arm NN build at $ROOT_DIR/armnn_$ARMNN_BUILD_DIR_NAME.tar.gz *****" 145*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** To extract tarball, run: tar -xzf armnn_$ARMNN_BUILD_DIR_NAME.tar.gz *****\n" 146*89c4ff92SAndroid Build Coastguard Worker 147*89c4ff92SAndroid Build Coastguard Worker return 0 148*89c4ff92SAndroid Build Coastguard Worker} 149*89c4ff92SAndroid Build Coastguard Worker 150*89c4ff92SAndroid Build Coastguard Workerdownload_armnn() 151*89c4ff92SAndroid Build Coastguard Worker{ 152*89c4ff92SAndroid Build Coastguard Worker cd "$SOURCE_DIR" 153*89c4ff92SAndroid Build Coastguard Worker 154*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Downloading Arm NN *****" 155*89c4ff92SAndroid Build Coastguard Worker 156*89c4ff92SAndroid Build Coastguard Worker rm -rf "$ARMNN_SRC" 157*89c4ff92SAndroid Build Coastguard Worker 158*89c4ff92SAndroid Build Coastguard Worker # Latest release branch of Arm NN is checked out by default 159*89c4ff92SAndroid Build Coastguard Worker git clone https://github.com/ARM-software/armnn.git armnn 160*89c4ff92SAndroid Build Coastguard Worker 161*89c4ff92SAndroid Build Coastguard Worker cd "$ARMNN_SRC" 162*89c4ff92SAndroid Build Coastguard Worker local armnn_branch="$(git rev-parse --abbrev-ref HEAD)" 163*89c4ff92SAndroid Build Coastguard Worker 164*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Arm NN Downloaded: $armnn_branch *****" 165*89c4ff92SAndroid Build Coastguard Worker} 166*89c4ff92SAndroid Build Coastguard Worker 167*89c4ff92SAndroid Build Coastguard Workerdownload_acl() 168*89c4ff92SAndroid Build Coastguard Worker{ 169*89c4ff92SAndroid Build Coastguard Worker # First get Arm NN branch so that we can download corresponding ACL tag 170*89c4ff92SAndroid Build Coastguard Worker cd "$ARMNN_SRC" 171*89c4ff92SAndroid Build Coastguard Worker local armnn_branch="$(git rev-parse --abbrev-ref HEAD)" 172*89c4ff92SAndroid Build Coastguard Worker 173*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Downloading corresponding ACL version using Arm NN branch: $armnn_branch *****" 174*89c4ff92SAndroid Build Coastguard Worker 175*89c4ff92SAndroid Build Coastguard Worker cd "$SOURCE_DIR" 176*89c4ff92SAndroid Build Coastguard Worker 177*89c4ff92SAndroid Build Coastguard Worker rm -rf "$ACL_SRC" 178*89c4ff92SAndroid Build Coastguard Worker 179*89c4ff92SAndroid Build Coastguard Worker git clone https://github.com/ARM-software/ComputeLibrary.git acl 180*89c4ff92SAndroid Build Coastguard Worker 181*89c4ff92SAndroid Build Coastguard Worker # Get corresponding release tag for ACL by parsing release branch number for Arm NN 182*89c4ff92SAndroid Build Coastguard Worker local acl_tag="" 183*89c4ff92SAndroid Build Coastguard Worker acl_tag="$(echo "$armnn_branch" | tr '\n' ' ' | sed -e 's/[^0-9]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' | sed 's/ /./g')" 184*89c4ff92SAndroid Build Coastguard Worker 185*89c4ff92SAndroid Build Coastguard Worker cd "$ACL_SRC" 186*89c4ff92SAndroid Build Coastguard Worker git checkout v"$acl_tag" 187*89c4ff92SAndroid Build Coastguard Worker 188*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** ACL Downloaded: $acl_tag *****" 189*89c4ff92SAndroid Build Coastguard Worker} 190*89c4ff92SAndroid Build Coastguard Worker 191*89c4ff92SAndroid Build Coastguard Workerusage() 192*89c4ff92SAndroid Build Coastguard Worker{ 193*89c4ff92SAndroid Build Coastguard Worker cat <<EOF 194*89c4ff92SAndroid Build Coastguard Workerbuild-armnn.sh - Build Arm NN and ACL 195*89c4ff92SAndroid Build Coastguard Workerbuild-armnn.sh [OPTION]... 196*89c4ff92SAndroid Build Coastguard Worker --tflite-delegate 197*89c4ff92SAndroid Build Coastguard Worker build the Arm NN TF Lite Delegate component 198*89c4ff92SAndroid Build Coastguard Worker --tflite-parser 199*89c4ff92SAndroid Build Coastguard Worker build the Arm NN TF Lite Parser component 200*89c4ff92SAndroid Build Coastguard Worker --onnx-parser 201*89c4ff92SAndroid Build Coastguard Worker build the Arm NN ONNX parser component 202*89c4ff92SAndroid Build Coastguard Worker --all 203*89c4ff92SAndroid Build Coastguard Worker build all Arm NN components listed above 204*89c4ff92SAndroid Build Coastguard Worker --target-arch=[aarch64|x86_64] 205*89c4ff92SAndroid Build Coastguard Worker specify a target architecture (mandatory) 206*89c4ff92SAndroid Build Coastguard Worker --neon-backend 207*89c4ff92SAndroid Build Coastguard Worker build Arm NN with the NEON backend (CPU acceleration from ACL) 208*89c4ff92SAndroid Build Coastguard Worker --cl-backend 209*89c4ff92SAndroid Build Coastguard Worker build Arm NN with the OpenCL backend (GPU acceleration from ACL) 210*89c4ff92SAndroid Build Coastguard Worker --ref-backend 211*89c4ff92SAndroid Build Coastguard Worker build Arm NN with the reference backend (Should be used for verification purposes only. Does not provide any performance acceleration.) 212*89c4ff92SAndroid Build Coastguard Worker --clean 213*89c4ff92SAndroid Build Coastguard Worker remove previous Arm NN and ACL build prior to script execution (optional: defaults to off) 214*89c4ff92SAndroid Build Coastguard Worker --debug 215*89c4ff92SAndroid Build Coastguard Worker build Arm NN (and ACL) with debug turned on (optional: defaults to off) 216*89c4ff92SAndroid Build Coastguard Worker --armnn-cmake-args=<ARG LIST STRING> 217*89c4ff92SAndroid Build Coastguard Worker provide additional comma-separated CMake arguments string for building Arm NN (optional) 218*89c4ff92SAndroid Build Coastguard Worker --acl-scons-params=<PARAM LIST STRING> 219*89c4ff92SAndroid Build Coastguard Worker provide additional comma-separated scons parameters string for building ACL (optional) 220*89c4ff92SAndroid Build Coastguard Worker --num-threads=<INTEGER> 221*89c4ff92SAndroid Build Coastguard Worker specify number of threads/cores to build dependencies with (optional: defaults to number of online CPU cores on host) 222*89c4ff92SAndroid Build Coastguard Worker -h, --help 223*89c4ff92SAndroid Build Coastguard Worker print brief usage information and exit 224*89c4ff92SAndroid Build Coastguard Worker -x 225*89c4ff92SAndroid Build Coastguard Worker enable shell tracing in this script 226*89c4ff92SAndroid Build Coastguard Worker 227*89c4ff92SAndroid Build Coastguard WorkerAt least one component (i.e. --tflite-delegate, --tflite-parser, --onnx-parser) must be provided or else provide --all to build all Arm NN components. 228*89c4ff92SAndroid Build Coastguard WorkerAt least one backend (i.e. --neon-backend, --cl-backend, --ref-backend) must be chosen. 229*89c4ff92SAndroid Build Coastguard WorkerThis script must be executed from the same root directory in which setup-armnn.sh was executed from. 230*89c4ff92SAndroid Build Coastguard Worker 231*89c4ff92SAndroid Build Coastguard WorkerThe first execution of this script will download the latest release branches of Arm NN and ACL, by default. 232*89c4ff92SAndroid Build Coastguard WorkerAlternatively, place custom/modified repositories named "armnn" and (optionally) "acl" in <ROOT_DIR>/source. 233*89c4ff92SAndroid Build Coastguard WorkerProviding custom "acl" repo is optional since it is only required if backend flags --neon-backend or --cl-backend are chosen. 234*89c4ff92SAndroid Build Coastguard Worker 235*89c4ff92SAndroid Build Coastguard WorkerBy default, a tarball tar.gz archive of the Arm NN build will be created in the directory from which this script is called from. 236*89c4ff92SAndroid Build Coastguard Worker 237*89c4ff92SAndroid Build Coastguard WorkerExamples: 238*89c4ff92SAndroid Build Coastguard WorkerBuild for aarch64 with all Arm NN components, NEON enabled and OpenCL enabled: 239*89c4ff92SAndroid Build Coastguard Worker <PATH_TO>/build-armnn.sh --target-arch=aarch64 --all --neon-backend --cl-backend 240*89c4ff92SAndroid Build Coastguard WorkerBuild for aarch64 with TF Lite Delegate, OpenCL enabled and additional ACL scons params: 241*89c4ff92SAndroid Build Coastguard Worker <PATH_TO>/build-armnn.sh --target-arch=aarch64 --tflite-delegate --cl-backend --acl-scons-params='compress_kernels=1,benchmark_examples=1' 242*89c4ff92SAndroid Build Coastguard WorkerSetup for aarch64 with all Arm NN dependencies, OpenCL enabled and additional Arm NN cmake args: 243*89c4ff92SAndroid Build Coastguard Worker <PATH_TO>/build-armnn.sh --target-arch=aarch64 --all --cl-backend --armnn-cmake-args='-DBUILD_SAMPLE_APP=1,-DBUILD_UNIT_TESTS=0' 244*89c4ff92SAndroid Build Coastguard WorkerEOF 245*89c4ff92SAndroid Build Coastguard Worker} 246*89c4ff92SAndroid Build Coastguard Worker 247*89c4ff92SAndroid Build Coastguard Worker# This will catch in validation.sh if not set 248*89c4ff92SAndroid Build Coastguard Workertarget_arch="" 249*89c4ff92SAndroid Build Coastguard Worker 250*89c4ff92SAndroid Build Coastguard Worker# Default flag values 251*89c4ff92SAndroid Build Coastguard Workerflag_tflite_delegate=0 252*89c4ff92SAndroid Build Coastguard Workerflag_tflite_parser=0 253*89c4ff92SAndroid Build Coastguard Workerflag_onnx_parser=0 254*89c4ff92SAndroid Build Coastguard Workerflag_neon_backend=0 255*89c4ff92SAndroid Build Coastguard Workerflag_cl_backend=0 256*89c4ff92SAndroid Build Coastguard Workerflag_ref_backend=0 257*89c4ff92SAndroid Build Coastguard Workerflag_clean=0 258*89c4ff92SAndroid Build Coastguard Workerflag_debug=0 259*89c4ff92SAndroid Build Coastguard Worker 260*89c4ff92SAndroid Build Coastguard Worker# Empty strings for optional additional args by default 261*89c4ff92SAndroid Build Coastguard Workerarmnn_cmake_args="" 262*89c4ff92SAndroid Build Coastguard Workeracl_scons_params="" 263*89c4ff92SAndroid Build Coastguard Worker 264*89c4ff92SAndroid Build Coastguard Worker# If --num-threads is not set, the default NUM_THREADS value in common.sh will be used 265*89c4ff92SAndroid Build Coastguard Workernum_threads=0 266*89c4ff92SAndroid Build Coastguard Worker 267*89c4ff92SAndroid Build Coastguard Workername=$(basename "$0") 268*89c4ff92SAndroid Build Coastguard Worker 269*89c4ff92SAndroid Build Coastguard Worker# If no options provided, show help 270*89c4ff92SAndroid Build Coastguard Workerif [ $# -eq 0 ]; then 271*89c4ff92SAndroid Build Coastguard Worker usage 272*89c4ff92SAndroid Build Coastguard Worker exit 1 273*89c4ff92SAndroid Build Coastguard Workerfi 274*89c4ff92SAndroid Build Coastguard Worker 275*89c4ff92SAndroid Build Coastguard Workerargs=$(getopt -ohx -l tflite-delegate,tflite-parser,onnx-parser,all,target-arch:,neon-backend,cl-backend,ref-backend,clean,debug,armnn-cmake-args:,acl-scons-params:,num-threads:,help -n "$name" -- "$@") 276*89c4ff92SAndroid Build Coastguard Workereval set -- "$args" 277*89c4ff92SAndroid Build Coastguard Workerwhile [ $# -gt 0 ]; do 278*89c4ff92SAndroid Build Coastguard Worker if [ -n "${opt_prev:-}" ]; then 279*89c4ff92SAndroid Build Coastguard Worker eval "$opt_prev=\$1" 280*89c4ff92SAndroid Build Coastguard Worker opt_prev= 281*89c4ff92SAndroid Build Coastguard Worker shift 1 282*89c4ff92SAndroid Build Coastguard Worker continue 283*89c4ff92SAndroid Build Coastguard Worker elif [ -n "${opt_append:-}" ]; then 284*89c4ff92SAndroid Build Coastguard Worker if [ -n "$1" ]; then 285*89c4ff92SAndroid Build Coastguard Worker eval "$opt_append=\"\${$opt_append:-} \$1\"" 286*89c4ff92SAndroid Build Coastguard Worker fi 287*89c4ff92SAndroid Build Coastguard Worker opt_append= 288*89c4ff92SAndroid Build Coastguard Worker shift 1 289*89c4ff92SAndroid Build Coastguard Worker continue 290*89c4ff92SAndroid Build Coastguard Worker fi 291*89c4ff92SAndroid Build Coastguard Worker case $1 in 292*89c4ff92SAndroid Build Coastguard Worker --tflite-parser) 293*89c4ff92SAndroid Build Coastguard Worker flag_tflite_parser=1 294*89c4ff92SAndroid Build Coastguard Worker ;; 295*89c4ff92SAndroid Build Coastguard Worker 296*89c4ff92SAndroid Build Coastguard Worker --tflite-delegate) 297*89c4ff92SAndroid Build Coastguard Worker flag_tflite_delegate=1 298*89c4ff92SAndroid Build Coastguard Worker ;; 299*89c4ff92SAndroid Build Coastguard Worker 300*89c4ff92SAndroid Build Coastguard Worker --onnx-parser) 301*89c4ff92SAndroid Build Coastguard Worker flag_onnx_parser=1 302*89c4ff92SAndroid Build Coastguard Worker ;; 303*89c4ff92SAndroid Build Coastguard Worker 304*89c4ff92SAndroid Build Coastguard Worker --all) 305*89c4ff92SAndroid Build Coastguard Worker flag_tflite_delegate=1 306*89c4ff92SAndroid Build Coastguard Worker flag_tflite_parser=1 307*89c4ff92SAndroid Build Coastguard Worker flag_onnx_parser=1 308*89c4ff92SAndroid Build Coastguard Worker ;; 309*89c4ff92SAndroid Build Coastguard Worker 310*89c4ff92SAndroid Build Coastguard Worker --target-arch) 311*89c4ff92SAndroid Build Coastguard Worker opt_prev=target_arch 312*89c4ff92SAndroid Build Coastguard Worker ;; 313*89c4ff92SAndroid Build Coastguard Worker 314*89c4ff92SAndroid Build Coastguard Worker --neon-backend) 315*89c4ff92SAndroid Build Coastguard Worker flag_neon_backend=1 316*89c4ff92SAndroid Build Coastguard Worker ;; 317*89c4ff92SAndroid Build Coastguard Worker 318*89c4ff92SAndroid Build Coastguard Worker --cl-backend) 319*89c4ff92SAndroid Build Coastguard Worker flag_cl_backend=1 320*89c4ff92SAndroid Build Coastguard Worker ;; 321*89c4ff92SAndroid Build Coastguard Worker 322*89c4ff92SAndroid Build Coastguard Worker --ref-backend) 323*89c4ff92SAndroid Build Coastguard Worker flag_ref_backend=1 324*89c4ff92SAndroid Build Coastguard Worker ;; 325*89c4ff92SAndroid Build Coastguard Worker 326*89c4ff92SAndroid Build Coastguard Worker --clean) 327*89c4ff92SAndroid Build Coastguard Worker flag_clean=1 328*89c4ff92SAndroid Build Coastguard Worker ;; 329*89c4ff92SAndroid Build Coastguard Worker 330*89c4ff92SAndroid Build Coastguard Worker --debug) 331*89c4ff92SAndroid Build Coastguard Worker flag_debug=1 332*89c4ff92SAndroid Build Coastguard Worker ;; 333*89c4ff92SAndroid Build Coastguard Worker 334*89c4ff92SAndroid Build Coastguard Worker --armnn-cmake-args) 335*89c4ff92SAndroid Build Coastguard Worker opt_prev=armnn_cmake_args 336*89c4ff92SAndroid Build Coastguard Worker ;; 337*89c4ff92SAndroid Build Coastguard Worker 338*89c4ff92SAndroid Build Coastguard Worker --acl-scons-params) 339*89c4ff92SAndroid Build Coastguard Worker opt_prev=acl_scons_params 340*89c4ff92SAndroid Build Coastguard Worker ;; 341*89c4ff92SAndroid Build Coastguard Worker 342*89c4ff92SAndroid Build Coastguard Worker --num-threads) 343*89c4ff92SAndroid Build Coastguard Worker opt_prev=num_threads 344*89c4ff92SAndroid Build Coastguard Worker ;; 345*89c4ff92SAndroid Build Coastguard Worker 346*89c4ff92SAndroid Build Coastguard Worker -h | --help) 347*89c4ff92SAndroid Build Coastguard Worker usage 348*89c4ff92SAndroid Build Coastguard Worker exit 0 349*89c4ff92SAndroid Build Coastguard Worker ;; 350*89c4ff92SAndroid Build Coastguard Worker 351*89c4ff92SAndroid Build Coastguard Worker -x) 352*89c4ff92SAndroid Build Coastguard Worker set -x 353*89c4ff92SAndroid Build Coastguard Worker ;; 354*89c4ff92SAndroid Build Coastguard Worker 355*89c4ff92SAndroid Build Coastguard Worker --) 356*89c4ff92SAndroid Build Coastguard Worker shift 357*89c4ff92SAndroid Build Coastguard Worker break 2 358*89c4ff92SAndroid Build Coastguard Worker ;; 359*89c4ff92SAndroid Build Coastguard Worker 360*89c4ff92SAndroid Build Coastguard Worker esac 361*89c4ff92SAndroid Build Coastguard Worker shift 1 362*89c4ff92SAndroid Build Coastguard Workerdone 363*89c4ff92SAndroid Build Coastguard Worker 364*89c4ff92SAndroid Build Coastguard Worker# shellcheck source=common.sh 365*89c4ff92SAndroid Build Coastguard Workersource "$rel_path"/common.sh 366*89c4ff92SAndroid Build Coastguard Worker 367*89c4ff92SAndroid Build Coastguard Worker# Validation of chosen Arm NN backends 368*89c4ff92SAndroid Build Coastguard Workerif [ "$flag_neon_backend" -eq 0 ] && [ "$flag_cl_backend" -eq 0 ] && [ "$flag_ref_backend" -eq 0 ]; then 369*89c4ff92SAndroid Build Coastguard Worker echo -e "\n$name: at least one of flags --neon-backend, --cl-backend or --ref-backend must be set." 370*89c4ff92SAndroid Build Coastguard Worker exit 1 371*89c4ff92SAndroid Build Coastguard Workerfi 372*89c4ff92SAndroid Build Coastguard Worker 373*89c4ff92SAndroid Build Coastguard Workerif [ "$target_arch" == "x86_64" ]; then 374*89c4ff92SAndroid Build Coastguard Worker if [ "$flag_neon_backend" -eq 1 ] || [ "$flag_cl_backend" -eq 1 ]; then 375*89c4ff92SAndroid Build Coastguard Worker echo "$name: Accelerated backends --neon-backend and --cl-backend are supported on Arm targets only (x86_64 chosen)." 376*89c4ff92SAndroid Build Coastguard Worker exit 1 377*89c4ff92SAndroid Build Coastguard Worker fi 378*89c4ff92SAndroid Build Coastguard Workerfi 379*89c4ff92SAndroid Build Coastguard Worker 380*89c4ff92SAndroid Build Coastguard Worker# Verify that root source and build directories are present (post execution of setup-armnn.sh) 381*89c4ff92SAndroid Build Coastguard Workerif [ ! -d "$SOURCE_DIR" ]; then 382*89c4ff92SAndroid Build Coastguard Worker echo -e "\nERROR: Root source directory does not exist at $SOURCE_DIR" 383*89c4ff92SAndroid Build Coastguard Worker echo "Please check that:" 384*89c4ff92SAndroid Build Coastguard Worker echo "1. setup-armnn.sh was executed successfully prior to running this script" 385*89c4ff92SAndroid Build Coastguard Worker echo "2. This script is being executed in the same directory as setup-armnn.sh" 386*89c4ff92SAndroid Build Coastguard Worker 387*89c4ff92SAndroid Build Coastguard Worker exit 1 388*89c4ff92SAndroid Build Coastguard Workerfi 389*89c4ff92SAndroid Build Coastguard Worker 390*89c4ff92SAndroid Build Coastguard Workerif [ ! -d "$BUILD_DIR" ]; then 391*89c4ff92SAndroid Build Coastguard Worker echo -e "\nERROR: Root build directory does not exist at $BUILD_DIR" 392*89c4ff92SAndroid Build Coastguard Worker echo "Please check that:" 393*89c4ff92SAndroid Build Coastguard Worker echo "1. setup-armnn.sh was executed successfully prior to running this script" 394*89c4ff92SAndroid Build Coastguard Worker echo "2. This script is being executed in the same directory as setup-armnn.sh" 395*89c4ff92SAndroid Build Coastguard Worker 396*89c4ff92SAndroid Build Coastguard Worker exit 1 397*89c4ff92SAndroid Build Coastguard Workerfi 398*89c4ff92SAndroid Build Coastguard Worker 399*89c4ff92SAndroid Build Coastguard Worker# Download Arm NN if not done already in a previous execution of this script 400*89c4ff92SAndroid Build Coastguard Worker# Check if Arm NN source directory exists AND that it is a repository (not empty) 401*89c4ff92SAndroid Build Coastguard Workerif [ -d "$ARMNN_SRC" ] && check_if_repository "$ARMNN_SRC"; then 402*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Arm NN source repository already located at $ARMNN_SRC. Skipping cloning of Arm NN. *****" 403*89c4ff92SAndroid Build Coastguard Workerelse 404*89c4ff92SAndroid Build Coastguard Worker # Download latest release branch of Arm NN 405*89c4ff92SAndroid Build Coastguard Worker download_armnn 406*89c4ff92SAndroid Build Coastguard Workerfi 407*89c4ff92SAndroid Build Coastguard Worker 408*89c4ff92SAndroid Build Coastguard Worker# Download ACL if not done already in a previous execution of this script 409*89c4ff92SAndroid Build Coastguard Worker# Only download ACL if backend options --neon-backend and --cl-backend are chosen 410*89c4ff92SAndroid Build Coastguard Workerif [ "$flag_neon_backend" -eq 1 ] || [ "$flag_cl_backend" -eq 1 ]; then 411*89c4ff92SAndroid Build Coastguard Worker # Check if Arm NN source directory exists AND that it is a repository (not empty) 412*89c4ff92SAndroid Build Coastguard Worker if [ -d "$ACL_SRC" ] && check_if_repository "$ACL_SRC"; then 413*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** ACL source repository already located at $ACL_SRC. Skipping cloning of ACL. *****" 414*89c4ff92SAndroid Build Coastguard Worker else 415*89c4ff92SAndroid Build Coastguard Worker # Download latest release branch of ACL 416*89c4ff92SAndroid Build Coastguard Worker download_acl 417*89c4ff92SAndroid Build Coastguard Worker fi 418*89c4ff92SAndroid Build Coastguard Workerelse 419*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Backend options --neon-backend and --cl-backend not selected - skipping cloning of ACL *****" 420*89c4ff92SAndroid Build Coastguard Workerfi 421*89c4ff92SAndroid Build Coastguard Worker 422*89c4ff92SAndroid Build Coastguard Worker# Adjust output build directory names for Arm NN and ACL if debug is enabled 423*89c4ff92SAndroid Build Coastguard WorkerDEBUG_POSTFIX="" 424*89c4ff92SAndroid Build Coastguard Workerif [ "$flag_debug" -eq 1 ]; then 425*89c4ff92SAndroid Build Coastguard Worker DEBUG_POSTFIX="_debug" 426*89c4ff92SAndroid Build Coastguard Workerfi 427*89c4ff92SAndroid Build Coastguard Worker 428*89c4ff92SAndroid Build Coastguard Worker# Replace commas with spaces in additional Arm NN / ACL build args 429*89c4ff92SAndroid Build Coastguard Worker# shellcheck disable=SC2001 430*89c4ff92SAndroid Build Coastguard Workerarmnn_cmake_args="$(echo "$armnn_cmake_args" | sed 's/,/ /g')" 431*89c4ff92SAndroid Build Coastguard Worker 432*89c4ff92SAndroid Build Coastguard Worker# shellcheck disable=SC2001 433*89c4ff92SAndroid Build Coastguard Workeracl_scons_params="$(echo "$acl_scons_params" | sed 's/,/ /g')" 434*89c4ff92SAndroid Build Coastguard Worker 435*89c4ff92SAndroid Build Coastguard Worker# Directories for Arm NN and ACL build outputs 436*89c4ff92SAndroid Build Coastguard WorkerARMNN_BUILD_ROOT="$BUILD_DIR"/armnn 437*89c4ff92SAndroid Build Coastguard WorkerARMNN_BUILD_DIR_NAME="$TARGET_ARCH"_build"$DEBUG_POSTFIX" 438*89c4ff92SAndroid Build Coastguard WorkerARMNN_BUILD_TARGET="$ARMNN_BUILD_ROOT"/"$ARMNN_BUILD_DIR_NAME" 439*89c4ff92SAndroid Build Coastguard WorkerACL_BUILD_TARGET="$BUILD_DIR"/acl/"$TARGET_ARCH"_build"$DEBUG_POSTFIX" 440*89c4ff92SAndroid Build Coastguard Worker 441*89c4ff92SAndroid Build Coastguard Workerecho -e "\nINFO: Displaying configuration information before execution of $name" 442*89c4ff92SAndroid Build Coastguard Workerecho " target-arch: $TARGET_ARCH" 443*89c4ff92SAndroid Build Coastguard Workerecho " host-arch: $HOST_ARCH" 444*89c4ff92SAndroid Build Coastguard Workerecho " tflite-delegate: $flag_tflite_delegate" 445*89c4ff92SAndroid Build Coastguard Workerecho " tflite-parser: $flag_tflite_parser" 446*89c4ff92SAndroid Build Coastguard Workerecho " onnx-parser: $flag_onnx_parser" 447*89c4ff92SAndroid Build Coastguard Workerecho " neon-backend: $flag_neon_backend" 448*89c4ff92SAndroid Build Coastguard Workerecho " cl-backend: $flag_cl_backend" 449*89c4ff92SAndroid Build Coastguard Workerecho " ref-backend: $flag_ref_backend" 450*89c4ff92SAndroid Build Coastguard Workerecho " clean: $flag_clean" 451*89c4ff92SAndroid Build Coastguard Workerecho " debug: $flag_debug" 452*89c4ff92SAndroid Build Coastguard Workerecho "armnn-cmake-args: $armnn_cmake_args" 453*89c4ff92SAndroid Build Coastguard Workerecho "acl-scons-params: $acl_scons_params" 454*89c4ff92SAndroid Build Coastguard Workerecho " num-threads: $NUM_THREADS" 455*89c4ff92SAndroid Build Coastguard Workerecho " root directory: $ROOT_DIR" 456*89c4ff92SAndroid Build Coastguard Workerecho "source directory: $SOURCE_DIR" 457*89c4ff92SAndroid Build Coastguard Workerecho " build directory: $BUILD_DIR" 458*89c4ff92SAndroid Build Coastguard Workerecho " armnn build dir: $ARMNN_BUILD_TARGET" 459*89c4ff92SAndroid Build Coastguard Workerecho -e "\nScript execution will begin in 10 seconds..." 460*89c4ff92SAndroid Build Coastguard Worker 461*89c4ff92SAndroid Build Coastguard Workersleep 10 462*89c4ff92SAndroid Build Coastguard Worker 463*89c4ff92SAndroid Build Coastguard Workerif [ "$flag_neon_backend" -eq 1 ] || [ "$flag_cl_backend" -eq 1 ]; then 464*89c4ff92SAndroid Build Coastguard Worker build_acl 465*89c4ff92SAndroid Build Coastguard Workerelse 466*89c4ff92SAndroid Build Coastguard Worker echo -e "\n***** Skipping ACL build: --neon-backend and --cl-backend not set in options. *****" 467*89c4ff92SAndroid Build Coastguard Workerfi 468*89c4ff92SAndroid Build Coastguard Worker 469*89c4ff92SAndroid Build Coastguard Workerbuild_armnn 470*89c4ff92SAndroid Build Coastguard Worker 471*89c4ff92SAndroid Build Coastguard Workerexit 0 472