#### <a name="introduction">Introduction</a>
These are the step by step instructions on Cross-Compiling ArmNN under an x86_64 system to target an Arm64 system. This build flow has been tested with Ubuntu 16.04.
-The instructions show how to build the ArmNN core library and the Boost, Protobuf, Caffe and Compute Libraries necessary for compilation.
+The instructions show how to build the ArmNN core library and the Boost, Protobuf, Caffe, Tensorflow, Tflite, Flatbuffer and Compute Libraries necessary for compilation.
#### <a name="installCCT">Cross-compiling ToolChain</a>
* Install the standard cross-compilation libraries for arm64:
#### <a name="buildProtobuf">Build and install Google's Protobuf library</a>
-* Get protobuf-all-3.5.1.tar.gz from here: https://github.com/protocolbuffers/protobuf/releases/tag/v3.5.1
-* Extract:
+## We support protobuf version 3.5.2
+* Get protobuf from here: https://github.com/protocolbuffers/protobuf :
```bash
- tar -zxvf protobuf-all-3.5.1.tar.gz
- cd protobuf-3.5.1
+ git clone -b v3.5.2 https://github.com/google/protobuf.git protobuf
+ cd protobuf
+ git submodule update --init --recursive
+ ./autogen
```
* Build a native (x86_64) version of the protobuf libraries and compiler (protoc):
(Requires cUrl, autoconf, llibtool, and other build dependencies if not previously installed: sudo apt install curl autoconf libtool build-essential g++)
```
mkdir arm64_build
cd arm64_build
- CC=aarch64-linux-gnu-gcc \
- CXX=aarch64-linux-gnu-g++ \
+ export CC=aarch64-linux-gnu-gcc \
+ export CXX=aarch64-linux-gnu-g++ \
../configure --host=aarch64-linux \
--prefix=$HOME/armnn-devenv/google/arm64_pb_install \
--with-protoc=$HOME/armnn-devenv/google/x86_64_pb_install/bin/protoc
#### <a name="installBaarch">Build Boost library for arm64</a>
* Build Boost library for arm64
Download Boost version 1.64 from http://www.boost.org/doc/libs/1_64_0/more/getting_started/unix-variants.html
- Version 1.66 is not supported.
+ Using any version of Boost greater than 1.64 will fail to build ArmNN, due to different dependency issues.
```bash
tar -zxvf boost_1_64_0.tar.gz
cd boost_1_64_0
scons arch=arm64-v8a neon=1 opencl=1 embed_kernels=1 extra_cxx_flags="-fPIC" -j8 internal_only=0
```
+#### <a name="buildtf">Build Tensorflow</a>
+* Building Tensorflow version 1.15:
+ '''bash
+ git clone https://github.com/tensorflow/tensorflow.git
+ cd tensorflow/
+ git checkout 590d6eef7e91a6a7392c8ffffb7b58f2e0c8bc6b
+ ../armnn/scripts/generate_tensorflow_protobuf.sh ../tensorflow-protobuf ../google/x86_64_pb_install
+ '''
+
+#### <"a name=buildflatbuffer">Build Flatbuffer</a>
+* Building Flatbuffer version 1.10.0
+ '''bash
+ wget -O flatbuffers-1.10.0.tar.gz https://github.com/google/flatbuffers/archive/v1.10.0.tar.gz
+ tar xf flatbuffers-1.10.0.tar.gz
+ cd flatbuffers-1.10.0
+ rm -f CMakeCache.txt
+ mkdir build
+ cd build
+ cmake .. -DFLATBUFFERS_BUILD_FLATC=1 \
+ -DCMAKE_INSTALL_PREFIX:PATH=$<DIRECTORY_PATH> \
+ -DFLATBUFFERS_BUILD_TESTS=0
+ make all install
+ '''
+* Build arm64 version of flatbuffer
+ '''bash
+ mkdir build-arm64
+ cd build-arm64
+ cmake .. -DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc \
+ -DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++ \
+ -DFLATBUFFERS_BUILD_FLATC=1 \
+ -DCMAKE_INSTALL_PREFIX:PATH=$<DIRECTORY_PATH> \
+ -DFLATBUFFERS_BUILD_TESTS=0
+ make all install
+ '''
+
+#### <a name="buildingONNX">Build Onnx</a>
+* Building Onnx
+ '''bash
+ git clone https://github.com/onnx/onnx.git
+ cd onnx
+ git fetch https://github.com/onnx/onnx.git f612532843bd8e24efeab2815e45b436479cc9ab && git checkout FETCH_HEAD
+ export LD_LIBRARY_PATH=$<DIRECTORY_PATH>/protobuf-host/lib:$LD_LIBRARY_PATH
+ ../google/x86_64_pb_install/bin/protoc onnx/onnx.proto --proto_path=. --proto_path=../google/x86_64_pb_install/include --cpp_out ../onnx
+ '''
+
+#### <a name="buildingtflite">Build TfLite</a>
+* Building TfLite
+ '''bash
+ mkdir tflite
+ cd tflite
+ cp ../tensorflow/tensorflow/lite/schema/schema.fbs .
+ ../flatbuffers-1.10.0/build/flatc -c --gen-object-api --reflect-types --reflect-names schema.fbs
+ '''
+
#### <a name="buildANN">Build ArmNN</a>
* Compile ArmNN for arm64:
```bash
* Use CMake to configure your build environment, update the following script and run it from the armnn/build directory to set up the armNN build:
```bash
#!/bin/bash
- CXX=aarch64-linux-gnu-g++ \
- CC=aarch64-linux-gnu-gcc \
+ export CXX=aarch64-linux-gnu-g++ \
+ export CC=aarch64-linux-gnu-gcc \
cmake .. \
-DARMCOMPUTE_ROOT=$HOME/armnn-devenv/ComputeLibrary \
-DARMCOMPUTE_BUILD_DIR=$HOME/armnn-devenv/ComputeLibrary/build/ \
-DBOOST_ROOT=$HOME/armnn-devenv/boost_arm64_install/ \
- -DARMCOMPUTENEON=1 -DARMCOMPUTECL=1 -DARMCOMPUTEREF=1 \
+ -DARMCOMPUTENEON=1 -DARMCOMPUTECL=1 -DARMNNREF=1 \
-DCAFFE_GENERATED_SOURCES=$HOME/armnn-devenv/caffe/build/src \
-DBUILD_CAFFE_PARSER=1 \
+ -DONNX_GENERATED_SOURCES=$HOME/onnx \
+ -DBUILD_ONNX_PARSER=1 \
+ -DTF_GENERATED_SOURCES=$HOME/tensorflow-protobuf \
+ -DBUILD_TF_PARSER=1 \
+ -DBUILD_TF_LITE_PARSER=1 \
+ -DTF_LITE_GENERATED_PATH=$HOME/tflite \
+ -DFLATBUFFERS_ROOT=$HOME/flatbuffers-arm64 \
+ -DFLATC_DIR=$HOME/flatbuffers-1.10.0/build \
+ -DPROTOBUF_ROOT=$HOME/google/x86_64_pb_install \
-DPROTOBUF_ROOT=$HOME/armnn-devenv/google/x86_64_pb_install/ \
-DPROTOBUF_LIBRARY_DEBUG=$HOME/armnn-devenv/google/arm64_pb_install/lib/libprotobuf.so.15.0.1 \
-DPROTOBUF_LIBRARY_RELEASE=$HOME/armnn-devenv/google/arm64_pb_install/lib/libprotobuf.so.15.0.1
```
+
+* If you want to include standalone sample dynamic backend tests, add the argument to enable the tests and the dynamic backend path to the CMake command:
+ ```bash
+ -DSAMPLE_DYNAMIC_BACKEND=1 \
+ -DDYNAMIC_BACKEND_PATHS=$SAMPLE_DYNAMIC_BACKEND_PATH
+ ```
* Run the build
```bash
make -j32
```
+#### <a name="buildStandaloneBackend">Build Standalone Sample Dynamic Backend</a>
+* The sample dynamic backend is located in armnn/src/dynamic/sample
+ ```bash
+ mkdir build
+ cd build
+ ```
+
+* Use CMake to configure your build environment, update the following script and run it from the armnn/src/dynamic/sample/build directory to set up the armNN build:
+ ```bash
+ #!/bin/bash
+ export CXX=aarch64-linux-gnu-g++ \
+ export CC=aarch64-linux-gnu-gcc \
+ cmake .. \
+ -DCMAKE_CXX_FLAGS=--std=c++14 \
+ -DBOOST_ROOT=$HOME/armnn-devenv/boost_arm64_install/ \
+ -DBoost_SYSTEM_LIBRARY=$HOME/armnn-devenv/boost_arm64_install/lib/libboost_system.a \
+ -DBoost_FILESYSTEM_LIBRARY=$HOME/armnn-devenv/boost_arm64_install/lib/libboost_filesystem.a \
+ -DARMNN_PATH=$HOME/armnn-devenv/armnn/build/libarmnn.so
+ ```
+
+* Run the build
+ ```bash
+ make
+ ```
+
#### <a name="unittests">Run Unit Tests</a>
* Copy the build folder to an arm64 linux machine
* Copy the libprotobuf.so.15.0.1 library file to the build folder
+* If you enable the standalone sample dynamic tests, also copy libArm_SampleDynamic_backend.so library file to the folder specified as $SAMPLE_DYNAMIC_BACKEND_PATH when you build ArmNN
* cd to the build folder on your arm64 machine and set your LD_LIBRARY_PATH to its current location:
```
cd build/
libarmnnCaffeParser.so: undefined reference to `google::protobuf:*
```
* Missing or out of date protobuf compilation libraries.
- Use the command 'protoc --version' to check which version of protobuf is available (version 3.5.1 is required).
- Follow the instructions above to install protobuf 3.5.1
+ Use the command 'protoc --version' to check which version of protobuf is available (version 3.5.2 is required).
+ Follow the instructions above to install protobuf 3.5.2
Note this will require you to recompile Caffe for x86_64
##