blob: 0fa0f8c098b1ef02ef4c0213efdcce86ac819159 [file] [log] [blame]
alexander3c798932021-03-26 21:42:19 +00001#----------------------------------------------------------------------------
Kshitij Sisodia987efae2023-02-14 16:28:40 +00002# SPDX-FileCopyrightText: Copyright 2021-2023 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)
Kshitij Sisodia987efae2023-02-14 16:28:40 +000029 set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-Ofast")
30 set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-Ofast")
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
Kshitij Sisodia26bc9232023-03-10 16:33:23 +000052# Add virtual environment's Python directory path to the system path.
53# NOTE: This path is passed to the TensorFlow Lite Micro's make env
54# as it depends on some basic Python packages (like Pillow) installed
55# and the system-wide Python installation might not have them.
56set(ENV_PATH "${PYTHON_VENV}/bin:$ENV{PATH}")
57
alexander3c798932021-03-26 21:42:19 +000058if (TARGET_PLATFORM STREQUAL native)
59 set(TENSORFLOW_LITE_MICRO_TARGET "linux")
60 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64)
61else()
Nina Drozd68549b42022-02-15 14:32:57 +000062 set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic")
Kshitij Sisodia8c61c0a2022-05-17 11:16:22 +010063
Kshitij Sisodia6fecec12022-08-12 15:56:40 +010064 if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main")
Kshitij Sisodia8c61c0a2022-05-17 11:16:22 +010065 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "cortex-m55")
66 else()
67 set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "${CMAKE_SYSTEM_PROCESSOR}")
68 endif()
69
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")
Richard Burtonb4123fd2022-03-04 09:19:09 +000073 set(ETHOS_U_NPU_ID "u55") # Currently only u55 is supported by TFLite Micro.
alexander3c798932021-03-26 21:42:19 +000074 endif()
75
76 set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn")
alexander3c798932021-03-26 21:42:19 +000077endif()
78
79if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS)
Kshitij Sisodia47406fe2022-12-05 17:18:50 +000080 message(STATUS "Refreshing TensorFlow Lite Micro's third party downloads...")
Richard Burtonb891dd32023-11-24 10:39:42 +000081 set(ENV{PATH} "${ENV_PATH}")
Kshitij Sisodia47406fe2022-12-05 17:18:50 +000082 execute_process(
Richard Burtonb891dd32023-11-24 10:39:42 +000083 COMMAND
Kshitij Sisodia26bc9232023-03-10 16:33:23 +000084 make -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile clean_downloads third_party_downloads
Kshitij Sisodia47406fe2022-12-05 17:18:50 +000085 RESULT_VARIABLE return_code
86 WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH})
87 if (NOT return_code EQUAL "0")
88 message(FATAL_ERROR "Failed to clean TensorFlow Lite Micro's third party downloads.")
89 else()
90 message(STATUS "Refresh completed.")
91 endif ()
alexander3c798932021-03-26 21:42:19 +000092endif()
93
94if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD)
95 list(APPEND MAKE_TARGETS_LIST "clean")
96endif()
97
98# Primary target
99list(APPEND MAKE_TARGETS_LIST "microlite")
100message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}")
101
102# Commands and targets
103add_custom_target(tensorflow_build ALL
104
105 # Command to build the TensorFlow Lite Micro library
Richard Burtonb891dd32023-11-24 10:39:42 +0000106 COMMAND ${CMAKE_COMMAND} -E env PATH="${ENV_PATH}"
Conor Kennedyb0d7e792022-10-13 15:32:02 +0100107 make -j${PARALLEL_JOBS} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST}
alexander3c798932021-03-26 21:42:19 +0000108 TARGET_TOOLCHAIN_ROOT=${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}
109 TOOLCHAIN=${TENSORFLOW_LITE_MICRO_TOOLCHAIN}
110 GENDIR=${TENSORFLOW_LITE_MICRO_GENDIR}
111 TARGET=${TENSORFLOW_LITE_MICRO_TARGET}
112 TARGET_ARCH=${TENSORFLOW_LITE_MICRO_TARGET_ARCH}
113 BUILD_TYPE=${TENSORFLOW_LITE_MICRO_BUILD_TYPE}
alexander31ae9f02022-02-10 16:15:54 +0000114 CMSIS_PATH=${CMSIS_SRC_PATH}
Richard Burton71f282e2022-12-01 12:31:23 +0000115 CMSIS_NN_PATH=${CMSIS_NN_SRC_PATH}
alexander3c798932021-03-26 21:42:19 +0000116 # Conditional arguments
Richard Burtonb4123fd2022-03-04 09:19:09 +0000117 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_ARCH=${ETHOS_U_NPU_ID}>
Nina Drozd68549b42022-02-15 14:32:57 +0000118 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_PATH=${ETHOS_U_NPU_DRIVER_SRC_PATH}>
119 $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_DRIVER_LIBS=$<TARGET_FILE:ethosu_core_driver>>
120
Richard Burton0d110592021-08-12 17:26:30 +0100121 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>:CORE_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>
122 $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>
Kshitij Sisodia987efae2023-02-14 16:28:40 +0000123 $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:THIRD_PARTY_KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>
alexander3c798932021-03-26 21:42:19 +0000124 $<$<BOOL:${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>:OPTIMIZED_KERNEL_DIR=${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>
125 $<$<BOOL:${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>:CO_PROCESSOR=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>
126
127 # Command to copy over the generated library to the local build tree.
128 COMMAND ${CMAKE_COMMAND} -E copy ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
129 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
130
131 COMMENT "Building TensorFlow Lite Micro library..."
132
133 BYPRODUCTS ${TENSORFLOW_SRC_PATH}/tensorflow/tensorflow/lite/micro/tools/make/downloads
134 ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
135 ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}
136
137 WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH})
138
139# Create library
alexander31ae9f02022-02-10 16:15:54 +0000140
Nina Drozd68549b42022-02-15 14:32:57 +0000141
142set(TENSORFLOW_LITE_MICRO_TARGET tensorflow-lite-micro)
143add_library(${TENSORFLOW_LITE_MICRO_TARGET} STATIC IMPORTED)
144
145if(ETHOS_U_NPU_ENABLED)
146 add_dependencies(tensorflow_build ethosu_core_driver)
147endif()
alexander31ae9f02022-02-10 16:15:54 +0000148
alexander3c798932021-03-26 21:42:19 +0000149add_dependencies(tensorflow-lite-micro tensorflow_build)
alexander31ae9f02022-02-10 16:15:54 +0000150
ayamas0115f80702021-11-18 14:22:23 +0000151set_property(TARGET tensorflow-lite-micro PROPERTY IMPORTED_LOCATION
152 "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}")
alexander31ae9f02022-02-10 16:15:54 +0000153
154target_include_directories(tensorflow-lite-micro
155 INTERFACE
156 ${TENSORFLOW_SRC_PATH})
157
158target_compile_definitions(tensorflow-lite-micro
159 INTERFACE
Kshitij Sisodiab1904b12022-04-21 09:48:10 +0100160 TF_LITE_STATIC_MEMORY)