blob: 9a4066de92fa3f898270531e532a0df0ad1144e7 [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)
Richard Burton0d110592021-08-12 17:26:30 +010022 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O0")
23 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O0")
alexander3c798932021-03-26 21:42:19 +000024elseif (CMAKE_BUILD_TYPE STREQUAL Release)
Richard Burton0d110592021-08-12 17:26:30 +010025 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O3")
26 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O3")
alexander3c798932021-03-26 21:42:19 +000027endif()
28
Kshitij Sisodiab59ba682021-11-23 17:19:52 +000029assert_defined(TENSORFLOW_LITE_MICRO_BUILD_TYPE)
30assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
31assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
alexander3c798932021-03-26 21:42:19 +000032
33if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang")
34 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "armclang")
35elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
36 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "gcc")
37else ()
38 message(FATAL_ERROR "No compiler ID is set")
39endif()
40
41get_filename_component(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT ${CMAKE_C_COMPILER} DIRECTORY)
42set(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT "${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}/")
43
44set(TENSORFLOW_LITE_MICRO_PATH "${TENSORFLOW_SRC_PATH}/tensorflow/lite/micro")
45set(TENSORFLOW_LITE_MICRO_GENDIR ${CMAKE_CURRENT_BINARY_DIR}/tensorflow/)
alexander31ae9f02022-02-10 16:15:54 +000046set(TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME "libtensorflow-microlite.a")
ayamas0115f80702021-11-18 14:22:23 +000047
alexander3c798932021-03-26 21:42:19 +000048set(ETHOS_EVAL_TARGET_MAKEFILE_INC ${CMAKE_CURRENT_SOURCE_DIR}/scripts/make/cortex_m_ethos_eval_makefile.inc)
49
50if (TARGET_PLATFORM STREQUAL native)
51 set(TENSORFLOW_LITE_MICRO_TARGET "linux")
52 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64)
53else()
54 set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_ethos_eval")
55 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}${CPU_FEATURES})
Cisco Cervelleraf085fa52021-08-02 09:32:07 +010056 if(ETHOS_U_NPU_ENABLED)
alexander3c798932021-03-26 21:42:19 +000057 # Arm Ethos-U55 NPU is the co-processor for ML workload:
58 set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u")
59 endif()
60
61 set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn")
62
63 # Copy over the target helper (cortex_m_ethos_eval)
64 file(COPY ${ETHOS_EVAL_TARGET_MAKEFILE_INC}
65 DESTINATION ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/targets/)
66endif()
67
alexander31ae9f02022-02-10 16:15:54 +000068#TODO: this thing fails the TF build, when the driver is compiled, fatal error: 'ethosETHOSU_ARCH_interface.h' file not found
69#if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55)
70# set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic")
71# set(TENSORFLOW_LITE_MICRO_TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}${CPU_FEATURES})
72# if(ETHOS_U_NPU_ENABLED)
73# # Arm Ethos-U55 NPU is the co-processor for ML workload:
74# set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u")
75# endif()
76#
77# set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn")
78#
79#else()
80# set(TENSORFLOW_LITE_MICRO_TARGET "linux")
81# set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64)
82#endif()
83
alexander3c798932021-03-26 21:42:19 +000084if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
85 list(APPEND MAKE_TARGETS_LIST "clean_downloads")
86endif()
87
88if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
89 list(APPEND MAKE_TARGETS_LIST "clean")
90endif()
91
Richard Burton527b4742021-11-26 12:17:19 +000092if (ETHOS_U_NPU_ID)
93 string(TOLOWER ${ETHOS_U_NPU_ID} ETHOSU_ARCH)
94endif()
95
alexander3c798932021-03-26 21:42:19 +000096# Primary target
97list(APPEND MAKE_TARGETS_LIST "microlite")
98message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}")
99
100# Commands and targets
101add_custom_target(tensorflow_build ALL
102
103 # Command to build the TensorFlow Lite Micro library
104 COMMAND make -j${J} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST}
105 TARGET_TOOLCHAIN_ROOT=${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}
106 TOOLCHAIN=${TENSORFLOW_LITE_MICRO_TOOLCHAIN}
107 GENDIR=${TENSORFLOW_LITE_MICRO_GENDIR}
108 TARGET=${TENSORFLOW_LITE_MICRO_TARGET}
109 TARGET_ARCH=${TENSORFLOW_LITE_MICRO_TARGET_ARCH}
110 BUILD_TYPE=${TENSORFLOW_LITE_MICRO_BUILD_TYPE}
Richard Burton527b4742021-11-26 12:17:19 +0000111 ETHOSU_ARCH=${ETHOSU_ARCH}
alexander31ae9f02022-02-10 16:15:54 +0000112 ETHOSU_DRIVER_PATH=${ETHOS_U_NPU_DRIVER_SRC_PATH}
113 CMSIS_PATH=${CMSIS_SRC_PATH}
alexander3c798932021-03-26 21:42:19 +0000114 # Conditional arguments
115 $<$<BOOL:${ARMCLANG_DEBUG_DWARF_LEVEL}>:ARMCLANG_DEBUG_DWARF_LEVEL=${ARMCLANG_DEBUG_DWARF_LEVEL}>
Richard Burton0d110592021-08-12 17:26:30 +0100116 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>:CORE_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>
117 $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>
alexander3c798932021-03-26 21:42:19 +0000118 $<$<BOOL:${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>:OPTIMIZED_KERNEL_DIR=${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>
119 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>:CO_PROCESSOR=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>
120
121 # Command to copy over the generated library to the local build tree.
122 COMMAND ${CMAKE_COMMAND} -E copy ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
123 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
124
125 COMMENT "Building TensorFlow Lite Micro library..."
126
127 BYPRODUCTS ${TENSORFLOW_SRC_PATH}/tensorflow/tensorflow/lite/micro/tools/make/downloads
128 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
129 ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
130
131 WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH})
132
133# Create library
alexander31ae9f02022-02-10 16:15:54 +0000134
alexander3c798932021-03-26 21:42:19 +0000135add_library(tensorflow-lite-micro STATIC IMPORTED)
alexander31ae9f02022-02-10 16:15:54 +0000136
alexander3c798932021-03-26 21:42:19 +0000137add_dependencies(tensorflow-lite-micro tensorflow_build)
alexander31ae9f02022-02-10 16:15:54 +0000138
ayamas0115f80702021-11-18 14:22:23 +0000139set_property(TARGET tensorflow-lite-micro PROPERTY IMPORTED_LOCATION
140 "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}")
alexander31ae9f02022-02-10 16:15:54 +0000141
142target_include_directories(tensorflow-lite-micro
143 INTERFACE
144 ${TENSORFLOW_SRC_PATH})
145
146target_compile_definitions(tensorflow-lite-micro
147 INTERFACE
148 TF_LITE_STATIC_MEMORY)