blob: 79e3e07737f67f9e316dc89e87339caa5e3524b0 [file] [log] [blame]
alexander3c798932021-03-26 21:42:19 +00001#----------------------------------------------------------------------------
Kshitij Sisodia774c7ca2024-04-12 11:30:02 +01002# SPDX-FileCopyrightText: Copyright 2021-2024 Arm Limited and/or its
3# affiliates <open-source-office@arm.com>
alexander3c798932021-03-26 21:42:19 +00004# SPDX-License-Identifier: Apache-2.0
5#
6# Licensed under the Apache License, Version 2.0 (the "License");
7# you may not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS,
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17#----------------------------------------------------------------------------
18
Conor Kennedyb0d7e792022-10-13 15:32:02 +010019if (DEFINED ENV{CMAKE_BUILD_PARALLEL_LEVEL})
20 set(PARALLEL_JOBS $ENV{CMAKE_BUILD_PARALLEL_LEVEL})
21else()
22 include(ProcessorCount)
23 ProcessorCount(PARALLEL_JOBS)
24endif()
alexander3c798932021-03-26 21:42:19 +000025
26if (CMAKE_BUILD_TYPE STREQUAL Debug)
Richard Burton0d110592021-08-12 17:26:30 +010027 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O0")
28 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O0")
alexander3c798932021-03-26 21:42:19 +000029elseif (CMAKE_BUILD_TYPE STREQUAL Release)
Kshitij Sisodia325c9162024-06-05 17:02:32 +010030 # -Ofast is not an option as we set the floating-point conformance mode
31 # to 'full' in the TensorFlow Lite Micro Makefile. Although this is done
32 # only for Arm Compiler, we stick with the '-O3' optimisation level for
33 # all compilers.
34 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O3")
35 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O3")
alexander3c798932021-03-26 21:42:19 +000036endif()
37
Kshitij Sisodiab59ba682021-11-23 17:19:52 +000038assert_defined(TENSORFLOW_LITE_MICRO_BUILD_TYPE)
39assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
40assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
alexander3c798932021-03-26 21:42:19 +000041
42if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang")
43 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "armclang")
44elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
45 set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "gcc")
46else ()
47 message(FATAL_ERROR "No compiler ID is set")
48endif()
49
50get_filename_component(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT ${CMAKE_C_COMPILER} DIRECTORY)
51set(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT "${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}/")
52
53set(TENSORFLOW_LITE_MICRO_PATH "${TENSORFLOW_SRC_PATH}/tensorflow/lite/micro")
54set(TENSORFLOW_LITE_MICRO_GENDIR ${CMAKE_CURRENT_BINARY_DIR}/tensorflow/)
alexander31ae9f02022-02-10 16:15:54 +000055set(TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME "libtensorflow-microlite.a")
ayamas0115f80702021-11-18 14:22:23 +000056
Kshitij Sisodia26bc9232023-03-10 16:33:23 +000057# Add virtual environment's Python directory path to the system path.
58# NOTE: This path is passed to the TensorFlow Lite Micro's make env
59# as it depends on some basic Python packages (like Pillow) installed
60# and the system-wide Python installation might not have them.
61set(ENV_PATH "${PYTHON_VENV}/bin:$ENV{PATH}")
62
alexander3c798932021-03-26 21:42:19 +000063if (TARGET_PLATFORM STREQUAL native)
64 set(TENSORFLOW_LITE_MICRO_TARGET "linux")
65 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64)
66else()
Nina Drozd68549b42022-02-15 14:32:57 +000067 set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic")
Kshitij Sisodia8c61c0a2022-05-17 11:16:22 +010068
Kshitij Sisodia6fecec12022-08-12 15:56:40 +010069 if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main")
Kshitij Sisodia8c61c0a2022-05-17 11:16:22 +010070 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "cortex-m55")
71 else()
72 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
73 endif()
74
Cisco Cervelleraf085fa52021-08-02 09:32:07 +010075 if(ETHOS_U_NPU_ENABLED)
alexander3c798932021-03-26 21:42:19 +000076 # Arm Ethos-U55 NPU is the co-processor for ML workload:
Kshitij Sisodia774c7ca2024-04-12 11:30:02 +010077 set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u")
Kshitij Sisodia325c9162024-06-05 17:02:32 +010078 string(TOLOWER ${ETHOS_U_NPU_ID} TENSORFLOW_LITE_MICRO_CO_PROCESSOR_ARCH)
alexander3c798932021-03-26 21:42:19 +000079 endif()
80
81 set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn")
alexander3c798932021-03-26 21:42:19 +000082endif()
83
84if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
Kshitij Sisodia47406fe2022-12-05 17:18:50 +000085 message(STATUS "Refreshing TensorFlow Lite Micro's third party downloads...")
Richard Burtonb891dd32023-11-24 10:39:42 +000086 set(ENV{PATH} "${ENV_PATH}")
Kshitij Sisodia47406fe2022-12-05 17:18:50 +000087 execute_process(
Richard Burtonb891dd32023-11-24 10:39:42 +000088 COMMAND
Kshitij Sisodia26bc9232023-03-10 16:33:23 +000089 make -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile clean_downloads third_party_downloads
Kshitij Sisodia47406fe2022-12-05 17:18:50 +000090 RESULT_VARIABLE return_code
91 WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH})
92 if (NOT return_code EQUAL "0")
93 message(FATAL_ERROR "Failed to clean TensorFlow Lite Micro's third party downloads.")
94 else()
95 message(STATUS "Refresh completed.")
96 endif ()
alexander3c798932021-03-26 21:42:19 +000097endif()
98
99if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
100 list(APPEND MAKE_TARGETS_LIST "clean")
101endif()
102
103# Primary target
104list(APPEND MAKE_TARGETS_LIST "microlite")
105message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}")
106
107# Commands and targets
108add_custom_target(tensorflow_build ALL
109
110 # Command to build the TensorFlow Lite Micro library
Richard Burtonb891dd32023-11-24 10:39:42 +0000111 COMMAND ${CMAKE_COMMAND} -E env PATH="${ENV_PATH}"
Conor Kennedyb0d7e792022-10-13 15:32:02 +0100112 make -j${PARALLEL_JOBS} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST}
alexander3c798932021-03-26 21:42:19 +0000113 TARGET_TOOLCHAIN_ROOT=${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}
114 TOOLCHAIN=${TENSORFLOW_LITE_MICRO_TOOLCHAIN}
115 GENDIR=${TENSORFLOW_LITE_MICRO_GENDIR}
116 TARGET=${TENSORFLOW_LITE_MICRO_TARGET}
117 TARGET_ARCH=${TENSORFLOW_LITE_MICRO_TARGET_ARCH}
118 BUILD_TYPE=${TENSORFLOW_LITE_MICRO_BUILD_TYPE}
alexander31ae9f02022-02-10 16:15:54 +0000119 CMSIS_PATH=${CMSIS_SRC_PATH}
Richard Burton71f282e2022-12-01 12:31:23 +0000120 CMSIS_NN_PATH=${CMSIS_NN_SRC_PATH}
alexander3c798932021-03-26 21:42:19 +0000121 # Conditional arguments
Kshitij Sisodia774c7ca2024-04-12 11:30:02 +0100122 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_ARCH=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR_ARCH}>
Nina Drozd68549b42022-02-15 14:32:57 +0000123 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_PATH=${ETHOS_U_NPU_DRIVER_SRC_PATH}>
124 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_LIBS=$<TARGET_FILE:ethosu_core_driver>>
125
Richard Burton0d110592021-08-12 17:26:30 +0100126 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>:CORE_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>
127 $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>
Kshitij Sisodia987efae2023-02-14 16:28:40 +0000128 $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:THIRD_PARTY_KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>
alexander3c798932021-03-26 21:42:19 +0000129 $<$<BOOL:${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>:OPTIMIZED_KERNEL_DIR=${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>
130 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>:CO_PROCESSOR=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>
131
132 # Command to copy over the generated library to the local build tree.
133 COMMAND ${CMAKE_COMMAND} -E copy ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
134 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
135
136 COMMENT "Building TensorFlow Lite Micro library..."
137
138 BYPRODUCTS ${TENSORFLOW_SRC_PATH}/tensorflow/tensorflow/lite/micro/tools/make/downloads
139 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
140 ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
141
142 WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH})
143
144# Create library
alexander31ae9f02022-02-10 16:15:54 +0000145
Nina Drozd68549b42022-02-15 14:32:57 +0000146
147set(TENSORFLOW_LITE_MICRO_TARGET tensorflow-lite-micro)
148add_library(${TENSORFLOW_LITE_MICRO_TARGET} STATIC IMPORTED)
149
150if(ETHOS_U_NPU_ENABLED)
151 add_dependencies(tensorflow_build ethosu_core_driver)
152endif()
alexander31ae9f02022-02-10 16:15:54 +0000153
alexander3c798932021-03-26 21:42:19 +0000154add_dependencies(tensorflow-lite-micro tensorflow_build)
alexander31ae9f02022-02-10 16:15:54 +0000155
ayamas0115f80702021-11-18 14:22:23 +0000156set_property(TARGET tensorflow-lite-micro PROPERTY IMPORTED_LOCATION
157 "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}")
alexander31ae9f02022-02-10 16:15:54 +0000158
159target_include_directories(tensorflow-lite-micro
160 INTERFACE
161 ${TENSORFLOW_SRC_PATH})
162
163target_compile_definitions(tensorflow-lite-micro
164 INTERFACE
Kshitij Sisodiab1904b12022-04-21 09:48:10 +0100165 TF_LITE_STATIC_MEMORY)