diff options
Diffstat (limited to 'infra/nnfw')
46 files changed, 1400 insertions, 0 deletions
diff --git a/infra/nnfw/CMakeLists.txt b/infra/nnfw/CMakeLists.txt new file mode 100644 index 000000000..6b5c465d2 --- /dev/null +++ b/infra/nnfw/CMakeLists.txt @@ -0,0 +1,108 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(nnfw) + +enable_testing() + +set(CMAKE_SKIP_BUILD_RPATH FALSE) +set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) +set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib:$ORIGIN/") +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + +set(NNAS_PROJECT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../.." CACHE + INTERNAL "Where to find nnas top-level source directory" +) + +set(NNAS_EXTERNALS_DIR + "${NNAS_PROJECT_SOURCE_DIR}/externals" CACHE + INTERNAL "Where to download external dependencies" +) +set(NNFW_OVERLAY_DIR "${CMAKE_BINARY_DIR}/overlay" CACHE + INTERNAL "Where locally built external dependencies are installed") + +# Share package build script with compiler +set(EXT_OVERLAY_DIR ${NNFW_OVERLAY_DIR}) + +# This allows find_package to access configurations installed inside overlay +list(APPEND CMAKE_PREFIX_PATH "${EXT_OVERLAY_DIR}") + +macro(nnas_include PREFIX) + include("${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/modules/${PREFIX}.cmake") +endmacro(nnas_include) + +# 'find_package()' wrapper to find in cmake/packages folder +# +# Example: +# nnfw_find_package(Boost): Load settings from 'BoostConfig.cmake' file +# - this may drop warnings like "-- Could NOT find Boost (missing: Boost_DIR) +# nnfw_find_package(Boost QUIET): Load settings silently, without warnings +# nnfw_find_package(Boost REQUIRED): Load settings but stop with error when failed +macro(nnfw_find_package PREFIX) + find_package(${PREFIX} CONFIG NO_DEFAULT_PATH PATHS ${CMAKE_SOURCE_DIR}/cmake/packages ${ARGN}) +endmacro(nnfw_find_package) +# TODO Remove nnfw_find_pacakge +macro(nnas_find_package PREFIX) + find_package(${PREFIX} CONFIG NO_DEFAULT_PATH + PATHS ${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/packages + ${ARGN} + ) +endmacro(nnas_find_package) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_EXTENSIONS OFF) + +# This feature works with CMake 3.5.2 or later. However, using previous versions does not produce +# an error. We are still officially using CMake 3.5.1, but put this code for the sake of semantic +# support in various development tools. +# Todo: Someday, CMake needs to be updated to 3.7.2 or later to take advantage of improvements +# such as `cmake-server`. +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# identify platform: HOST_PLATFORM, TARGET_PLATFORM and related +# note: this should be placed before flags and options setting +nnas_include(IdentifyPlatform) + +# Configuration flags +include("cmake/CfgOptionFlags.cmake") +# and besides CfgOptionFlags.cmake that can be given outside +# COVERAGE_BUILD: build boolean flag that enables converage test +# ROOTFS_DIR: rootfs path for cross building +# TARGET_ARCH: target architecture string for cross building +# TARGET_OS: target os string for cross building + +# apply compilation flags +# NOTE This should be placed after cmake/CfgOptionFlags.cmake files include +# because compile flag setting can be decided using option (ex. ENABLE_COVERAGE) +include("cmake/ApplyCompileFlags.cmake") + +nnfw_find_package(GTest QUIET) + +option(ENABLE_TEST "Build Tests using Google Test" ${GTest_FOUND}) + +if(${ENABLE_TEST} AND NOT ${GTest_FOUND}) + message(FATAL_ERROR "Google Test is required to enable test") +endif(${ENABLE_TEST} AND NOT ${GTest_FOUND}) + +if(${ENABLE_COVERAGE} AND NOT ${ENABLE_TEST}) + message(FATAL_ERROR "Test should be enabled to measure test coverage") +endif(${ENABLE_COVERAGE} AND NOT ${ENABLE_TEST}) + +add_library(nnfw_common INTERFACE) +if(ENABLE_STRICT_BUILD) + target_compile_options(nnfw_common INTERFACE -Werror -Wall -Wextra) +endif(ENABLE_STRICT_BUILD) + +# TODO Replace using default build option setting in cmake/buildtool/config/config_linux.cmake +# to link nnfw_coverage on each module which want to check coverage +add_library(nnfw_coverage INTERFACE) +if(ENABLE_COVERAGE) + target_compile_options(nnfw_coverage INTERFACE -fprofile-arcs -ftest-coverage) + target_link_libraries(nnfw_coverage INTERFACE gcov) +endif(ENABLE_COVERAGE) + +nnas_include(AddSubdirectories) + +add_subdirectory(${NNAS_PROJECT_SOURCE_DIR}/compute compute) +add_subdirectory(${NNAS_PROJECT_SOURCE_DIR}/runtime runtime) +add_subdirectory(${NNAS_PROJECT_SOURCE_DIR}/tests tests) +add_subdirectory(${NNAS_PROJECT_SOURCE_DIR}/tools tools) diff --git a/infra/nnfw/cmake/ApplyCompileFlags.cmake b/infra/nnfw/cmake/ApplyCompileFlags.cmake new file mode 100644 index 000000000..956ddfe1c --- /dev/null +++ b/infra/nnfw/cmake/ApplyCompileFlags.cmake @@ -0,0 +1,39 @@ +# +# Platform independent compile flag setting +# +# flags for build type: debug, release +if(${ENABLE_COVERAGE}) + # test-coverage build flag for tizen + set(CMAKE_C_FLAGS_DEBUG "-O -g -DDEBUG") + set(CMAKE_CXX_FLAGS_DEBUG "-O -g -DDEBUG") +else(${ENABLE_COVERAGE}) + set(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG") + set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG") +endif(${ENABLE_COVERAGE}) +set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG") +set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") + +# +# Platform specific compile flag setting +# +include("cmake/buildtool/config/config_${TARGET_PLATFORM}.cmake") + +# +# Apply compile flags +# note: this should be placed after cmake/buildtool/config/config_xxx.cmake files +# +# add common flags +foreach(FLAG ${FLAGS_COMMON}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}") +endforeach() + +# add c flags +foreach(FLAG ${FLAGS_CONLY}) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG}") +endforeach() + +# add cxx flags +foreach(FLAG ${FLAGS_CXXONLY}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}") +endforeach() diff --git a/infra/nnfw/cmake/CfgOptionFlags.cmake b/infra/nnfw/cmake/CfgOptionFlags.cmake new file mode 100644 index 000000000..4d15d9a10 --- /dev/null +++ b/infra/nnfw/cmake/CfgOptionFlags.cmake @@ -0,0 +1,77 @@ +include(CMakeDependentOption) + +# +# Platfor specific configuration +# note: this should be placed before default setting for option setting priority +# (platform specific setting have higher priority) +# +include("cmake/options/options_${TARGET_PLATFORM}.cmake") + +# +# Default build configuration for project +# +option(ENABLE_STRICT_BUILD "Treat warning as error" ON) +option(ENABLE_COVERAGE "Build for coverage test" OFF) +option(BUILD_EXT_MULTITHREAD "Build external build using multi thread" ON) +option(BUILD_NEURUN "Build neurun" ON) +option(BUILD_LOGGING "Build logging runtime" ON) +option(BUILD_PURE_ARM_COMPUTE "Build pure_arm_compute runtime" OFF) +CMAKE_DEPENDENT_OPTION(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated Test" + # Set BUILD_RUNTIME_NNAPI_TEST as ON + # if CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.2 + ON "CMAKE_COMPILER_IS_GNUCC;NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.2" + # Otherwise set BUILD_RUNTIME_NNAPI_TEST as OFF + OFF) +option(BUILD_TFLITE_RUN "Build tflite-run" ON) +option(BUILD_TFLITE_BENCHMARK "Build tflite benchmark" ON) +option(BUILD_TFLITE_BENCHMARK_MODEL "Build tflite benchmark model" OFF) +option(BUILD_NNPACKAGE_RUN "Build nnpackge_run" ON) +option(BUILD_SRCN_KERNEL "Build srcn kernel" OFF) +option(BUILD_TFLITE_LOADER "Build TensorFlow Lite loader" ON) +option(BUILD_CIRCLE_LOADER "Build circle loader" ON) +option(BUILD_TFLITE_LOADER_TEST_TOOL "Build tflite loader testing tool" ON) +option(GENERATE_RUNTIME_NNAPI_TESTS "Generate NNAPI operation gtest" ON) +option(ENVVAR_NEURUN_CONFIG "Use environment variable for neurun configuration" ON) +# +# Default build configuration for contrib +# +option(BUILD_ANDROID_TFLITE "Enable android support for TensorFlow Lite" OFF) +option(BUILD_ANDROID_BENCHMARK_APP "Enable Android Benchmark App" OFF) +option(BUILD_BENCHMARK_ACL "Build ARM Compute Library Benchmarks" OFF) +option(BUILD_DETECTION_APP "Build detection example app" OFF) +option(BUILD_HEAP_TRACE "Build heap trace tool" OFF) +option(BUILD_LABS "Build lab projects" OFF) +option(BUILD_TFLITE_TEST "Build tensorflow lite test" OFF) +option(BUILD_TFLITE_CLASSIFY_APP "Build tflite_classify app" OFF) +option(BUILD_UBEN "Build micro-benchmark (uben) suite" OFF) +option(BUILD_MLAPSE "Build mlapse benchmark toolkit" OFF) +# +# Default build configuration for tools +# +option(BUILD_KBENCHMARK "Build kernel benchmark tool" OFF) +option(BUILD_OPENCL_TOOL "Build OpenCL tool" OFF) +option(BUILD_NNAPI_QUICKCHECK "Build NN API Quickcheck tools" OFF) +option(BUILD_TFLITE_ACCURACY "Build tflite accuracy tool" OFF) +# +# Default external libraries source download and build configuration +# +option(DOWNLOAD_TENSORFLOW "Download Tensorflow source" ON) +option(DOWNLOAD_ABSL "Download Absl source" ON) +option(DOWNLOAD_EIGEN "Download Eigen source" ON) +option(DOWNLOAD_FARMHASH "Download farmhash source" ON) +option(DOWNLOAD_GEMMLOWP "Download GEMM low precesion library source" ON) +option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" ON) +option(DOWNLOAD_NNPACK "Download NNPACK source" ON) +option(DOWNLOAD_FLATBUFFERS "Download FlatBuffers source" ON) +option(DOWNLOAD_ARMCOMPUTE "Download ARM Compute source" ON) +option(DOWNLOAD_NONIUS "Download nonius source" ON) +option(DOWNLOAD_BOOST "Download boost source" OFF) +option(BUILD_BOOST "Build boost source" OFF) +option(BUILD_TENSORFLOW_LITE "Build TensorFlow Lite from the downloaded source" ON) +option(BUILD_GTEST "Download and build Google Test" ON) +option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" ON) + +# +## Default sample build configuration +# +option(BUILD_MINIMAL_SAMPLE "Build minimal app" OFF) diff --git a/infra/nnfw/cmake/buildtool/config/config_aarch64-android.cmake b/infra/nnfw/cmake/buildtool/config/config_aarch64-android.cmake new file mode 100644 index 000000000..e0c81dee7 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_aarch64-android.cmake @@ -0,0 +1,9 @@ +include("cmake/buildtool/config/config_linux.cmake") + +# On Android, pthread is contained in bionic(libc) +set(LIB_PTHREAD "") + +# SIMD for aarch64 +set(FLAGS_COMMON ${FLAGS_COMMON} + "-ftree-vectorize" + ) diff --git a/infra/nnfw/cmake/buildtool/config/config_aarch64-linux.cmake b/infra/nnfw/cmake/buildtool/config/config_aarch64-linux.cmake new file mode 100644 index 000000000..f859bbfe5 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_aarch64-linux.cmake @@ -0,0 +1,12 @@ +# +# aarch64 linux compile options +# + +message(STATUS "Building for AARCH64 Linux") + +# include linux common +include("cmake/buildtool/config/config_linux.cmake") + +# addition for aarch64-linux +set(FLAGS_COMMON ${FLAGS_COMMON} + ) diff --git a/infra/nnfw/cmake/buildtool/config/config_aarch64-tizen.cmake b/infra/nnfw/cmake/buildtool/config/config_aarch64-tizen.cmake new file mode 100644 index 000000000..fa1e8b078 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_aarch64-tizen.cmake @@ -0,0 +1,13 @@ +# +# aarch64 tizen compile options +# + +message(STATUS "Building for AARCH64 Tizen") + +# TODO : add and use option_tizen if something uncommon comes up +# include linux common +include("cmake/buildtool/config/config_linux.cmake") + +# addition for aarch64-tizen +set(FLAGS_COMMON ${FLAGS_COMMON} + ) diff --git a/infra/nnfw/cmake/buildtool/config/config_armv7l-linux.cmake b/infra/nnfw/cmake/buildtool/config/config_armv7l-linux.cmake new file mode 100644 index 000000000..6d6459f0f --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_armv7l-linux.cmake @@ -0,0 +1,18 @@ +# +# armv7l linux compile options +# + +message(STATUS "Building for ARMv7l Linux") + +# include linux common +include("cmake/buildtool/config/config_linux.cmake") + +# addition for arm-linux +set(FLAGS_COMMON ${FLAGS_COMMON} + "-mcpu=cortex-a7" + "-mfloat-abi=hard" + "-mfpu=neon-vfpv4" + "-funsafe-math-optimizations" + "-ftree-vectorize" + "-mfp16-format=ieee" + ) diff --git a/infra/nnfw/cmake/buildtool/config/config_armv7l-tizen.cmake b/infra/nnfw/cmake/buildtool/config/config_armv7l-tizen.cmake new file mode 100644 index 000000000..a5dae2027 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_armv7l-tizen.cmake @@ -0,0 +1,18 @@ +# +# armv7l tizen compile options +# + +message(STATUS "Building for ARMv7l(softfp) Tizen") + +# TODO : add and use option_tizen if something uncommon comes up +# include linux common +include("cmake/buildtool/config/config_linux.cmake") + +# addition for arm-linux +set(FLAGS_COMMON ${FLAGS_COMMON} + "-mtune=cortex-a8" + "-mfloat-abi=softfp" + "-mfpu=neon-vfpv4" + "-funsafe-math-optimizations" + "-ftree-vectorize" + ) diff --git a/infra/nnfw/cmake/buildtool/config/config_linux.cmake b/infra/nnfw/cmake/buildtool/config/config_linux.cmake new file mode 100644 index 000000000..86dd0f217 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_linux.cmake @@ -0,0 +1,21 @@ +# +# linux common compile options +# + +# remove warning from arm cl +# https://github.com/ARM-software/ComputeLibrary/issues/330 +set(GCC_VERSION_DISABLE_WARNING 6.0) +if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER GCC_VERSION_DISABLE_WARNING) + message(STATUS "GCC version higher than ${GCC_VERSION_DISABLE_WARNING}") + set(FLAGS_CXXONLY ${FLAGS_CXXONLY} + "-Wno-ignored-attributes" + ) +endif() + +# Disable annoying ABI compatibility warning. +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0) + list(APPEND FLAGS_CXXONLY "-Wno-psabi") +endif() + +# lib pthread as a variable (pthread must be disabled on android) +set(LIB_PTHREAD pthread) diff --git a/infra/nnfw/cmake/buildtool/config/config_x86_64-linux.cmake b/infra/nnfw/cmake/buildtool/config/config_x86_64-linux.cmake new file mode 100644 index 000000000..528e48396 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_x86_64-linux.cmake @@ -0,0 +1,12 @@ +# +# x86_64 linux compile options +# +message(STATUS "Building for x86-64 Linux") + +# include linux common +include("cmake/buildtool/config/config_linux.cmake") + +# SIMD for x86 +set(FLAGS_COMMON ${FLAGS_COMMON} + "-msse4" + ) diff --git a/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-android.cmake b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-android.cmake new file mode 100644 index 000000000..2b2792a6a --- /dev/null +++ b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-android.cmake @@ -0,0 +1,25 @@ +# A workaround for accessing to NDK_DIR. This works since Env Vars are always accessible +# while cache variables are not +if (NDK_DIR) + set(ENV{_NDK_DIR} "${NDK_DIR}") +else (NDK_DIR) + set(NDK_DIR "$ENV{_NDK_DIR}") +endif (NDK_DIR) + +if(NOT DEFINED NDK_DIR) + message(FATAL_ERROR "NDK_DIR should be specified via cmake argument") +endif(NOT DEFINED NDK_DIR) + +set(ANDROID_ABI arm64-v8a) +set(ANDROID_PLATFORM android-27) + +# Find package in the host. `nnfw_find_package` won't work without this +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) +# Find library in the host. Necessary for `add_library` searching in `out/lib` dir. +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + +# Use the toolchain file that NDK provides +include(${NDK_DIR}/build/cmake/android.toolchain.cmake) + +set(TARGET_OS "android") +set(TARGET_ARCH "aarch64") diff --git a/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-linux.cmake b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-linux.cmake new file mode 100644 index 000000000..3356aa72d --- /dev/null +++ b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-linux.cmake @@ -0,0 +1,39 @@ +# +# config for aarch64-linux +# +include(CMakeForceCompiler) + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) + +# where is the target environment +set(NNAS_PROJECT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../../..") +set(ROOTFS_AARCH64 "${NNAS_PROJECT_SOURCE_DIR}/tools/cross/rootfs/aarch64") +include("${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/modules/OptionTools.cmake") + +envoption(ROOTFS_DIR ${ROOTFS_AARCH64}) +if(NOT EXISTS "${ROOTFS_DIR}/lib/aarch64-linux-gnu") + message(FATAL_ERROR "Please prepare RootFS for AARCH64") +endif() + +set(CMAKE_SYSROOT ${ROOTFS_DIR}) +set(CMAKE_FIND_ROOT_PATH ${ROOTFS_DIR}) +set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) +set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# Set cache variable to ignore try-run error by find_package(Threads REQUIRED) on cross build +set(THREADS_PTHREAD_ARG "2" CACHE STRING "Result from TRY_RUN" FORCE) diff --git a/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-tizen.cmake b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-tizen.cmake new file mode 100644 index 000000000..4d5d7ac56 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-tizen.cmake @@ -0,0 +1,62 @@ +# +# config for aarch64-linux +# +include(CMakeForceCompiler) + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) + +set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/6.2.1") + +# where is the target environment +set(NNAS_PROJECT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../../..") +set(ROOTFS_AARCH64 "${NNAS_PROJECT_SOURCE_DIR}/tools/cross/rootfs/aarch64") +include("${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/modules/OptionTools.cmake") + +envoption(ROOTFS_DIR ${ROOTFS_AARCH64}) +if(NOT EXISTS "${ROOTFS_DIR}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") + message(FATAL_ERROR "Please prepare RootFS for tizen aarch64") +endif() + +set(CMAKE_SYSROOT ${ROOTFS_DIR}) +set(CMAKE_FIND_ROOT_PATH ${ROOTFS_DIR}) +set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) +set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# Set cache variable to ignore try-run error by find_package(Threads REQUIRED) on cross build +set(THREADS_PTHREAD_ARG "2" CACHE STRING "Result from TRY_RUN" FORCE) + +add_compile_options(--sysroot=${ROOTFS_DIR}) + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}") + +include_directories(SYSTEM ${ROOTFS_DIR}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/) +include_directories(SYSTEM ${ROOTFS_DIR}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}/include/c++/aarch64-tizen-linux-gnu) +add_compile_options(-Wno-deprecated-declarations) # compile-time option +add_compile_options(-D__extern_always_inline=inline) # compile-time option + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -B${ROOTFS_DIR}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_DIR}/lib64") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib64") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -B${ROOTFS_DIR}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_DIR}/lib64") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib64") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}") diff --git a/infra/nnfw/cmake/buildtool/cross/toolchain_armv7l-linux.cmake b/infra/nnfw/cmake/buildtool/cross/toolchain_armv7l-linux.cmake new file mode 100644 index 000000000..8f2cb6735 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/cross/toolchain_armv7l-linux.cmake @@ -0,0 +1,39 @@ +# +# config for arm-linux +# +include(CMakeForceCompiler) + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR armv7l) + +set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) +set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) + +# where is the target environment +set(NNAS_PROJECT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../../..") +set(ROOTFS_ARM "${NNAS_PROJECT_SOURCE_DIR}/tools/cross/rootfs/arm") +include("${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/modules/OptionTools.cmake") + +envoption(ROOTFS_DIR ${ROOTFS_ARM}) +if(NOT EXISTS "${ROOTFS_DIR}/lib/arm-linux-gnueabihf") + message(FATAL_ERROR "Please prepare RootFS for ARM") +endif() + +set(CMAKE_SYSROOT ${ROOTFS_DIR}) +set(CMAKE_FIND_ROOT_PATH ${ROOTFS_DIR}) +set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) +set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# Set cache variable to ignore try-run error by find_package(Threads REQUIRED) on cross build +set(THREADS_PTHREAD_ARG "2" CACHE STRING "Result from TRY_RUN" FORCE) diff --git a/infra/nnfw/cmake/buildtool/cross/toolchain_armv7l-tizen.cmake b/infra/nnfw/cmake/buildtool/cross/toolchain_armv7l-tizen.cmake new file mode 100644 index 000000000..72513cdc1 --- /dev/null +++ b/infra/nnfw/cmake/buildtool/cross/toolchain_armv7l-tizen.cmake @@ -0,0 +1,66 @@ +# +# config for arm-linux +# +include(CMakeForceCompiler) + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR armv7l) + +set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc) +set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++) + +set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/6.2.1") + +# where is the target environment +set(NNAS_PROJECT_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../../..") +set(ROOTFS_ARM "${NNAS_PROJECT_SOURCE_DIR}/tools/cross/rootfs/armel") +include("${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/modules/OptionTools.cmake") + +envoption(ROOTFS_DIR ${ROOTFS_ARM}) +if(NOT EXISTS "${ROOTFS_DIR}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + message(FATAL_ERROR "Please prepare RootFS for tizen ARM softfp") +endif() + +set(CMAKE_SYSROOT ${ROOTFS_DIR}) +set(CMAKE_FIND_ROOT_PATH ${ROOTFS_DIR}) +set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) +set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}" + CACHE INTERNAL "" FORCE) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +# Set cache variable to ignore try-run error by find_package(Threads REQUIRED) on cross build +set(THREADS_PTHREAD_ARG "2" CACHE STRING "Result from TRY_RUN" FORCE) + + +add_compile_options(-mthumb) +add_compile_options(-mfpu=neon-vfpv4) +add_compile_options(-mfloat-abi=softfp) +add_compile_options(--sysroot=${ROOTFS_DIR}) + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_DIR}") + +include_directories(SYSTEM ${ROOTFS_DIR}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/) +include_directories(SYSTEM ${ROOTFS_DIR}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi) +add_compile_options(-Wno-deprecated-declarations) # compile-time option +add_compile_options(-D__extern_always_inline=inline) # compile-time option + +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -B${ROOTFS_DIR}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_DIR}/lib") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -B${ROOTFS_DIR}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_DIR}/lib") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_DIR}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") diff --git a/infra/nnfw/cmake/options/options_aarch64-android.cmake b/infra/nnfw/cmake/options/options_aarch64-android.cmake new file mode 100644 index 000000000..2393764a1 --- /dev/null +++ b/infra/nnfw/cmake/options/options_aarch64-android.cmake @@ -0,0 +1,17 @@ +# aarch64 android cmake options +# +option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) +# NOTE BUILD_ANDROID_TFLITE(JNI lib) is disabled due to BuiltinOpResolver issue. +# tensorflow-lite does not build BuiltinOpResolver but JNI lib need it +# Related Issue : #1403 +option(BUILD_ANDROID_TFLITE "Enable android support for TensorFlow Lite" ON) +option(BUILD_ANDROID_BENCHMARK_APP "Enable Android Benchmark App" ON) +option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) +# Need boost library +option(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated Test" OFF) +option(BUILD_NNPACKAGE_RUN "Build nnpackge_run" OFF) +option(BUILD_TFLITE_RUN "Build tflite-run" OFF) +option(BUILD_TFLITE_LOADER_TEST_TOOL "Build tflite loader testing tool" OFF) +option(BUILD_LOGGING "Build logging runtime" OFF) + +option(ENABLE_STRICT_BUILD "Treat warning as error" OFF) diff --git a/infra/nnfw/cmake/options/options_aarch64-linux.cmake b/infra/nnfw/cmake/options/options_aarch64-linux.cmake new file mode 100644 index 000000000..179030ec8 --- /dev/null +++ b/infra/nnfw/cmake/options/options_aarch64-linux.cmake @@ -0,0 +1,5 @@ +# +# aarch64 linux cmake options +# +option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) +option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) diff --git a/infra/nnfw/cmake/options/options_aarch64-tizen.cmake b/infra/nnfw/cmake/options/options_aarch64-tizen.cmake new file mode 100644 index 000000000..23eecbc46 --- /dev/null +++ b/infra/nnfw/cmake/options/options_aarch64-tizen.cmake @@ -0,0 +1,15 @@ +# +# aarch64 tizen cmake options +# +option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) +option(BUILD_TENSORFLOW_LITE "Build TensorFlow Lite from the downloaded source" OFF) +option(DOWNLOAD_EIGEN "Download Eigen source" OFF) +option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) +option(DOWNLOAD_NNPACK "Download NNPACK source" OFF) + +option(BUILD_LOGGING "Build logging runtime" OFF) +option(BUILD_TFLITE_RUN "Build tflite-run" OFF) +option(BUILD_TFLITE_LOADER_TEST_TOOL "Build tflite loader testing tool" OFF) +option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) +option(GENERATE_RUNTIME_NNAPI_TESTS "Generate NNAPI operation gtest" OFF) +option(ENVVAR_NEURUN_CONFIG "Use environment variable for neurun configuration" OFF) diff --git a/infra/nnfw/cmake/options/options_armv7l-linux.cmake b/infra/nnfw/cmake/options/options_armv7l-linux.cmake new file mode 100644 index 000000000..ec2f8d6ed --- /dev/null +++ b/infra/nnfw/cmake/options/options_armv7l-linux.cmake @@ -0,0 +1,6 @@ +# +# armv7l linux cmake options +# +option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) +option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) +option(BUILD_OPENCL_TOOL "Build OpenCL tool" ON) diff --git a/infra/nnfw/cmake/options/options_armv7l-tizen.cmake b/infra/nnfw/cmake/options/options_armv7l-tizen.cmake new file mode 100644 index 000000000..af31958ff --- /dev/null +++ b/infra/nnfw/cmake/options/options_armv7l-tizen.cmake @@ -0,0 +1,14 @@ +# +# armv7l tizen cmake options +# +option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) +option(BUILD_TENSORFLOW_LITE "Build TensorFlow Lite from the downloaded source" OFF) +option(DOWNLOAD_EIGEN "Download Eigen source" OFF) +option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) +option(DOWNLOAD_NNPACK "Download NNPACK source" OFF) + +option(BUILD_LOGGING "Build logging runtime" OFF) +option(BUILD_TFLITE_RUN "Build tflite-run" OFF) +option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) +option(GENERATE_RUNTIME_NNAPI_TESTS "Generate NNAPI operation gtest" OFF) +option(ENVVAR_NEURUN_CONFIG "Use environment variable for neurun configuration" OFF) diff --git a/infra/nnfw/cmake/options/options_x86_64-linux.cmake b/infra/nnfw/cmake/options/options_x86_64-linux.cmake new file mode 100644 index 000000000..97642e6ce --- /dev/null +++ b/infra/nnfw/cmake/options/options_x86_64-linux.cmake @@ -0,0 +1,5 @@ +# +# x86_64 linux cmake options +# +option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) +option(DOWNLOAD_ARMCOMPUTE "Download ARM Compute source" OFF) diff --git a/infra/nnfw/cmake/packages/AbslSourceConfig.cmake b/infra/nnfw/cmake/packages/AbslSourceConfig.cmake new file mode 100644 index 000000000..c3bab13e7 --- /dev/null +++ b/infra/nnfw/cmake/packages/AbslSourceConfig.cmake @@ -0,0 +1,14 @@ +function(_AbslSource_import) + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE The following URL comes from TensorFlow 1.12 + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(ABSL_URL ${EXTERNAL_DOWNLOAD_SERVER}/abseil/abseil-cpp/archive/389ec3f906f018661a5308458d623d01f96d7b23.tar.gz) + ExternalSource_Get("absl" ${DOWNLOAD_ABSL} ${ABSL_URL}) + + set(AbslSource_DIR ${absl_SOURCE_DIR} PARENT_SCOPE) + set(AbslSource_FOUND ${absl_SOURCE_GET} PARENT_SCOPE) +endfunction(_AbslSource_import) + +_AbslSource_import() diff --git a/infra/nnfw/cmake/packages/EigenConfig.cmake b/infra/nnfw/cmake/packages/EigenConfig.cmake new file mode 100644 index 000000000..7a8d3d5c6 --- /dev/null +++ b/infra/nnfw/cmake/packages/EigenConfig.cmake @@ -0,0 +1,17 @@ +function(_Eigen_import) + nnfw_find_package(EigenSource QUIET) + + if(NOT EigenSource_FOUND) + set(Eigen_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT EigenSource_FOUND) + + if(NOT TARGET eigen) + add_library(eigen INTERFACE) + target_include_directories(eigen SYSTEM INTERFACE "${EigenSource_DIR}") + endif(NOT TARGET eigen) + + set(Eigen_FOUND TRUE PARENT_SCOPE) +endfunction(_Eigen_import) + +_Eigen_import() diff --git a/infra/nnfw/cmake/packages/EigenSourceConfig.cmake b/infra/nnfw/cmake/packages/EigenSourceConfig.cmake new file mode 100644 index 000000000..1fbcf13d3 --- /dev/null +++ b/infra/nnfw/cmake/packages/EigenSourceConfig.cmake @@ -0,0 +1,14 @@ +function(_EigenSource_import) + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE TensorFlow 1.12 downloads Eign from the following URL + envoption(EXTERNAL_DOWNLOAD_SERVER "https://bitbucket.org") + set(EIGEN_URL ${EXTERNAL_DOWNLOAD_SERVER}/eigen/eigen/get/88fc23324517.tar.gz) + ExternalSource_Get("eigen" ${DOWNLOAD_EIGEN} ${EIGEN_URL}) + + set(EigenSource_DIR ${eigen_SOURCE_DIR} PARENT_SCOPE) + set(EigenSource_FOUND ${eigen_SOURCE_GET} PARENT_SCOPE) +endfunction(_EigenSource_import) + +_EigenSource_import() diff --git a/infra/nnfw/cmake/packages/FarmhashSourceConfig.cmake b/infra/nnfw/cmake/packages/FarmhashSourceConfig.cmake new file mode 100644 index 000000000..cba3c3c27 --- /dev/null +++ b/infra/nnfw/cmake/packages/FarmhashSourceConfig.cmake @@ -0,0 +1,14 @@ +function(_FarmhashSource_import) + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE TensorFlow 1.12 downloads farmhash from the following URL + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(FARMHASH_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz) + ExternalSource_Get("farmhash" ${DOWNLOAD_FARMHASH} ${FARMHASH_URL}) + + set(FarmhashSource_DIR ${farmhash_SOURCE_DIR} PARENT_SCOPE) + set(FarmhashSource_FOUND ${farmhash_SOURCE_GET} PARENT_SCOPE) +endfunction(_FarmhashSource_import) + +_FarmhashSource_import() diff --git a/infra/nnfw/cmake/packages/FlatBuffersConfig.cmake b/infra/nnfw/cmake/packages/FlatBuffersConfig.cmake new file mode 100644 index 000000000..064673158 --- /dev/null +++ b/infra/nnfw/cmake/packages/FlatBuffersConfig.cmake @@ -0,0 +1,77 @@ +function(_FlatBuffers_import) + nnfw_find_package(FlatBuffersSource QUIET) + + if(NOT FlatBuffersSource_FOUND) + set(FlatBuffers_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT FlatBuffersSource_FOUND) + + # From FlatBuffers's CMakeLists.txt + list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/code_generators.cpp") + list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/idl_parser.cpp") + list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_text.cpp") + list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/reflection.cpp") + list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/util.cpp") + + # From FlatBuffers's CMakeLists.txt + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_cpp.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_dart.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_fbs.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_general.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_go.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_grpc.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_js.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_json_schema.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_lobster.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_lua.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_php.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_python.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/flatc.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/flatc_main.cpp") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/cpp_generator.cc") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/go_generator.cc") + list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/java_generator.cc") + + if(NOT TARGET flatbuffers) + add_library(flatbuffers ${FlatBuffers_Library_SRCS}) + target_include_directories(flatbuffers PUBLIC "${FlatBuffersSource_DIR}/include") + endif(NOT TARGET flatbuffers) + + if(NOT TARGET flatc) + add_executable(flatc ${FlatBuffers_Compiler_SRCS}) + target_include_directories(flatc PRIVATE "${FlatBuffersSource_DIR}/grpc") + target_link_libraries(flatc flatbuffers) + endif(NOT TARGET flatc) + + set(FlatBuffers_FOUND TRUE PARENT_SCOPE) +endfunction(_FlatBuffers_import) + +_FlatBuffers_import() + +if(FlatBuffers_FOUND) + function(FlatBuffers_Generate PREFIX OUTPUT_DIR SCHEMA_DIR) + get_filename_component(abs_output_dir ${OUTPUT_DIR} ABSOLUTE) + get_filename_component(abs_schema_dir ${SCHEMA_DIR} ABSOLUTE) + + foreach(schema ${ARGN}) + get_filename_component(schema_fn "${schema}" NAME) + get_filename_component(dir "${schema}" DIRECTORY) + + get_filename_component(schema_fn_we "${schema_fn}" NAME_WE) + + list(APPEND SCHEMA_FILES "${abs_schema_dir}/${schema}") + list(APPEND OUTPUT_FILES "${abs_output_dir}/${schema_fn_we}_generated.h") + endforeach() + + add_custom_command(OUTPUT ${OUTPUT_FILES} + COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}" + COMMAND "$<TARGET_FILE:flatc>" -c --no-includes + --no-union-value-namespacing + --gen-object-api -o "${abs_output_dir}" + ${SCHEMA_FILES} + DEPENDS flatc) + + set(${PREFIX}_SOURCES ${OUTPUT_FILES} PARENT_SCOPE) + set(${PREFIX}_INCLUDE_DIRS ${abs_output_dir} PARENT_SCOPE) + endfunction(FlatBuffers_Generate) +endif(FlatBuffers_FOUND) diff --git a/infra/nnfw/cmake/packages/FlatBuffersSourceConfig.cmake b/infra/nnfw/cmake/packages/FlatBuffersSourceConfig.cmake new file mode 100644 index 000000000..5a59ef3f7 --- /dev/null +++ b/infra/nnfw/cmake/packages/FlatBuffersSourceConfig.cmake @@ -0,0 +1,14 @@ +function(_FlatBuffersSource_import) + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE TensorFlow 1.12 downloads FlatBuffers from the following URL + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(FLATBUFFERS_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/flatbuffers/archive/1f5eae5d6a135ff6811724f6c57f911d1f46bb15.tar.gz) + ExternalSource_Get("flatbuffers" ${DOWNLOAD_FLATBUFFERS} ${FLATBUFFERS_URL}) + + set(FlatBuffersSource_DIR ${flatbuffers_SOURCE_DIR} PARENT_SCOPE) + set(FlatBuffersSource_FOUND ${flatbuffers_SOURCE_GET} PARENT_SCOPE) +endfunction(_FlatBuffersSource_import) + +_FlatBuffersSource_import() diff --git a/infra/nnfw/cmake/packages/GEMMLowpSourceConfig.cmake b/infra/nnfw/cmake/packages/GEMMLowpSourceConfig.cmake new file mode 100644 index 000000000..d800cdcd4 --- /dev/null +++ b/infra/nnfw/cmake/packages/GEMMLowpSourceConfig.cmake @@ -0,0 +1,14 @@ +function(_GEMMLowpSource_import) + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE TensorFlow 1.12 uses the following URL + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(GEMMLOWP_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/gemmlowp/archive/38ebac7b059e84692f53e5938f97a9943c120d98.tar.gz) + ExternalSource_Get("gemmlowp" ${DOWNLOAD_GEMMLOWP} ${GEMMLOWP_URL}) + + set(GEMMLowpSource_DIR ${gemmlowp_SOURCE_DIR} PARENT_SCOPE) + set(GEMMLowpSource_FOUND ${gemmlowp_SOURCE_GET} PARENT_SCOPE) +endfunction(_GEMMLowpSource_import) + +_GEMMLowpSource_import() diff --git a/infra/nnfw/cmake/packages/GTestConfig.cmake b/infra/nnfw/cmake/packages/GTestConfig.cmake new file mode 100644 index 000000000..b4dd05fd4 --- /dev/null +++ b/infra/nnfw/cmake/packages/GTestConfig.cmake @@ -0,0 +1,99 @@ +if(${BUILD_GTEST}) + nnas_include(ExternalSourceTools) + nnas_include(ExternalProjectTools) + nnas_include(OptionTools) + + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(GTEST_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/googletest/archive/release-1.8.0.tar.gz) + ExternalSource_Get("gtest" TRUE ${GTEST_URL}) + + # gtest_SOURCE_DIR is used in gtest subdirectorty's cmake + set(sourcedir_gtest ${gtest_SOURCE_DIR}) + unset(gtest_SOURCE_DIR) + + if(NOT TARGET gtest_main) + add_extdirectory(${sourcedir_gtest} gtest EXCLUDE_FROM_ALL) + endif(NOT TARGET gtest_main) + + set(GTest_FOUND TRUE) + return() +endif(${BUILD_GTEST}) + +### Find and use pre-installed Google Test +find_package(GTest) +find_package(Threads) + +if(${GTEST_FOUND} AND TARGET Threads::Threads) + if(NOT TARGET gtest) + add_library(gtest INTERFACE) + target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIRS}) + target_link_libraries(gtest INTERFACE ${GTEST_LIBRARIES} Threads::Threads) + endif(NOT TARGET gtest) + + if(NOT TARGET gtest_main) + add_library(gtest_main INTERFACE) + target_include_directories(gtest_main INTERFACE ${GTEST_INCLUDE_DIRS}) + target_link_libraries(gtest_main INTERFACE gtest) + target_link_libraries(gtest_main INTERFACE ${GTEST_MAIN_LIBRARIES}) + endif(NOT TARGET gtest_main) + + if(NOT TARGET gmock) + find_library(GMOCK_LIBRARIES gmock) + find_path(GMOCK_INCLUDE_DIR gmock/gmock.h) + if(GMOCK_LIBRARIES AND GMOCK_INCLUDE_DIR) + add_library(gmock INTERFACE) + target_include_directories(gmock INTERFACE ${GMOCK_INCLUDE_DIR}) + target_link_libraries(gmock INTERFACE ${GMOCK_LIBRARIES} Threads::Threads) + endif(GMOCK_LIBRARIES) + endif(NOT TARGET gmock) + + if(NOT TARGET gmock_main) + find_library(GMOCK_MAIN_LIBRARIES gmock_main) + find_path(GMOCK_INCLUDE_DIR gmock/gmock.h) + if(GMOCK_MAIN_LIBRARIES AND GMOCK_INCLUDE_DIR) + add_library(gmock_main INTERFACE) + target_include_directories(gmock_main INTERFACE ${GMOCK_INCLUDE_DIR}) + target_link_libraries(gmock_main INTERFACE gmock) + target_link_libraries(gmock_main INTERFACE ${GMOCK_MAIN_LIBRARIES}) + endif(GMOCK_MAIN_LIBRARIES AND GMOCK_INCLUDE_DIR) + endif(NOT TARGET gmock_main) + + # TODO Check whether this command is necessary or not + include_directories(${GTEST_INCLUDE_DIR}) + set(GTest_FOUND TRUE) +else(${GTEST_FOUND} AND TARGET Threads::Threads) + find_path(GTEST_INCLUDE_DIR gtest/gtest.h) + find_path(GMOCK_INCLUDE_DIR gmock/gmock.h) + find_library(GMOCK_LIBRARIES libgmock.so) + find_library(GMOCK_MAIN_LIBRARIES libgmock_main.so) + + if(GTEST_INCLUDE_DIR AND GMOCK_INCLUDE_DIR AND GMOCK_LIBRARIES AND GMOCK_MAIN_LIBRARIES AND TARGET Threads::Threads) + if(NOT TARGET gmock) + add_library(gmock INTERFACE) + target_include_directories(gmock INTERFACE ${GMOCK_INCLUDE_DIRS}) + target_link_libraries(gmock INTERFACE ${GMOCK_LIBRARIES} Threads::Threads) + endif(NOT TARGET gmock) + + if(NOT TARGET gmock_main) + add_library(gmock_main INTERFACE) + target_include_directories(gmock_main INTERFACE ${GMOCK_INCLUDE_DIRS}) + target_link_libraries(gmock_main INTERFACE gmock) + target_link_libraries(gmock_main INTERFACE ${GMOCK_MAIN_LIBRARIES}) + endif(NOT TARGET gmock_main) + + if(NOT TARGET gtest) + add_library(gtest INTERFACE) + target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIRS}) + target_link_libraries(gtest INTERFACE ${GMOCK_LIBRARIES} Threads::Threads) + endif(NOT TARGET gtest) + + if(NOT TARGET gtest_main) + add_library(gtest_main INTERFACE) + target_include_directories(gtest_main INTERFACE ${GTEST_INCLUDE_DIRS}) + target_link_libraries(gtest_main INTERFACE gtest) + target_link_libraries(gtest_main INTERFACE ${GMOCK_MAIN_LIBRARIES}) + endif(NOT TARGET gtest_main) + + set(GTest_FOUND TRUE) + endif(GTEST_INCLUDE_DIR AND GMOCK_INCLUDE_DIR AND GMOCK_LIBRARIES AND GMOCK_MAIN_LIBRARIES AND TARGET Threads::Threads) +endif(${GTEST_FOUND} AND TARGET Threads::Threads) diff --git a/infra/nnfw/cmake/packages/HDF5Config.cmake b/infra/nnfw/cmake/packages/HDF5Config.cmake new file mode 100644 index 000000000..1f90deaf9 --- /dev/null +++ b/infra/nnfw/cmake/packages/HDF5Config.cmake @@ -0,0 +1,31 @@ +unset(HDF5_DIR CACHE) +find_package(HDF5 QUIET) + +if (NOT HDF5_FOUND) + # Give second chance for some systems where sytem find_package config mode fails + unset(HDF5_FOUND) + + find_path(HDF5_INCLUDE_DIRS NAMES hdf5.h PATH_SUFFIXES include/hdf5/serial) + + if (NOT HDF5_INCLUDE_DIRS) + set(HDF5_FOUND FALSE) + return() + endif() + + if (HDF5_USE_STATIC_LIBRARIES) + find_library(HDF5_LIBRARIES libhdf5.a) + else (HDF5_USE_STATIC_LIBRARIES) + find_library(HDF5_LIBRARIES libhdf5.so) + endif(HDF5_USE_STATIC_LIBRARIES) + + if (NOT HDF5_LIBRARIES) + set(HDF5_FOUND FALSE) + return() + endif() + list(APPEND HDF5_LIBRARIES "sz" "z" "dl" "m") + + set(HDF5_FOUND TRUE) +endif() + +# Append missing libaec which is required by libsz, which is required by libhdf5 +list(APPEND HDF5_LIBRARIES "aec") diff --git a/infra/nnfw/cmake/packages/NEON2SSESourceConfig.cmake b/infra/nnfw/cmake/packages/NEON2SSESourceConfig.cmake new file mode 100644 index 000000000..b1bf6cfb9 --- /dev/null +++ b/infra/nnfw/cmake/packages/NEON2SSESourceConfig.cmake @@ -0,0 +1,20 @@ +function(_NEON2SSESource_import) + # TODO Remove this workaround once target preset is ready + if(NOT (TARGET_ARCH_BASE STREQUAL "x86_64")) + set(NEON2SSESource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT (TARGET_ARCH_BASE STREQUAL "x86_64")) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE TensorFlow 1.12 downloads NEON2SSE from the following URL + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(NEON2SSE_URL ${EXTERNAL_DOWNLOAD_SERVER}/intel/ARM_NEON_2_x86_SSE/archive/0f77d9d182265259b135dad949230ecbf1a2633d.tar.gz) + ExternalSource_Get("neon_2_sse" ${DOWNLOAD_NEON2SSE} ${NEON2SSE_URL}) + + set(NEON2SSESource_DIR ${neon_2_sse_SOURCE_DIR} PARENT_SCOPE) + set(NEON2SSESource_FOUND ${neon_2_sse_SOURCE_GET} PARENT_SCOPE) +endfunction(_NEON2SSESource_import) + +_NEON2SSESource_import() diff --git a/infra/nnfw/cmake/packages/TensorFlowLite/CMakeLists.txt b/infra/nnfw/cmake/packages/TensorFlowLite/CMakeLists.txt new file mode 100644 index 000000000..00ec4b5e2 --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowLite/CMakeLists.txt @@ -0,0 +1,63 @@ +set(TENSORFLOW_LITE_BASE ${TensorFlowSource_DIR}/tensorflow/lite) + +# +# Tensorflow Lite library +# +file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" "${TENSORFLOW_LITE_BASE}/*.cc" "${TENSORFLOW_LITE_BASE}/core/*.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") + +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") +set_property(TARGET tensorflow-lite PROPERTY POSITION_INDEPENDENT_CODE ON) +target_link_libraries(tensorflow-lite eigen ${LIB_PTHREAD} dl) + +if(ANDROID) + target_link_libraries(tensorflow-lite log) + target_include_directories(tensorflow-lite PUBLIC "${NDK_DIR}/..") +endif() diff --git a/infra/nnfw/cmake/packages/TensorFlowLiteConfig.cmake b/infra/nnfw/cmake/packages/TensorFlowLiteConfig.cmake new file mode 100644 index 000000000..2b1c0ec24 --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowLiteConfig.cmake @@ -0,0 +1,69 @@ +# NOTE This line prevents multiple definitions of tensorflow-lite target +if(TARGET tensorflow-lite) + set(TensorFlowLite_FOUND TRUE) + return() +endif(TARGET tensorflow-lite) + +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) + + nnas_include(ExternalProjectTools) + add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/TensorFlowLite" tflite) + + set(TensorFlowLite_FOUND TRUE) + return() +endif(BUILD_TENSORFLOW_LITE) + +# Use pre-built TensorFlow Lite +find_path(TFLITE_INCLUDE_DIR NAMES tensorflow/lite/interpreter.h) +find_library(TFLITE_LIB NAMES tensorflow-lite) + +if(NOT TFLITE_INCLUDE_DIR) + set(TensorFlowLite_FOUND FALSE) + return() +endif(NOT TFLITE_INCLUDE_DIR) + +if(NOT TFLITE_LIB) + set(TensorFlowLite_FOUND FALSE) + return() +endif(NOT TFLITE_LIB) + +message(STATUS "Found TensorFlow Lite: TRUE (include: ${TFLITE_INCLUDE_DIR}, lib: ${TFLITE_LIB}") + +# TODO Use IMPORTED target +add_library(tensorflow-lite INTERFACE) +target_include_directories(tensorflow-lite SYSTEM INTERFACE ${TFLITE_INCLUDE_DIR}) +target_link_libraries(tensorflow-lite INTERFACE ${TFLITE_LIB}) + +# Prefer -pthread to -lpthread +set(THREADS_PREFER_PTHREAD_FLAG TRUE) +set(CMAKE_THREAD_PREFER_PTHREAD TRUE) +find_package(Threads QUIET) + +if(Threads_FOUND) + target_link_libraries(tensorflow-lite INTERFACE ${CMAKE_THREAD_LIBS_INIT}) +endif(Threads_FOUND) + +set(TensorFlowLite_FOUND TRUE) diff --git a/infra/nnfw/cmake/packages/TensorFlowSourceConfig.cmake b/infra/nnfw/cmake/packages/TensorFlowSourceConfig.cmake new file mode 100644 index 000000000..1896239d3 --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowSourceConfig.cmake @@ -0,0 +1,18 @@ +function(_TensorFlowSource_import) + if(NOT DOWNLOAD_TENSORFLOW) + set(TensorFlowSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_TENSORFLOW) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(TENSORFLOW_URL ${EXTERNAL_DOWNLOAD_SERVER}/tensorflow/tensorflow/archive/v1.13.1.tar.gz) + ExternalSource_Get("tensorflow" ${DOWNLOAD_TENSORFLOW} ${TENSORFLOW_URL}) + + set(TensorFlowSource_DIR ${tensorflow_SOURCE_DIR} PARENT_SCOPE) + set(TensorFlowSource_FOUND ${tensorflow_SOURCE_GET} PARENT_SCOPE) +endfunction(_TensorFlowSource_import) + +_TensorFlowSource_import() diff --git a/infra/nnfw/cmake/packages/TensorflowConfig.cmake b/infra/nnfw/cmake/packages/TensorflowConfig.cmake new file mode 100644 index 000000000..b9c947c5b --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorflowConfig.cmake @@ -0,0 +1,44 @@ +function(_Tensorflow_Import) + if(NOT DEFINED TENSORFLOW_DIR) + set(TENSORFLOW_DIR ${NNAS_EXTERNALS_DIR}/tensorflow) + endif(NOT DEFINED TENSORFLOW_DIR) + + if(NOT DEFINED NSYNC_ARCH) + set(NSYNC_ARCH "default") + endif(NOT DEFINED NSYNC_ARCH) + + set(TENSROFLOW_MAKEFILE_DIR "${TENSORFLOW_DIR}/tensorflow/makefile") + set(TENSORFLOW_GEN_DIR "${TENSROFLOW_MAKEFILE_DIR}/gen") + set(TENSORFLOW_DOWNLOADS_DIR "${TENSROFLOW_MAKEFILE_DIR}/downloads") + + if(NOT EXISTS "${TENSORFLOW_GEN_DIR}/lib/libtensorflow-core.a") + set(Tensorflow_FOUND FALSE PARENT_SCOPE) + return() + endif() + + if(NOT EXISTS "${TENSORFLOW_DOWNLOADS_DIR}/nsync/builds/${NSYNC_ARCH}.linux.c++11/libnsync.a") + set(Tensorflow_FOUND FALSE PARENT_SCOPE) + return() + endif() + + if(NOT TARGET tensorflow-core) + add_library(tensorflow-core INTERFACE) + + target_include_directories(tensorflow-core INTERFACE "${TENSORFLOW_DIR}") + target_include_directories(tensorflow-core INTERFACE "${TENSORFLOW_GEN_DIR}/proto") + target_include_directories(tensorflow-core INTERFACE "${TENSORFLOW_GEN_DIR}/protobuf/include") + target_include_directories(tensorflow-core INTERFACE "${TENSORFLOW_DOWNLOADS_DIR}/eigen") + target_include_directories(tensorflow-core INTERFACE "${TENSORFLOW_DOWNLOADS_DIR}/nsync/public") + + target_link_libraries(tensorflow-core INTERFACE -Wl,--whole-archive "${TENSORFLOW_GEN_DIR}/lib/libtensorflow-core.a" -Wl,--no-whole-archive) + target_link_libraries(tensorflow-core INTERFACE "${TENSORFLOW_GEN_DIR}/protobuf/lib/libprotobuf.a") + target_link_libraries(tensorflow-core INTERFACE "${TENSORFLOW_DOWNLOADS_DIR}/nsync/builds/${NSYNC_ARCH}.linux.c++11/libnsync.a") + target_link_libraries(tensorflow-core INTERFACE ${LIB_PTHREAD} dl) + + message(STATUS "Found Tensorflow (lib: ${TENSORFLOW_GEN_DIR}/lib/libtensorflow-core.a") + endif() + + set(Tensorflow_FOUND TRUE PARENT_SCOPE) +endfunction(_Tensorflow_Import) + +_Tensorflow_Import() diff --git a/infra/nnfw/command/build b/infra/nnfw/command/build new file mode 100644 index 000000000..8e59f66f2 --- /dev/null +++ b/infra/nnfw/command/build @@ -0,0 +1,24 @@ +#!/bin/bash + +import "build.configuration" + +if [[ ! -d "${BUILD_PATH}" ]]; then + echo "[ERROR] '${BUILD_PATH}' does not exist. Please run 'configure' first" + exit 255 +fi + +# Set parallel build +# TODO Use argument instead of environment variable +HOST_OS=${HOST_OS:-linux} +NPROCS=${NPROCS:-1} +PARALLEL_BUILD=${PARALLEL_BUILD:-1} + +if [ "${PARALLEL_BUILD}" == "1" ]; then + # Get number of processors (linux only for now) + if [ "${HOST_OS}" == "linux" ]; then + NPROCS="$(grep -c ^processor /proc/cpuinfo)" + fi +fi + +cd ${BUILD_PATH} +make -j ${NPROCS} "$@" diff --git a/infra/nnfw/command/configure b/infra/nnfw/command/configure new file mode 100644 index 000000000..98cad7671 --- /dev/null +++ b/infra/nnfw/command/configure @@ -0,0 +1,26 @@ +#!/bin/bash + +import "build.configuration" + +INSTALL_PATH="${NNFW_INSTALL_PREFIX:-${WORKSPACE_PATH}/out}" +# Normalize to absolute path +if [[ "${INSTALL_PATH}" != /* ]]; then + INSTALL_PATH=${NNFW_PROJECT_PATH}/${INSTALL_PATH} +fi + +# Create "BUILD_PATH" +mkdir -p "${BUILD_PATH}" + +if [ ! -d "${INSTALL_PATH}" ]; then + echo "[WARNING] Cannot find install directory '${INSTALL_PATH}'" + echo " Try to make install directory" + mkdir -p "${INSTALL_PATH}" + if [ ! -d "${INSTALL_PATH}" ]; then + echo "[ERROR] Fail to make install directory '${INSTALL_PATH}'" + echo " Please make '${INSTALL_PATH}' directory first" + exit 255 + fi +fi + +cd "${BUILD_PATH}" +cmake "${NNFW_PROJECT_PATH}"/infra/nnfw -DCMAKE_INSTALL_PREFIX="${INSTALL_PATH}" "$@" diff --git a/infra/nnfw/command/copyright-check b/infra/nnfw/command/copyright-check new file mode 100644 index 000000000..79ead2e31 --- /dev/null +++ b/infra/nnfw/command/copyright-check @@ -0,0 +1,45 @@ +#!/bin/bash + +INVALID_EXIT=0 + +check_copyright() { + DIRECTORIES_NOT_TO_BE_TESTED=$2 + CORRECT_COPYRIGHT="Copyright \(c\) [0-9]+ Samsung Electronics Co\., Ltd\. All Rights Reserved" + + FILES_TO_CHECK=$(git ls-files -c --exclude-standard) + FILES_TO_CHECK_COPYRIGHTS=() + for f in ${FILES_TO_CHECK[@]}; do + # File extension to check + if [[ ${f} == +(*.h|*.hpp|*.cpp|*.cc|*.c|*.cl) ]]; then + FILES_TO_CHECK_COPYRIGHTS+=("${f}") + fi + done + + for s in ${DIRECTORIES_NOT_TO_BE_TESTED[@]}; do + FILES_TO_CHECK_COPYRIGHTS=(${FILES_TO_CHECK_COPYRIGHTS[*]/$s*/}) + done + + if [[ ${#FILES_TO_CHECK_COPYRIGHTS} -ne 0 ]]; then + for f in ${FILES_TO_CHECK_COPYRIGHTS[@]}; do + if ! grep -qE "$CORRECT_COPYRIGHT" $f; then + CREATED_YEAR=$(git log --follow --format=%aD $f | tail -1 | awk '{print $4}') + EXAMPLE_COPYRIGHT="Copyright (c) $CREATED_YEAR Samsung Electronics Co., Ltd. All Rights Reserved" + echo "Copyright format of $f is incorrect: recommend \"$EXAMPLE_COPYRIGHT\"" + INVALID_EXIT=1 + fi + done + fi +} + +DIRECTORIES_NOT_TO_BE_TESTED=() + +for DIR_NOT_TO_BE_TESTED in $(find -name '.FORMATDENY' -exec dirname {} \;); do + DIRECTORIES_NOT_TO_BE_TESTED+=("$DIR_NOT_TO_BE_TESTED") +done + +check_copyright $DIRECTORIES_NOT_TO_BE_TESTED + +if [[ $INVALID_EXIT -ne 0 ]]; then + echo "[FAILED] Invalid copyright check exit." + exit 1 +fi diff --git a/infra/nnfw/command/docker-run b/infra/nnfw/command/docker-run new file mode 100644 index 000000000..b523d61a3 --- /dev/null +++ b/infra/nnfw/command/docker-run @@ -0,0 +1,12 @@ +#!/bin/bash + +import "docker.configuration" + +docker run $DOCKER_RUN_OPTS $DOCKER_ENV_VARS $DOCKER_VOLUMES $DOCKER_IMAGE_NAME "$@" +EXITCODE=$? + +docker_cleanup + +if [ $EXITCODE -ne 0 ]; then + exit $EXITCODE +fi diff --git a/infra/nnfw/command/docker-run-user b/infra/nnfw/command/docker-run-user new file mode 100644 index 000000000..3b5a96142 --- /dev/null +++ b/infra/nnfw/command/docker-run-user @@ -0,0 +1,12 @@ +#!/bin/bash + +import "docker.configuration" + +DOCKER_RUN_OPTS+=" -u $(id -u):$(id -g)" + +docker run $DOCKER_RUN_OPTS $DOCKER_ENV_VARS $DOCKER_VOLUMES $DOCKER_IMAGE_NAME "$@" +EXITCODE=$? + +if [ $EXITCODE -ne 0 ]; then + exit $EXITCODE +fi diff --git a/infra/nnfw/command/docker-shell b/infra/nnfw/command/docker-shell new file mode 100644 index 000000000..1413a7ade --- /dev/null +++ b/infra/nnfw/command/docker-shell @@ -0,0 +1,13 @@ +#!/bin/bash + +import "docker.configuration" + +DOCKER_RUN_OPTS+=" -it" +docker run $DOCKER_RUN_OPTS $DOCKER_ENV_VARS $DOCKER_VOLUMES $DOCKER_IMAGE_NAME "/bin/bash" +EXITCODE=$? + +docker_cleanup + +if [ $EXITCODE -ne 0 ]; then + exit $EXITCODE +fi diff --git a/infra/nnfw/command/gen-coverage-report b/infra/nnfw/command/gen-coverage-report new file mode 100644 index 000000000..8fd398db3 --- /dev/null +++ b/infra/nnfw/command/gen-coverage-report @@ -0,0 +1,59 @@ +#!/bin/bash + +# This file is based on https://github.sec.samsung.net/STAR/nncc/pull/80 + +LCOV_PATH=$(command -v lcov) +GENHTML_PATH=$(command -v genhtml) + +SRC_PREFIX=${SRC_PREFIX:-${NNFW_PROJECT_PATH}} + +if [[ -z "${LCOV_PATH}" ]]; then + echo "ERROR: 'lcov' is not found" + exit 255 +fi + +if [[ -z "${GENHTML_PATH}" ]]; then + echo "ERROR: 'genhtml' is not found" + exit 255 +fi + +if [[ -z "${GCOV_PATH}" ]]; then + GCOV_PATH=$(command -v gcov) + if [[ -z "${GCOV_PATH}" ]]; then + echo "ERROR: 'gcov' is not found" + exit 255 + fi +fi + +OUTPUT_PATH="$1" + +if [[ -z "${OUTPUT_PATH}" ]]; then + OUTPUT_PATH="$NNFW_PROJECT_PATH/coverage" +fi + +if [[ -e "${OUTPUT_PATH}" ]]; then + echo "ERROR: '${OUTPUT_PATH}' already exists" + exit 255 +fi + +mkdir -p "${OUTPUT_PATH}" + +RAW_COVERAGE_INFO_PATH="${OUTPUT_PATH}/coverage.raw.info" +LIBS_COVERAGE_INFO_PATH="${OUTPUT_PATH}/coverage.libs.info" +INCLUDE_COVERAGE_INFO_PATH="${OUTPUT_PATH}/coverage.include.info" +RUNTIMES_COVERAGE_INFO_PATH="${OUTPUT_PATH}/coverage.runtimes.info" +TOOLS_COVERAGE_INFO_PATH="${OUTPUT_PATH}/coverage.tools.info" +FINAL_COVERAGE_INFO_PATH="${OUTPUT_PATH}/coverage.info" +HTML_PATH="${OUTPUT_PATH}/html" +COVERTURA_PATH="${OUTPUT_PATH}/nnfw_coverage.xml" + +"${LCOV_PATH}" -c -d "${NNFW_PROJECT_PATH}" --gcov-tool ${GCOV_PATH} -o "${RAW_COVERAGE_INFO_PATH}" +#"${LCOV_PATH}" -e "${RAW_COVERAGE_INFO_PATH}" -o "${LIBS_COVERAGE_INFO_PATH}" "${SRC_PREFIX}/libs/*" +#"${LCOV_PATH}" -e "${RAW_COVERAGE_INFO_PATH}" -o "${INCLUDE_COVERAGE_INFO_PATH}" "${SRC_PREFIX}/include/*" +"${LCOV_PATH}" -e "${RAW_COVERAGE_INFO_PATH}" -o "${RUNTIMES_COVERAGE_INFO_PATH}" "${SRC_PREFIX}/runtimes/*" +"${LCOV_PATH}" -e "${RAW_COVERAGE_INFO_PATH}" -o "${TOOLS_COVERAGE_INFO_PATH}" "${SRC_PREFIX}/tests/tools/*" +#"${LCOV_PATH}" -a "${LIBS_COVERAGE_INFO_PATH}" -a "${INCLUDE_COVERAGE_INFO_PATH}" \ +# -a "${RUNTIMES_COVERAGE_INFO_PATH}" -a "${TOOLS_COVERAGE_INFO_PATH}" \ +# -o "${FINAL_COVERAGE_INFO_PATH}" +"${LCOV_PATH}" -a "${RUNTIMES_COVERAGE_INFO_PATH}" -a "${TOOLS_COVERAGE_INFO_PATH}" -o "${FINAL_COVERAGE_INFO_PATH}" +"${GENHTML_PATH}" "${FINAL_COVERAGE_INFO_PATH}" --output-directory "${HTML_PATH}" ${GENHTML_FLAG:-} diff --git a/infra/nnfw/command/install b/infra/nnfw/command/install new file mode 100644 index 000000000..3bbb92e0f --- /dev/null +++ b/infra/nnfw/command/install @@ -0,0 +1,11 @@ +#!/bin/bash + +import "build.configuration" + +if [[ ! -d "${BUILD_PATH}" ]]; then + echo "'${BUILD_PATH}' does not exist. Please run 'configure' first" + exit 255 +fi + +cd ${BUILD_PATH} +make install diff --git a/infra/nnfw/config/build.configuration b/infra/nnfw/config/build.configuration new file mode 100644 index 000000000..5e1a8deb1 --- /dev/null +++ b/infra/nnfw/config/build.configuration @@ -0,0 +1,6 @@ +WORKSPACE_PATH=${NNFW_WORKSPACE:-${NNFW_PROJECT_PATH}/Product} +# Normalize to absolute path +if [[ "${WORKSPACE_PATH}" != /* ]]; then + WORKSPACE_PATH=${NNFW_PROJECT_PATH}/${WORKSPACE_PATH} +fi +BUILD_PATH=${WORKSPACE_PATH}/${NNFW_BUILD_RPATH:-obj} diff --git a/infra/nnfw/config/docker.configuration b/infra/nnfw/config/docker.configuration new file mode 100644 index 000000000..862e5f8b5 --- /dev/null +++ b/infra/nnfw/config/docker.configuration @@ -0,0 +1,44 @@ +#!/bin/bash + +DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME:-nnas} +echo "Using docker image ${DOCKER_IMAGE_NAME}" + +if [ -z "`docker images ${DOCKER_IMAGE_NAME}`" ]; then + echo "Need docker image!" + exit 1 +fi + +HOST_PATH="$NNFW_PROJECT_PATH" +DOCKER_PATH="$NNFW_PROJECT_PATH" + +export GIT_SSL_NO_VERIFY=1 + +DOCKER_VOLUMES+=" -v $HOST_PATH:$DOCKER_PATH" + +if [[ ! -z $ENV_FILE ]]; then + DOCKER_ENV_VARS+=" --env-file ${ENV_FILE} " +fi + +DOCKER_ENV_VARS+=" -e http_proxy" +DOCKER_ENV_VARS+=" -e no_proxy" +DOCKER_ENV_VARS+=" -e GIT_SSL_NO_VERIFY" +DOCKER_ENV_VARS+=" -e EXTERNAL_DOWNLOAD_SERVER" +DOCKER_ENV_VARS+=" -e NNFW_WORKSPACE" + +DOCKER_RUN_OPTS="${DOCKER_OPTS}" +DOCKER_RUN_OPTS+=" --rm" +DOCKER_RUN_OPTS+=" -w $DOCKER_PATH" + +function docker_cleanup() +{ + # Newly created files during during docker run can have different ownership. + # This may cause some problems, for example, some jenkins slaves or developers + # can't remove built files due to lack of permission. + # To address this issue, let's change owner of all files + # in nncc to owner of nncc. + NNFW_OWNER_UID=$(stat -c "%u" $HOST_PATH) + NNFW_OWNER_GID=$(stat -c "%g" $HOST_PATH) + + CMD="chown -R $NNFW_OWNER_UID:$NNFW_OWNER_GID $DOCKER_PATH" + docker run $DOCKER_RUN_OPTS $DOCKER_ENV_VARS $DOCKER_VOLUMES $DOCKER_IMAGE_NAME $CMD +} diff --git a/infra/nnfw/config/gbs.conf b/infra/nnfw/config/gbs.conf new file mode 100644 index 000000000..515cadaba --- /dev/null +++ b/infra/nnfw/config/gbs.conf @@ -0,0 +1,20 @@ +[general] +#Current profile name which should match a profile section name +profile = profile.tizen + +[profile.tizen] +user=obs_viewer +obs = obs.tizen +repos = repo.tizen_base,repo.tizen_mobile +buildroot = /home/GBS-ROOT/ + +[obs.tizen] +url = http://api.tizen.org + +[repo.tizen_mobile] +url = http://download.tizen.org/snapshots/tizen/unified/latest/repos/standard/packages/ + +[repo.tizen_base] +url = http://download.tizen.org/snapshots/tizen/base/latest/repos/standard/packages/ + + |