blob: 8a790bc3c27bdb7420a104a7893f7dd6abc0e558 [file] [log] [blame]
alexander3c798932021-03-26 21:42:19 +00001#----------------------------------------------------------------------------
alexandercb8a9872022-02-11 13:23:22 +00002# Copyright (c) 2021 - 2022 Arm Limited. All rights reserved.
alexander3c798932021-03-26 21:42:19 +00003# 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 +000048if (TARGET_PLATFORM STREQUAL native)
49 set(TENSORFLOW_LITE_MICRO_TARGET "linux")
50 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64)
51else()
Nina Drozd68549b42022-02-15 14:32:57 +000052 set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic")
Kshitij Sisodia8c61c0a2022-05-17 11:16:22 +010053
54 if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main")
55 # TensorFlow's generic makefile doesn't currently have a flow for Cortex-M85.
56 # We build for Arm Cortex-M55 instead.
57 # @TODO: check with latest TensorFlow package.
58 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "cortex-m55")
59 else()
60 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
61 endif()
62
Cisco Cervelleraf085fa52021-08-02 09:32:07 +010063 if(ETHOS_U_NPU_ENABLED)
alexander3c798932021-03-26 21:42:19 +000064 # Arm Ethos-U55 NPU is the co-processor for ML workload:
65 set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u")
Richard Burtonb4123fd2022-03-04 09:19:09 +000066 set(ETHOS_U_NPU_ID "u55") # Currently only u55 is supported by TFLite Micro.
alexander3c798932021-03-26 21:42:19 +000067 endif()
68
69 set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn")
alexander3c798932021-03-26 21:42:19 +000070endif()
71
72if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
73 list(APPEND MAKE_TARGETS_LIST "clean_downloads")
74endif()
75
76if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
77 list(APPEND MAKE_TARGETS_LIST "clean")
78endif()
79
80# Primary target
81list(APPEND MAKE_TARGETS_LIST "microlite")
82message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}")
83
Kshitij Sisodiab1904b12022-04-21 09:48:10 +010084# Add virtual environment's Python directory path to the system path.
85# NOTE: This path is passed to the TensorFlow Lite Micro's make env
86# as it depends on some basic Python packages (like Pillow) installed
87# and the system-wide Python installation might not have them.
88set(ENV_PATH "${PYTHON_VENV}/bin:$ENV{PATH}")
89
alexander3c798932021-03-26 21:42:19 +000090# Commands and targets
91add_custom_target(tensorflow_build ALL
92
93 # Command to build the TensorFlow Lite Micro library
Kshitij Sisodiab1904b12022-04-21 09:48:10 +010094 COMMAND ${CMAKE_COMMAND} -E env PATH=${ENV_PATH}
95 make -j${J} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST}
alexander3c798932021-03-26 21:42:19 +000096 TARGET_TOOLCHAIN_ROOT=${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}
97 TOOLCHAIN=${TENSORFLOW_LITE_MICRO_TOOLCHAIN}
98 GENDIR=${TENSORFLOW_LITE_MICRO_GENDIR}
99 TARGET=${TENSORFLOW_LITE_MICRO_TARGET}
100 TARGET_ARCH=${TENSORFLOW_LITE_MICRO_TARGET_ARCH}
101 BUILD_TYPE=${TENSORFLOW_LITE_MICRO_BUILD_TYPE}
alexander31ae9f02022-02-10 16:15:54 +0000102 CMSIS_PATH=${CMSIS_SRC_PATH}
alexander3c798932021-03-26 21:42:19 +0000103 # Conditional arguments
Richard Burtonb4123fd2022-03-04 09:19:09 +0000104 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_ARCH=${ETHOS_U_NPU_ID}>
Nina Drozd68549b42022-02-15 14:32:57 +0000105 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_PATH=${ETHOS_U_NPU_DRIVER_SRC_PATH}>
106 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_LIBS=$<TARGET_FILE:ethosu_core_driver>>
107
Richard Burton0d110592021-08-12 17:26:30 +0100108 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>:CORE_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>
109 $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>
alexander3c798932021-03-26 21:42:19 +0000110 $<$<BOOL:${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>:OPTIMIZED_KERNEL_DIR=${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>
111 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>:CO_PROCESSOR=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>
112
113 # Command to copy over the generated library to the local build tree.
114 COMMAND ${CMAKE_COMMAND} -E copy ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
115 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
116
117 COMMENT "Building TensorFlow Lite Micro library..."
118
119 BYPRODUCTS ${TENSORFLOW_SRC_PATH}/tensorflow/tensorflow/lite/micro/tools/make/downloads
120 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
121 ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
122
123 WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH})
124
125# Create library
alexander31ae9f02022-02-10 16:15:54 +0000126
Nina Drozd68549b42022-02-15 14:32:57 +0000127
128set(TENSORFLOW_LITE_MICRO_TARGET tensorflow-lite-micro)
129add_library(${TENSORFLOW_LITE_MICRO_TARGET} STATIC IMPORTED)
130
131if(ETHOS_U_NPU_ENABLED)
132 add_dependencies(tensorflow_build ethosu_core_driver)
133endif()
alexander31ae9f02022-02-10 16:15:54 +0000134
alexander3c798932021-03-26 21:42:19 +0000135add_dependencies(tensorflow-lite-micro tensorflow_build)
alexander31ae9f02022-02-10 16:15:54 +0000136
ayamas0115f80702021-11-18 14:22:23 +0000137set_property(TARGET tensorflow-lite-micro PROPERTY IMPORTED_LOCATION
138 "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}")
alexander31ae9f02022-02-10 16:15:54 +0000139
140target_include_directories(tensorflow-lite-micro
141 INTERFACE
142 ${TENSORFLOW_SRC_PATH})
143
144target_compile_definitions(tensorflow-lite-micro
145 INTERFACE
Kshitij Sisodiab1904b12022-04-21 09:48:10 +0100146 TF_LITE_STATIC_MEMORY)