alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 1 | #---------------------------------------------------------------------------- |
Kshitij Sisodia | 774c7ca | 2024-04-12 11:30:02 +0100 | [diff] [blame] | 2 | # SPDX-FileCopyrightText: Copyright 2021-2024 Arm Limited and/or its |
| 3 | # affiliates <open-source-office@arm.com> |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 4 | # 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 Kennedy | b0d7e79 | 2022-10-13 15:32:02 +0100 | [diff] [blame] | 19 | if (DEFINED ENV{CMAKE_BUILD_PARALLEL_LEVEL}) |
| 20 | set(PARALLEL_JOBS $ENV{CMAKE_BUILD_PARALLEL_LEVEL}) |
| 21 | else() |
| 22 | include(ProcessorCount) |
| 23 | ProcessorCount(PARALLEL_JOBS) |
| 24 | endif() |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 25 | |
| 26 | if (CMAKE_BUILD_TYPE STREQUAL Debug) |
Richard Burton | 0d11059 | 2021-08-12 17:26:30 +0100 | [diff] [blame] | 27 | set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O0") |
| 28 | set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O0") |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 29 | elseif (CMAKE_BUILD_TYPE STREQUAL Release) |
Kshitij Sisodia | 325c916 | 2024-06-05 17:02:32 +0100 | [diff] [blame^] | 30 | # -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") |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 36 | endif() |
| 37 | |
Kshitij Sisodia | b59ba68 | 2021-11-23 17:19:52 +0000 | [diff] [blame] | 38 | assert_defined(TENSORFLOW_LITE_MICRO_BUILD_TYPE) |
| 39 | assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS) |
| 40 | assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_BUILD) |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 41 | |
| 42 | if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang") |
| 43 | set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "armclang") |
| 44 | elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
| 45 | set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "gcc") |
| 46 | else () |
| 47 | message(FATAL_ERROR "No compiler ID is set") |
| 48 | endif() |
| 49 | |
| 50 | get_filename_component(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT ${CMAKE_C_COMPILER} DIRECTORY) |
| 51 | set(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT "${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}/") |
| 52 | |
| 53 | set(TENSORFLOW_LITE_MICRO_PATH "${TENSORFLOW_SRC_PATH}/tensorflow/lite/micro") |
| 54 | set(TENSORFLOW_LITE_MICRO_GENDIR ${CMAKE_CURRENT_BINARY_DIR}/tensorflow/) |
alexander | 31ae9f0 | 2022-02-10 16:15:54 +0000 | [diff] [blame] | 55 | set(TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME "libtensorflow-microlite.a") |
ayamas01 | 15f8070 | 2021-11-18 14:22:23 +0000 | [diff] [blame] | 56 | |
Kshitij Sisodia | 26bc923 | 2023-03-10 16:33:23 +0000 | [diff] [blame] | 57 | # 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. |
| 61 | set(ENV_PATH "${PYTHON_VENV}/bin:$ENV{PATH}") |
| 62 | |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 63 | if (TARGET_PLATFORM STREQUAL native) |
| 64 | set(TENSORFLOW_LITE_MICRO_TARGET "linux") |
| 65 | set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64) |
| 66 | else() |
Nina Drozd | 68549b4 | 2022-02-15 14:32:57 +0000 | [diff] [blame] | 67 | set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_generic") |
Kshitij Sisodia | 8c61c0a | 2022-05-17 11:16:22 +0100 | [diff] [blame] | 68 | |
Kshitij Sisodia | 6fecec1 | 2022-08-12 15:56:40 +0100 | [diff] [blame] | 69 | if ("${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main") |
Kshitij Sisodia | 8c61c0a | 2022-05-17 11:16:22 +0100 | [diff] [blame] | 70 | set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "cortex-m55") |
| 71 | else() |
| 72 | set(TENSORFLOW_LITE_MICRO_TARGET_ARCH "${CMAKE_SYSTEM_PROCESSOR}") |
| 73 | endif() |
| 74 | |
Cisco Cervellera | f085fa5 | 2021-08-02 09:32:07 +0100 | [diff] [blame] | 75 | if(ETHOS_U_NPU_ENABLED) |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 76 | # Arm Ethos-U55 NPU is the co-processor for ML workload: |
Kshitij Sisodia | 774c7ca | 2024-04-12 11:30:02 +0100 | [diff] [blame] | 77 | set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u") |
Kshitij Sisodia | 325c916 | 2024-06-05 17:02:32 +0100 | [diff] [blame^] | 78 | string(TOLOWER ${ETHOS_U_NPU_ID} TENSORFLOW_LITE_MICRO_CO_PROCESSOR_ARCH) |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 79 | endif() |
| 80 | |
| 81 | set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn") |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 82 | endif() |
| 83 | |
| 84 | if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS) |
Kshitij Sisodia | 47406fe | 2022-12-05 17:18:50 +0000 | [diff] [blame] | 85 | message(STATUS "Refreshing TensorFlow Lite Micro's third party downloads...") |
Richard Burton | b891dd3 | 2023-11-24 10:39:42 +0000 | [diff] [blame] | 86 | set(ENV{PATH} "${ENV_PATH}") |
Kshitij Sisodia | 47406fe | 2022-12-05 17:18:50 +0000 | [diff] [blame] | 87 | execute_process( |
Richard Burton | b891dd3 | 2023-11-24 10:39:42 +0000 | [diff] [blame] | 88 | COMMAND |
Kshitij Sisodia | 26bc923 | 2023-03-10 16:33:23 +0000 | [diff] [blame] | 89 | make -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile clean_downloads third_party_downloads |
Kshitij Sisodia | 47406fe | 2022-12-05 17:18:50 +0000 | [diff] [blame] | 90 | 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 () |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 97 | endif() |
| 98 | |
| 99 | if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD) |
| 100 | list(APPEND MAKE_TARGETS_LIST "clean") |
| 101 | endif() |
| 102 | |
| 103 | # Primary target |
| 104 | list(APPEND MAKE_TARGETS_LIST "microlite") |
| 105 | message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}") |
| 106 | |
| 107 | # Commands and targets |
| 108 | add_custom_target(tensorflow_build ALL |
| 109 | |
| 110 | # Command to build the TensorFlow Lite Micro library |
Richard Burton | b891dd3 | 2023-11-24 10:39:42 +0000 | [diff] [blame] | 111 | COMMAND ${CMAKE_COMMAND} -E env PATH="${ENV_PATH}" |
Conor Kennedy | b0d7e79 | 2022-10-13 15:32:02 +0100 | [diff] [blame] | 112 | make -j${PARALLEL_JOBS} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST} |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 113 | 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} |
alexander | 31ae9f0 | 2022-02-10 16:15:54 +0000 | [diff] [blame] | 119 | CMSIS_PATH=${CMSIS_SRC_PATH} |
Richard Burton | 71f282e | 2022-12-01 12:31:23 +0000 | [diff] [blame] | 120 | CMSIS_NN_PATH=${CMSIS_NN_SRC_PATH} |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 121 | # Conditional arguments |
Kshitij Sisodia | 774c7ca | 2024-04-12 11:30:02 +0100 | [diff] [blame] | 122 | $<$<BOOL:${ETHOS_U_NPU_ENABLED}>:ETHOSU_ARCH=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR_ARCH}> |
Nina Drozd | 68549b4 | 2022-02-15 14:32:57 +0000 | [diff] [blame] | 123 | $<$<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 Burton | 0d11059 | 2021-08-12 17:26:30 +0100 | [diff] [blame] | 126 | $<$<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 Sisodia | 987efae | 2023-02-14 16:28:40 +0000 | [diff] [blame] | 128 | $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:THIRD_PARTY_KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}> |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 129 | $<$<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 |
alexander | 31ae9f0 | 2022-02-10 16:15:54 +0000 | [diff] [blame] | 145 | |
Nina Drozd | 68549b4 | 2022-02-15 14:32:57 +0000 | [diff] [blame] | 146 | |
| 147 | set(TENSORFLOW_LITE_MICRO_TARGET tensorflow-lite-micro) |
| 148 | add_library(${TENSORFLOW_LITE_MICRO_TARGET} STATIC IMPORTED) |
| 149 | |
| 150 | if(ETHOS_U_NPU_ENABLED) |
| 151 | add_dependencies(tensorflow_build ethosu_core_driver) |
| 152 | endif() |
alexander | 31ae9f0 | 2022-02-10 16:15:54 +0000 | [diff] [blame] | 153 | |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 154 | add_dependencies(tensorflow-lite-micro tensorflow_build) |
alexander | 31ae9f0 | 2022-02-10 16:15:54 +0000 | [diff] [blame] | 155 | |
ayamas01 | 15f8070 | 2021-11-18 14:22:23 +0000 | [diff] [blame] | 156 | set_property(TARGET tensorflow-lite-micro PROPERTY IMPORTED_LOCATION |
| 157 | "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}") |
alexander | 31ae9f0 | 2022-02-10 16:15:54 +0000 | [diff] [blame] | 158 | |
| 159 | target_include_directories(tensorflow-lite-micro |
| 160 | INTERFACE |
| 161 | ${TENSORFLOW_SRC_PATH}) |
| 162 | |
| 163 | target_compile_definitions(tensorflow-lite-micro |
| 164 | INTERFACE |
Kshitij Sisodia | b1904b1 | 2022-04-21 09:48:10 +0100 | [diff] [blame] | 165 | TF_LITE_STATIC_MEMORY) |