Modify CMakeLists to ease integration with Arm NN.

* Add option to disable building test executables.
* Add option to specify an external source of Flatbuffers library.
* Allow third_party/flatbuffers to contain either source or
  prebuilt package.
* Remove default STATIC and rely on cmake's BUILD_SHARED_LIBS.
* Add PUBLIC_HEADERS to install target.
* Specify use of GNU installation directory norms.

Signed-off-by: Colm Donelan <colm.donelan@arm.com>
Change-Id: I780c3345b9e55ec7928b917648174c33fe29e7fb
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aaba60e..87e0825 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 #TOSA serialization library
 
-# Copyright (c) 2020-2021, ARM Limited.
+# Copyright (c) 2020-2022, ARM Limited.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License");
 #    you may not use this file except in compliance with the License.
@@ -24,42 +24,84 @@
 
 set(CMAKE_VERBOSE_MAKEFILE ON)
 
+option(BUILD_TESTS "Build test applications" ON)
+option(FLATBUFFERS_ROOT "Location where the flatbuffers 'include' and 'lib' folders to be found" Off)
+
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
-include_directories(${PROJECT_SOURCE_DIR}/third_party/flatbuffers/include)
 
-# Turn off unnecessary flatbuffers targets
-set(FLATBUFFERS_BUILD_TESTS OFF)
-add_subdirectory(third_party/flatbuffers)
-
-add_library(tosa_serialization_lib STATIC
+add_library(tosa_serialization_lib
   src/tosa_serialization_handler.cpp
   src/numpy_utils.cpp
 )
 
-target_link_libraries(tosa_serialization_lib PRIVATE flatbuffers)
+# Verify we have a valid flatbuffers include path.
+# We will explicitly exclude the system include directories and only
+# accept either a user supplied value or the local third_party/flatbuffers.
+find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
+          NO_DEFAULT_PATH
+          HINTS ${FLATBUFFERS_ROOT} ./third_party/flatbuffers
+          PATH_SUFFIXES include)
+message(STATUS "Flatbuffers include located at: ${FLATBUFFERS_INCLUDE_PATH}")
+include_directories(${FLATBUFFERS_INCLUDE_PATH})
 
-add_executable(serialization_read_write
-  test/src/serialization_read_write.cpp
+# Next is the library.
+# We will explicitly exclude the system lib directories and only accept
+# either a user supplied value or the local third_party/flatbuffers.
+find_library(FLATBUFFERS_LIBRARY
+             NAMES libflatbuffers.a flatbuffers
+             NO_DEFAULT_PATH
+             HINTS ${FLATBUFFERS_ROOT} ./third_party/flatbuffers
+             PATH_SUFFIXES lib)
+
+if(FLATBUFFERS_LIBRARY)
+    message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
+    target_link_libraries(tosa_serialization_lib PRIVATE ${FLATBUFFERS_LIBRARY})
+else()
+    # It's not there we treat third_party/flatbuffers as a sub project.
+    # In this case we'll need to build the downloaded source.
+    # Turn off unnecessary flatbuffers targets
+    set(FLATBUFFERS_BUILD_TESTS OFF)
+    add_subdirectory(third_party/flatbuffers)
+    target_link_libraries(tosa_serialization_lib PRIVATE flatbuffers)
+endif()
+
+set(public_headers)
+list(APPEND public_headers
+     include/attribute.h
+     include/attribute.def
+     include/numpy_utils.h
+     include/tosa_generated.h
+     include/tosa_serialization_handler.h
 )
 
-target_link_libraries(serialization_read_write
-  tosa_serialization_lib
-)
+set_target_properties(tosa_serialization_lib PROPERTIES PUBLIC_HEADER "${public_headers}")
 
-add_executable(serialization_npy_test
-  test/src/serialization_npy_test.cpp
-)
+# Optionally build test executables.
+if (BUILD_TESTS)
+    add_executable(serialization_read_write
+      test/src/serialization_read_write.cpp
+    )
 
-target_link_libraries(serialization_npy_test
-  tosa_serialization_lib
-)
+    target_link_libraries(serialization_read_write
+      tosa_serialization_lib
+    )
+
+    add_executable(serialization_npy_test
+      test/src/serialization_npy_test.cpp
+    )
+
+    target_link_libraries(serialization_npy_test
+      tosa_serialization_lib
+    )
+endif()
 
 set(TOSA_SERIALIZATION_LIB_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/tosa_serialization_lib")
-
+# Follow GNU packaging norms for installation directory structure.
+include(GNUInstallDirs)
 install(
   TARGETS tosa_serialization_lib EXPORT TosaSerializationLibTargets
-  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
-  INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+  PUBLIC_HEADER
+  ARCHIVE
 )
 
 install(EXPORT TosaSerializationLibTargets