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