GitHub #644 fails to build with flatbuffers 2.0.6

 * Fixed bug where flatbuffers was downloaded every time setup.sh was run.
 * setup.sh will attempt to use the version of flatbuffers used by
   android if one is available.
 * setup.sh will now generate ArmnnSchema_generated.h where one does
   not exist

!armnn:7625

Signed-off-by: Mike Kelly <mike.kelly@arm.com>
Change-Id: I62f3be6ebfc7fbef39597295dca194d70294646c
diff --git a/Android.bp b/Android.bp
index b8826cb..f7cdadc 100644
--- a/Android.bp
+++ b/Android.bp
@@ -11,10 +11,10 @@
 cc_defaults {
     name: "libflatbuffers-defaults",
     proprietary: true,
-    export_include_dirs: [ "flatbuffers-1.12.0/",
-                           "flatbuffers-1.12.0/include",
+    export_include_dirs: [ "flatbuffers/",
+                           "flatbuffers/include",
     ],
-    local_include_dirs: ["flatbuffers-1.12.0/include",],
+    local_include_dirs: ["flatbuffers/include",],
     cflags: [
         "-O3",
         "-fexceptions",
@@ -31,8 +31,8 @@
     name: "libflatbuffers-framework",
     defaults: ["libflatbuffers-defaults"],
     srcs: [
-        "flatbuffers-1.12.0/src/flatc.cpp",
-        "flatbuffers-1.12.0/src/flatc_main.cpp",
+        "flatbuffers/src/flatc.cpp",
+        "flatbuffers/src/flatc_main.cpp",
     ],
 }
 
diff --git a/Android.mk b/Android.mk
index cab4a45..585d835 100644
--- a/Android.mk
+++ b/Android.mk
@@ -68,6 +68,7 @@
 endif
 
 # Configure these paths if you move the source or Khronos headers
+ARMNN_GENERATED_HEADER_PATH := $(LOCAL_PATH)/armnn/generated
 ARMNN_PROFILING_HEADER_PATH := $(LOCAL_PATH)/armnn/profiling
 ARMNN_COMMON_PROFILING_HEADER_PATH := $(LOCAL_PATH)/armnn/profiling/common/include
 ARMNN_CLIENT_PROFILING_HEADER_PATH := $(LOCAL_PATH)/armnn/profiling/client/include
@@ -77,7 +78,6 @@
 ARMNN_BACKEND_MAKEFILE_DIRS := $(subst /backend.mk,,$(ARMNN_BACKEND_MAKEFILE_PATHS))
 ARMNN_THIRD_PARTY_PATH := $(LOCAL_PATH)/armnn/third-party
 ARMNN_UTILS_HEADER_PATH := $(LOCAL_PATH)/armnn/src/armnnUtils
-ARMNN_THIRD_PARTY_PATH := $(LOCAL_PATH)/armnn/third-party
 OPENCL_HEADER_PATH := $(LOCAL_PATH)/clframework/include
 NN_HEADER_PATH := $(LOCAL_PATH)/../../../frameworks/ml/nn/runtime/include
 ifeq ($(S_OR_LATER),1)
@@ -152,6 +152,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
@@ -285,6 +286,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
@@ -414,6 +416,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
@@ -543,6 +546,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
@@ -678,6 +682,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
@@ -784,6 +789,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
@@ -882,6 +888,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
@@ -976,6 +983,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_C_INCLUDES := \
+        $(ARMNN_GENERATED_HEADER_PATH) \
         $(ARMNN_THIRD_PARTY_PATH) \
         $(ARMNN_PROFILING_HEADER_PATH) \
         $(ARMNN_COMMON_PROFILING_HEADER_PATH) \
diff --git a/setup.sh b/setup.sh
index bf444ca..1dc9d8c 100755
--- a/setup.sh
+++ b/setup.sh
@@ -9,18 +9,59 @@
   fi
 }
 
-if [ ! -d v1.12.0 ]; then
-  echo "++ Downloading FlatBuffers"
+BUILD_DIR=build-x86_64
+FLATBUFFERS_DIR=$PWD/flatbuffers
 
-  FLATBUFFERS_PKG=v1.12.0.tar.gz
+function BuildFlatbuffers {
+  pushd flatbuffers
+  rm -rf $BUILD_DIR
+  rm -f CMakeCache.txt
+  FLATBUFFERS_DIR=$PWD
 
-  curl -LOk https://github.com/google/flatbuffers/archive/v1.12.0.tar.gz
-  AssertZeroExitCode "Downloading FlatBuffers failed"
+  mkdir -p $BUILD_DIR
+  cd $BUILD_DIR
 
-  tar xzf $FLATBUFFERS_PKG
-  AssertZeroExitCode "Unpacking FlatBuffers failed"
+  echo "+++ Building Google Flatbufers"
+  CMD="cmake -DFLATBUFFERS_BUILD_FLATC=1 -DCMAKE_INSTALL_PREFIX:PATH=$FLATBUFFERS_DIR .."
+  # Force -fPIC to allow relocatable linking.
+  CXXFLAGS="-fPIC" $CMD
+  AssertZeroExitCode "cmake Google Flatbuffers failed. command was: ${CMD}"
+  make all install
+  AssertZeroExitCode "Building Google Flatbuffers failed"
+  mkdir -p $FLATBUFFERS_DIR/bin
+  cp -f flatc $FLATBUFFERS_DIR/bin
+  AssertZeroExitCode "Failed to copy the Flatbuffers Compiler"
+  popd
+}
 
-  rm -rf $FLATBUFFERS_PKG
+if [ ! -d flatbuffers ]; then
+  # Check if the AOSP has a flatbuffers we can use
+  if [ -d ../../../external/flatbuffers/ ]; then
+    echo "+++ Using AOSP Flatbufers"
+    FLATBUFFERS_DIR=$PWD
+    # Have to make a copy of the AOSP flatbuffers and delete a few files to avoid issues with the android build
+    cp -r ../../../external/flatbuffers/ flatbuffers
+    # Remove Android build files to avoid build issues
+    rm flatbuffers/Android.*
+
+    BuildFlatbuffers
+
+  # If not then download flatbuffers
+  else
+    echo "++ Downloading FlatBuffers v1.12.0"
+
+    FLATBUFFERS_PKG=v1.12.0.tar.gz
+
+    curl -LOk https://github.com/google/flatbuffers/archive/v1.12.0.tar.gz
+    AssertZeroExitCode "Downloading FlatBuffers failed"
+    mkdir -p flatbuffers
+    tar xzf $FLATBUFFERS_PKG -C flatbuffers --strip-components 1
+    AssertZeroExitCode "Unpacking FlatBuffers failed"
+
+    BuildFlatbuffers
+
+    rm -rf $FLATBUFFERS_PKG
+  fi
 fi
 
 if [ ! -d armnn ]; then
@@ -51,3 +92,12 @@
 AssertZeroExitCode "Precompiling clframework failed for v8a."
 popd
 
+if [ ! -d armnn/generated ]; then
+  mkdir -p armnn/generated
+fi
+
+if [ ! -f armnn/generated/ArmnnSchema_generated.h ]; then
+  echo "+++ Generating new ArmnnSchema_generated.h"
+  $FLATBUFFERS_DIR/bin/flatc -o armnn/generated --cpp armnn/src/armnnSerializer/ArmnnSchema.fbs
+  AssertZeroExitCode "Generating ArmnnSchema_generated.h failed."
+fi