IVGCVSW-5295 Change fmt to be a header-only interface library

 * Fix non-virtual-dtor warnings in fmt
 * Fix wrong fmt include in TfParser
 * Make fmt work in nn-driver
 * Make fmt a header-only interface library
 * Link fmt where necessary

Signed-off-by: Jan Eilers <jan.eilers@arm.com>
Change-Id: I9db7cd9a133a81262cbf79f04fb419ab97b88ea8
diff --git a/Android.mk b/Android.mk
index 2d3aa96..f767b20 100644
--- a/Android.mk
+++ b/Android.mk
@@ -249,7 +249,8 @@
         -std=$(CPP_VERSION) \
         -fexceptions \
         -Wno-unused-parameter \
-        -frtti
+        -frtti \
+        -DFMT_HEADER_ONLY
 
 # The variable to enable/disable the CL backend (ARMNN_COMPUTE_CL_ENABLED) is declared in android-nn-driver/Android.mk
 ifeq ($(ARMNN_COMPUTE_CL_ENABLED),1)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4840532..c935e6b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -541,10 +541,6 @@
     src/profiling/backends/BackendProfiling.cpp
     src/profiling/backends/BackendProfiling.hpp
     third-party/cxxopts/cxxopts.hpp
-    third-party/fmt/core.h
-    third-party/fmt/format.h
-    third-party/fmt/format-inl.h
-    third-party/fmt/src/format.cc
     third-party/ghc/filesystem.hpp
     third-party/half/half.hpp
     )
@@ -587,6 +583,10 @@
     target_link_libraries(armnn Ws2_32.lib)
 endif()
 
+# Link fmt third-party library
+add_subdirectory(third-party/fmt)
+target_link_libraries(armnn fmt)
+
 if(BUILD_CAFFE_PARSER)
     install(TARGETS armnnCaffeParser
             LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
diff --git a/src/armnnTfParser/TfParser.cpp b/src/armnnTfParser/TfParser.cpp
index 8046a55..6cf1df1 100755
--- a/src/armnnTfParser/TfParser.cpp
+++ b/src/armnnTfParser/TfParser.cpp
@@ -24,7 +24,7 @@
 #include <tensorflow/core/framework/graph.pb.h>
 
 #include <boost/format.hpp>
-#include <fmt/core.h>
+#include <fmt/format.h>
 #include <numeric>
 
 using namespace armnnUtils;
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 5bbec11..b3496b4 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -16,6 +16,9 @@
 target_include_directories(inferenceTest PRIVATE ../src/backends)
 target_include_directories(inferenceTest PRIVATE ../third-party/stb)
 
+# Link fmt third-party library
+target_link_libraries(inferenceTest fmt)
+
 if(BUILD_CAFFE_PARSER)
     macro(CaffeParserTest testName sources)
         add_executable_ex(${testName} ${sources})
diff --git a/third-party/fmt/CMakeLists.txt b/third-party/fmt/CMakeLists.txt
new file mode 100644
index 0000000..496ae1f
--- /dev/null
+++ b/third-party/fmt/CMakeLists.txt
@@ -0,0 +1,19 @@
+#
+# Copyright © 2020 Arm Ltd. All rights reserved.
+# SPDX-License-Identifier: MIT
+#
+
+add_library(fmt INTERFACE)
+
+target_compile_definitions(fmt INTERFACE FMT_HEADER_ONLY=1)
+
+target_include_directories(fmt SYSTEM INTERFACE
+    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
+
+install(
+    TARGETS fmt
+    EXPORT  armnn-targets
+    LIBRARY DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+    ARCHIVE DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+)
\ No newline at end of file
diff --git a/third-party/fmt/core.h b/third-party/fmt/core.h
index 32923ee..338e0c7 100644
--- a/third-party/fmt/core.h
+++ b/third-party/fmt/core.h
@@ -668,7 +668,7 @@
         size_(sz),
         capacity_(cap) {}
 
-  ~buffer() = default;
+  virtual ~buffer() = default;
 
   /** Sets the buffer data and capacity. */
   void set(T* buf_data, size_t buf_capacity) FMT_NOEXCEPT {
diff --git a/third-party/fmt/src/format.cc b/third-party/fmt/src/format.cc
deleted file mode 100644
index a64a1f3..0000000
--- a/third-party/fmt/src/format.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Formatting library for C++
-//
-// Copyright (c) 2012 - 2016, Victor Zverovich
-// All rights reserved.
-//
-// For the license information refer to format.h.
-
-#include "fmt/format-inl.h"
-
-FMT_BEGIN_NAMESPACE
-namespace detail {
-
-template <typename T>
-int format_float(char* buf, std::size_t size, const char* format, int precision,
-                 T value) {
-#ifdef FMT_FUZZ
-  if (precision > 100000)
-    throw std::runtime_error(
-        "fuzz mode - avoid large allocation inside snprintf");
-#endif
-  // Suppress the warning about nonliteral format string.
-  int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF;
-  return precision < 0 ? snprintf_ptr(buf, size, format, value)
-                       : snprintf_ptr(buf, size, format, precision, value);
-}
-}  // namespace detail
-
-template struct FMT_INSTANTIATION_DEF_API detail::basic_data<void>;
-
-// Workaround a bug in MSVC2013 that prevents instantiation of format_float.
-int (*instantiate_format_float)(double, int, detail::float_specs,
-                                detail::buffer<char>&) = detail::format_float;
-
-#ifndef FMT_STATIC_THOUSANDS_SEPARATOR
-template FMT_API detail::locale_ref::locale_ref(const std::locale& loc);
-template FMT_API std::locale detail::locale_ref::get<std::locale>() const;
-#endif
-
-// Explicit instantiations for char.
-
-template FMT_API std::string detail::grouping_impl<char>(locale_ref);
-template FMT_API char detail::thousands_sep_impl(locale_ref);
-template FMT_API char detail::decimal_point_impl(locale_ref);
-
-template FMT_API void detail::buffer<char>::append(const char*, const char*);
-
-template FMT_API FMT_BUFFER_CONTEXT(char)::iterator detail::vformat_to(
-    detail::buffer<char>&, string_view,
-    basic_format_args<FMT_BUFFER_CONTEXT(char)>);
-
-template FMT_API int detail::snprintf_float(double, int, detail::float_specs,
-                                            detail::buffer<char>&);
-template FMT_API int detail::snprintf_float(long double, int,
-                                            detail::float_specs,
-                                            detail::buffer<char>&);
-template FMT_API int detail::format_float(double, int, detail::float_specs,
-                                          detail::buffer<char>&);
-template FMT_API int detail::format_float(long double, int, detail::float_specs,
-                                          detail::buffer<char>&);
-
-// Explicit instantiations for wchar_t.
-
-template FMT_API std::string detail::grouping_impl<wchar_t>(locale_ref);
-template FMT_API wchar_t detail::thousands_sep_impl(locale_ref);
-template FMT_API wchar_t detail::decimal_point_impl(locale_ref);
-
-template FMT_API void detail::buffer<wchar_t>::append(const wchar_t*,
-                                                      const wchar_t*);
-FMT_END_NAMESPACE