blob: d807416ba54d20ba06ea8caed254074f7540e9ba [file] [log] [blame]
alexander3c798932021-03-26 21:42:19 +00001#----------------------------------------------------------------------------
Richard Burton71f282e2022-12-01 12:31:23 +00002# SPDX-FileCopyrightText: Copyright 2021-2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
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
Conor Kennedyb0d7e792022-10-13 15:32:02 +010018if (DEFINED ENV{CMAKE_BUILD_PARALLEL_LEVEL})
19 set(PARALLEL_JOBS $ENV{CMAKE_BUILD_PARALLEL_LEVEL})
20else()
21 include(ProcessorCount)
22 ProcessorCount(PARALLEL_JOBS)
23endif()
alexander3c798932021-03-26 21:42:19 +000024
25if (CMAKE_BUILD_TYPE STREQUAL Debug)
Richard Burton0d110592021-08-12 17:26:30 +010026 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O0")
27 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O0")
alexander3c798932021-03-26 21:42:19 +000028elseif (CMAKE_BUILD_TYPE STREQUAL Release)
Richard Burton0d110592021-08-12 17:26:30 +010029 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O3")
30 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O3")
alexander3c798932021-03-26 21:42:19 +000031endif()
32
Kshitij Sisodiab59ba682021-11-23 17:19:52 +000033assert_defined(TENSORFLOW_LITE_MICRO_BUILD_TYPE)
34assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
35assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
alexander3c798932021-03-26 21:42:19 +000036
37if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang")
38 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "armclang")
39elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
40 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "gcc")
41else ()
42 message(FATAL_ERROR "No compiler ID is set")
43endif()
44
45get_filename_component(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT ${CMAKE_C_COMPILER} DIRECTORY)
46set(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT "${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}/")
47
48set(TENSORFLOW_LITE_MICRO_PATH "${TENSORFLOW_SRC_PATH}/tensorflow/lite/micro")
49set(TENSORFLOW_LITE_MICRO_GENDIR ${CMAKE_CURRENT_BINARY_DIR}/tensorflow/)
alexander31ae9f02022-02-10 16:15:54 +000050set(TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME "libtensorflow-microlite.a")
ayamas0115f80702021-11-18 14:22:23 +000051
alexander3c798932021-03-26 21:42:19 +000052if (TARGET_PLATFORM STREQUAL native)
53 set(TENSORFLOW_LITE_MICRO_TARGET "linux")
54 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64)
55else()
Nina Drozd68549b42022-02-15 14:32:57 +000056 set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic")
Kshitij Sisodia8c61c0a2022-05-17 11:16:22 +010057
Kshitij Sisodia6fecec12022-08-12 15:56:40 +010058 if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main")
Kshitij Sisodia8c61c0a2022-05-17 11:16:22 +010059 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "cortex-m55")
60 else()
61 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
62 endif()
63
Cisco Cervelleraf085fa52021-08-02 09:32:07 +010064 if(ETHOS_U_NPU_ENABLED)
alexander3c798932021-03-26 21:42:19 +000065 # Arm Ethos-U55 NPU is the co-processor for ML workload:
66 set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u")
Richard Burtonb4123fd2022-03-04 09:19:09 +000067 set(ETHOS_U_NPU_ID "u55") # Currently only u55 is supported by TFLite Micro.
alexander3c798932021-03-26 21:42:19 +000068 endif()
69
70 set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn")
alexander3c798932021-03-26 21:42:19 +000071endif()
72
73if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
74 list(APPEND MAKE_TARGETS_LIST "clean_downloads")
75endif()
76
77if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
78 list(APPEND MAKE_TARGETS_LIST "clean")
79endif()
80
81# Primary target
82list(APPEND MAKE_TARGETS_LIST "microlite")
83message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}")
84
Kshitij Sisodiab1904b12022-04-21 09:48:10 +010085# Add virtual environment's Python directory path to the system path.
86# NOTE: This path is passed to the TensorFlow Lite Micro's make env
87# as it depends on some basic Python packages (like Pillow) installed
88# and the system-wide Python installation might not have them.
89set(ENV_PATH "${PYTHON_VENV}/bin:$ENV{PATH}")
90
alexander3c798932021-03-26 21:42:19 +000091# Commands and targets
92add_custom_target(tensorflow_build ALL
93
94 # Command to build the TensorFlow Lite Micro library
Kshitij Sisodiab1904b12022-04-21 09:48:10 +010095 COMMAND ${CMAKE_COMMAND} -E env PATH=${ENV_PATH}
Conor Kennedyb0d7e792022-10-13 15:32:02 +010096 make -j${PARALLEL_JOBS} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST}
alexander3c798932021-03-26 21:42:19 +000097 TARGET_TOOLCHAIN_ROOT=${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}
98 TOOLCHAIN=${TENSORFLOW_LITE_MICRO_TOOLCHAIN}
99 GENDIR=${TENSORFLOW_LITE_MICRO_GENDIR}
100 TARGET=${TENSORFLOW_LITE_MICRO_TARGET}
101 TARGET_ARCH=${TENSORFLOW_LITE_MICRO_TARGET_ARCH}
102 BUILD_TYPE=${TENSORFLOW_LITE_MICRO_BUILD_TYPE}
alexander31ae9f02022-02-10 16:15:54 +0000103 CMSIS_PATH=${CMSIS_SRC_PATH}
Richard Burton71f282e2022-12-01 12:31:23 +0000104 CMSIS_NN_PATH=${CMSIS_NN_SRC_PATH}
alexander3c798932021-03-26 21:42:19 +0000105 # Conditional arguments
Richard Burtonb4123fd2022-03-04 09:19:09 +0000106 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_ARCH=${ETHOS_U_NPU_ID}>
Nina Drozd68549b42022-02-15 14:32:57 +0000107 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_PATH=${ETHOS_U_NPU_DRIVER_SRC_PATH}>
108 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_LIBS=$<TARGET_FILE:ethosu_core_driver>>
109
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
alexander31ae9f02022-02-10 16:15:54 +0000128
Nina Drozd68549b42022-02-15 14:32:57 +0000129
130set(TENSORFLOW_LITE_MICRO_TARGET tensorflow-lite-micro)
131add_library(${TENSORFLOW_LITE_MICRO_TARGET} STATIC IMPORTED)
132
133if(ETHOS_U_NPU_ENABLED)
134 add_dependencies(tensorflow_build ethosu_core_driver)
135endif()
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
Kshitij Sisodiab1904b12022-04-21 09:48:10 +0100148 TF_LITE_STATIC_MEMORY)