blob: 60f191f8587ec4b1c6752060bfc4e8d87984d325 [file] [log] [blame]
alexander3c798932021-03-26 21:42:19 +00001#----------------------------------------------------------------------------
2# Copyright (c) 2021 Arm Limited. All rights reserved.
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#----------------------------------------------------------------------------
17
18include(ProcessorCount)
19ProcessorCount(J)
20
21if (CMAKE_BUILD_TYPE STREQUAL Debug)
22 set(TENSORFLOW_LITE_MICRO_DEFAULT_BUILD_TYPE "debug")
Richard Burton0d110592021-08-12 17:26:30 +010023 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O0")
24 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O0")
alexander3c798932021-03-26 21:42:19 +000025elseif (CMAKE_BUILD_TYPE STREQUAL Release)
alexander3c798932021-03-26 21:42:19 +000026 set(TENSORFLOW_LITE_MICRO_DEFAULT_BUILD_TYPE "release_with_logs")
Richard Burton0d110592021-08-12 17:26:30 +010027 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O3")
28 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O3")
alexander3c798932021-03-26 21:42:19 +000029elseif (NOT DEFINED TENSORFLOW_LITE_MICRO_BUILD_TYPE)
30 message(WARNING "TENSORFLOW_LITE_MICRO_BUILD_TYPE is not set.")
31 message(FATAL_ERROR "Build type ${CMAKE_BUILD_TYPE} does not have a corresponding "
32 "default to set TensorFlow build type")
33endif()
34
35USER_OPTION(TENSORFLOW_LITE_MICRO_BUILD_TYPE "TensorFlow Lite Mirco build type (release/debug etc.)"
36 ${TENSORFLOW_LITE_MICRO_DEFAULT_BUILD_TYPE}
37 STRING)
38
39USER_OPTION(TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS "Select if TPIP downloads should be cleaned before each build."
40 OFF
41 BOOL)
42
43USER_OPTION(TENSORFLOW_LITE_MICRO_CLEAN_BUILD "Select if clean target should be added to a list of targets"
44 ON
45 BOOL)
46
47if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang")
48 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "armclang")
49elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
50 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "gcc")
51else ()
52 message(FATAL_ERROR "No compiler ID is set")
53endif()
54
55get_filename_component(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT ${CMAKE_C_COMPILER} DIRECTORY)
56set(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT "${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}/")
57
58set(TENSORFLOW_LITE_MICRO_PATH "${TENSORFLOW_SRC_PATH}/tensorflow/lite/micro")
59set(TENSORFLOW_LITE_MICRO_GENDIR ${CMAKE_CURRENT_BINARY_DIR}/tensorflow/)
60
ayamas0115f80702021-11-18 14:22:23 +000061
alexander3c798932021-03-26 21:42:19 +000062set(ETHOS_EVAL_TARGET_MAKEFILE_INC ${CMAKE_CURRENT_SOURCE_DIR}/scripts/make/cortex_m_ethos_eval_makefile.inc)
63
64if (TARGET_PLATFORM STREQUAL native)
65 set(TENSORFLOW_LITE_MICRO_TARGET "linux")
66 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64)
67else()
68 set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_ethos_eval")
69 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}${CPU_FEATURES})
Cisco Cervelleraf085fa52021-08-02 09:32:07 +010070 if(ETHOS_U_NPU_ENABLED)
alexander3c798932021-03-26 21:42:19 +000071 # Arm Ethos-U55 NPU is the co-processor for ML workload:
72 set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u")
73 endif()
74
75 set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn")
76
77 # Copy over the target helper (cortex_m_ethos_eval)
78 file(COPY ${ETHOS_EVAL_TARGET_MAKEFILE_INC}
79 DESTINATION ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/targets/)
80endif()
81
82if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
83 list(APPEND MAKE_TARGETS_LIST "clean_downloads")
84endif()
85
86if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
87 list(APPEND MAKE_TARGETS_LIST "clean")
88endif()
89
90# Primary target
91list(APPEND MAKE_TARGETS_LIST "microlite")
92message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}")
93
94# Commands and targets
95add_custom_target(tensorflow_build ALL
96
97 # Command to build the TensorFlow Lite Micro library
98 COMMAND make -j${J} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST}
99 TARGET_TOOLCHAIN_ROOT=${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}
100 TOOLCHAIN=${TENSORFLOW_LITE_MICRO_TOOLCHAIN}
101 GENDIR=${TENSORFLOW_LITE_MICRO_GENDIR}
102 TARGET=${TENSORFLOW_LITE_MICRO_TARGET}
103 TARGET_ARCH=${TENSORFLOW_LITE_MICRO_TARGET_ARCH}
104 BUILD_TYPE=${TENSORFLOW_LITE_MICRO_BUILD_TYPE}
Cisco Cervelleraf085fa52021-08-02 09:32:07 +0100105 ETHOSU_DRIVER_PATH=${ETHOS_U_NPU_DRIVER_SRC_PATH}
alexander3c798932021-03-26 21:42:19 +0000106 CMSIS_PATH=${CMSIS_SRC_PATH}
107
108 # Conditional arguments
109 $<$<BOOL:${ARMCLANG_DEBUG_DWARF_LEVEL}>:ARMCLANG_DEBUG_DWARF_LEVEL=${ARMCLANG_DEBUG_DWARF_LEVEL}>
Richard Burton0d110592021-08-12 17:26:30 +0100110 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>:CORE_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>
111 $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>
alexander3c798932021-03-26 21:42:19 +0000112 $<$<BOOL:${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>:OPTIMIZED_KERNEL_DIR=${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>
113 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>:CO_PROCESSOR=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>
114
115 # Command to copy over the generated library to the local build tree.
116 COMMAND ${CMAKE_COMMAND} -E copy ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
117 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
118
119 COMMENT "Building TensorFlow Lite Micro library..."
120
121 BYPRODUCTS ${TENSORFLOW_SRC_PATH}/tensorflow/tensorflow/lite/micro/tools/make/downloads
122 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
123 ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
124
125 WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH})
126
127# Create library
128add_library(tensorflow-lite-micro STATIC IMPORTED)
129add_dependencies(tensorflow-lite-micro tensorflow_build)
ayamas0115f80702021-11-18 14:22:23 +0000130set_property(TARGET tensorflow-lite-micro PROPERTY IMPORTED_LOCATION
131 "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}")