Introduce TensorFlow Lite package (#4766)
author박종현/On-Device Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Mon, 18 Mar 2019 04:55:22 +0000 (13:55 +0900)
committer이춘석/On-Device Lab(SR)/Staff Engineer/삼성전자 <chunseok.lee@samsung.com>
Mon, 18 Mar 2019 04:55:22 +0000 (13:55 +0900)
This commit extracts TensorFlow Lite build script from
"external/CMakeLists.txt", and makes is as a separate TensorFlow
Lite package.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
cmake/packages/TensorFlowLite/CMakeLists.txt [new file with mode: 0644]
cmake/packages/TensorFlowLiteConfig.cmake [new file with mode: 0644]
externals/CMakeLists.txt

diff --git a/cmake/packages/TensorFlowLite/CMakeLists.txt b/cmake/packages/TensorFlowLite/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c1fee3b
--- /dev/null
@@ -0,0 +1,64 @@
+set(TENSORFLOW_LITE_BASE ${TensorFlowSource_DIR}/tensorflow/contrib/lite)
+
+#
+# Tensorflow Lite library
+#
+file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" "${TENSORFLOW_LITE_BASE}/*.cc")
+file(GLOB TFLITE_CORE_TESTS "${TENSORFLOW_LITE_BASE}/*test*.cc")
+list(REMOVE_ITEM TFLITE_CORE_SRCS ${TFLITE_CORE_TESTS})
+
+file(GLOB_RECURSE TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/*.cc")
+file(GLOB_RECURSE TFLITE_KERNEL_TESTS "${TENSORFLOW_LITE_BASE}/kernels/*test*.cc")
+list(REMOVE_ITEM TFLITE_KERNEL_SRCS ${TFLITE_KERNEL_TESTS})
+
+file(GLOB TFLITE_LIB_SRCS "${TENSORFLOW_LITE_BASE}/c/*.c" "${TENSORFLOW_LITE_BASE}/c/*.cc")
+file(GLOB TFLITE_LIB_TESTS "${TENSORFLOW_LITE_BASE}/c/*test*.cc")
+list(REMOVE_ITEM TFLITE_LIB_SRCS ${TFLITE_LIB_TESTS})
+
+file(GLOB TFLITE_API_SRCS "${TENSORFLOW_LITE_BASE}/core/api/*.c" "${TENSORFLOW_LITE_BASE}/core/api/*.cc")
+file(GLOB TFLITE_API_TESTS "${TENSORFLOW_LITE_BASE}/core/api/*test*.cc")
+list(REMOVE_ITEM TFLITE_API_SRCS ${TFLITE_API_TESTS})
+
+file(GLOB TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/*.cc")
+file(GLOB TFLITE_PROFILING_TESTS "${TENSORFLOW_LITE_BASE}/profiling/*test*.cc")
+list(REMOVE_ITEM TFLITE_PROFILING_SRCS ${TFLITE_PROFILING_TESTS})
+
+# We will use our own BuiltinOpResolver
+list(REMOVE_ITEM TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/register.cc")
+# We will use our own summarizer
+list(REMOVE_ITEM TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/profile_summarizer.cc")
+list(APPEND TFLITE_SRCS ${TFLITE_CORE_SRCS})
+list(APPEND TFLITE_SRCS ${TFLITE_KERNEL_SRCS})
+list(APPEND TFLITE_SRCS ${TFLITE_LIB_SRCS})
+list(APPEND TFLITE_SRCS ${TFLITE_API_SRCS})
+list(APPEND TFLITE_SRCS ${TFLITE_PROFILING_SRCS})
+
+list(APPEND TFLITE_SRCS "${FarmhashSource_DIR}/src/farmhash.cc")
+
+list(APPEND TFLITE_INCLUDES "${TensorFlowSource_DIR}")
+list(APPEND TFLITE_INCLUDES "${AbslSource_DIR}")
+list(APPEND TFLITE_INCLUDES "${GEMMLowpSource_DIR}")
+list(APPEND TFLITE_INCLUDES "${FarmhashSource_DIR}/src")
+list(APPEND TFLITE_INCLUDES "${FlatBuffersSource_DIR}/include")
+
+if(NEON2SSESource_FOUND)
+  list(APPEND TFLITE_INCLUDES "${NEON2SSESource_DIR}")
+endif(NEON2SSESource_FOUND)
+
+# This kernels are not used on nnfw
+## spectrogram
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram.cc")
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram_test.cc")
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/spectrogram.cc")
+## mfcc
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc.cc")
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_dct.cc")
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_mel_filterbank.cc")
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc.cc")
+list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc_test.cc")
+
+add_library(tensorflow-lite STATIC ${TFLITE_SRCS})
+target_include_directories(tensorflow-lite SYSTEM PUBLIC ${TFLITE_INCLUDES})
+target_compile_definitions(tensorflow-lite PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK")
+target_compile_options(tensorflow-lite PRIVATE -fPIC)
+target_link_libraries(tensorflow-lite eigen ${LIB_PTHREAD} dl)
diff --git a/cmake/packages/TensorFlowLiteConfig.cmake b/cmake/packages/TensorFlowLiteConfig.cmake
new file mode 100644 (file)
index 0000000..1a318a4
--- /dev/null
@@ -0,0 +1,33 @@
+if(BUILD_TENSORFLOW_LITE)
+  macro(return_unless VAR)
+    if(NOT ${VAR})
+      set(TensorFlowLite_FOUND PARENT_SCOPE)
+      return()
+    endif(NOT ${VAR})
+  endmacro(return_unless)
+
+  # Required packages
+  nnfw_find_package(AbslSource QUIET)
+  return_unless(AbslSource_FOUND)
+  nnfw_find_package(Eigen QUIET)
+  return_unless(Eigen_FOUND)
+  nnfw_find_package(FarmhashSource QUIET)
+  return_unless(FarmhashSource_FOUND)
+  nnfw_find_package(FlatBuffersSource QUIET)
+  return_unless(FlatBuffersSource_FOUND)
+  nnfw_find_package(GEMMLowpSource QUIET)
+  return_unless(GEMMLowpSource_FOUND)
+  nnfw_find_package(TensorFlowSource QUIET)
+  return_unless(TensorFlowSource_FOUND)
+
+  # Optional packages
+  nnfw_find_package(NEON2SSESource QUIET)
+
+  add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/TensorFlowLite" tflite)
+
+  set(TensorFlowLite_FOUND TRUE)
+  return()
+endif(BUILD_TENSORFLOW_LITE)
+
+# TODO Allow users to import pre-built TensorFlow Lite!
+set(TensorFlowLite_FOUND FALSE)
index ce6d3cb..b0ac9de 100644 (file)
@@ -1,76 +1,12 @@
-# TODO Rewrite below build script as CMake package
-if(NOT BUILD_TENSORFLOW_LITE)
-  return()
-endif(NOT BUILD_TENSORFLOW_LITE)
-
-# Required source & package
-nnfw_find_package(AbslSource REQUIRED)
-nnfw_find_package(Eigen REQUIRED)
-nnfw_find_package(FarmhashSource REQUIRED)
-nnfw_find_package(FlatBuffersSource REQUIRED)
-nnfw_find_package(GEMMLowpSource REQUIRED)
-nnfw_find_package(TensorFlowSource REQUIRED)
-
-set(TENSORFLOW_LITE_BASE ${TensorFlowSource_DIR}/tensorflow/contrib/lite)
-
-#
-# Tensorflow Lite library
-#
-file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" "${TENSORFLOW_LITE_BASE}/*.cc")
-file(GLOB TFLITE_CORE_TESTS "${TENSORFLOW_LITE_BASE}/*test*.cc")
-list(REMOVE_ITEM TFLITE_CORE_SRCS ${TFLITE_CORE_TESTS})
-
-file(GLOB_RECURSE TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/*.cc")
-file(GLOB_RECURSE TFLITE_KERNEL_TESTS "${TENSORFLOW_LITE_BASE}/kernels/*test*.cc")
-list(REMOVE_ITEM TFLITE_KERNEL_SRCS ${TFLITE_KERNEL_TESTS})
-
-file(GLOB TFLITE_LIB_SRCS "${TENSORFLOW_LITE_BASE}/c/*.c" "${TENSORFLOW_LITE_BASE}/c/*.cc")
-file(GLOB TFLITE_LIB_TESTS "${TENSORFLOW_LITE_BASE}/c/*test*.cc")
-list(REMOVE_ITEM TFLITE_LIB_SRCS ${TFLITE_LIB_TESTS})
-
-file(GLOB TFLITE_API_SRCS "${TENSORFLOW_LITE_BASE}/core/api/*.c" "${TENSORFLOW_LITE_BASE}/core/api/*.cc")
-file(GLOB TFLITE_API_TESTS "${TENSORFLOW_LITE_BASE}/core/api/*test*.cc")
-list(REMOVE_ITEM TFLITE_API_SRCS ${TFLITE_API_TESTS})
-
-file(GLOB TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/*.cc")
-file(GLOB TFLITE_PROFILING_TESTS "${TENSORFLOW_LITE_BASE}/profiling/*test*.cc")
-list(REMOVE_ITEM TFLITE_PROFILING_SRCS ${TFLITE_PROFILING_TESTS})
-
-# We will use our own BuiltinOpResolver
-list(REMOVE_ITEM TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/register.cc")
-# We will use our own summarizer
-list(REMOVE_ITEM TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/profile_summarizer.cc")
-list(APPEND TFLITE_SRCS ${TFLITE_CORE_SRCS})
-list(APPEND TFLITE_SRCS ${TFLITE_KERNEL_SRCS})
-list(APPEND TFLITE_SRCS ${TFLITE_LIB_SRCS})
-list(APPEND TFLITE_SRCS ${TFLITE_API_SRCS})
-list(APPEND TFLITE_SRCS ${TFLITE_PROFILING_SRCS})
-
-list(APPEND TFLITE_SRCS "${FarmhashSource_DIR}/src/farmhash.cc")
+nnfw_find_package(TensorFlowLite QUIET)
 
-list(APPEND TFLITE_INCLUDES "${TensorFlowSource_DIR}")
-list(APPEND TFLITE_INCLUDES "${AbslSource_DIR}")
-list(APPEND TFLITE_INCLUDES "${GEMMLowpSource_DIR}")
-list(APPEND TFLITE_INCLUDES "${FarmhashSource_DIR}/src")
-list(APPEND TFLITE_INCLUDES "${FlatBuffersSource_DIR}/include")
-
-nnfw_find_package(NEON2SSESource QUIET)
-
-if(NEON2SSESource_FOUND)
-  list(APPEND TFLITE_INCLUDES "${NEON2SSESource_DIR}")
-endif(NEON2SSESource_FOUND)
+if(NOT TensorFlowLite_FOUND)
+  return()
+endif(NOT TensorFlowLite_FOUND)
 
-# This kernels are not used on nnfw
-## spectrogram
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram.cc")
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram_test.cc")
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/spectrogram.cc")
-## mfcc
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc.cc")
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_dct.cc")
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/mfcc_mel_filterbank.cc")
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc.cc")
-list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/mfcc_test.cc")
+if(BUILD_TFLITE_BENCHMARK_MODEL)
+  target_compile_definitions(tensorflow-lite PUBLIC "TFLITE_PROFILING_ENABLED")
+endif()
 
 if("${TARGET_OS}" STREQUAL "android")
   if(NOT DEFINED NDK_DIR)
@@ -85,17 +21,8 @@ if("${TARGET_OS}" STREQUAL "android")
     message(FATAL_ERROR "NDK_DIR should be specified via environment variable")
   endif()
   message(STATUS "Found NDK: ${NDK_DIR}")
-  list(APPEND TFLITE_INCLUDES "${NDK_DIR}")
-endif()
-
-add_library(tensorflow-lite STATIC ${TFLITE_SRCS})
-target_include_directories(tensorflow-lite SYSTEM PUBLIC ${TFLITE_INCLUDES})
-target_compile_definitions(tensorflow-lite PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK")
-target_compile_options(tensorflow-lite PRIVATE -fPIC)
-if(BUILD_TFLITE_BENCHMARK_MODEL)
-  target_compile_definitions(tensorflow-lite PUBLIC "TFLITE_PROFILING_ENABLED")
+  target_include_directories(tensorflow-lite SYSTEM PUBLIC "${NDK_DIR}")
 endif()
-target_link_libraries(tensorflow-lite eigen ${LIB_PTHREAD} dl)
 
 if("${TARGET_OS}" STREQUAL "android")
   target_link_libraries(tensorflow-lite log)