alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 1 | #---------------------------------------------------------------------------- |
| 2 | # Copyright (c) 2021 Arm Limited. All rights reserved. |
| 3 | # 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 | |
| 18 | include(ProcessorCount) |
| 19 | ProcessorCount(J) |
| 20 | |
| 21 | if (CMAKE_BUILD_TYPE STREQUAL Debug) |
Richard Burton | 0d11059 | 2021-08-12 17:26:30 +0100 | [diff] [blame] | 22 | set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O0") |
| 23 | set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O0") |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 24 | elseif (CMAKE_BUILD_TYPE STREQUAL Release) |
Richard Burton | 0d11059 | 2021-08-12 17:26:30 +0100 | [diff] [blame] | 25 | set(TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL "-O3") |
| 26 | set(TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL "-O3") |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 27 | endif() |
| 28 | |
Kshitij Sisodia | b59ba68 | 2021-11-23 17:19:52 +0000 | [diff] [blame] | 29 | assert_defined(TENSORFLOW_LITE_MICRO_BUILD_TYPE) |
| 30 | assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS) |
| 31 | assert_defined(TENSORFLOW_LITE_MICRO_CLEAN_BUILD) |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 32 | |
| 33 | if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang") |
| 34 | set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "armclang") |
| 35 | elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") |
| 36 | set(TENSORFLOW_LITE_MICRO_TOOLCHAIN "gcc") |
| 37 | else () |
| 38 | message(FATAL_ERROR "No compiler ID is set") |
| 39 | endif() |
| 40 | |
| 41 | get_filename_component(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT ${CMAKE_C_COMPILER} DIRECTORY) |
| 42 | set(TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT "${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT}/") |
| 43 | |
| 44 | set(TENSORFLOW_LITE_MICRO_PATH "${TENSORFLOW_SRC_PATH}/tensorflow/lite/micro") |
| 45 | set(TENSORFLOW_LITE_MICRO_GENDIR ${CMAKE_CURRENT_BINARY_DIR}/tensorflow/) |
| 46 | |
ayamas01 | 15f8070 | 2021-11-18 14:22:23 +0000 | [diff] [blame] | 47 | |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 48 | set(ETHOS_EVAL_TARGET_MAKEFILE_INC ${CMAKE_CURRENT_SOURCE_DIR}/scripts/make/cortex_m_ethos_eval_makefile.inc) |
| 49 | |
| 50 | if (TARGET_PLATFORM STREQUAL native) |
| 51 | set(TENSORFLOW_LITE_MICRO_TARGET "linux") |
| 52 | set(TENSORFLOW_LITE_MICRO_TARGET_ARCH x86_64) |
| 53 | else() |
| 54 | set(TENSORFLOW_LITE_MICRO_TARGET "cortex_m_ethos_eval") |
| 55 | set(TENSORFLOW_LITE_MICRO_TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}${CPU_FEATURES}) |
Cisco Cervellera | f085fa5 | 2021-08-02 09:32:07 +0100 | [diff] [blame] | 56 | if(ETHOS_U_NPU_ENABLED) |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 57 | # Arm Ethos-U55 NPU is the co-processor for ML workload: |
| 58 | set(TENSORFLOW_LITE_MICRO_CO_PROCESSOR "ethos_u") |
| 59 | endif() |
| 60 | |
| 61 | set(TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL "cmsis_nn") |
| 62 | |
| 63 | # Copy over the target helper (cortex_m_ethos_eval) |
| 64 | file(COPY ${ETHOS_EVAL_TARGET_MAKEFILE_INC} |
| 65 | DESTINATION ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/targets/) |
| 66 | endif() |
| 67 | |
| 68 | if (TENSORFLOW_LITE_MICRO_CLEAN_DOWNLOADS) |
| 69 | list(APPEND MAKE_TARGETS_LIST "clean_downloads") |
| 70 | endif() |
| 71 | |
| 72 | if (TENSORFLOW_LITE_MICRO_CLEAN_BUILD) |
| 73 | list(APPEND MAKE_TARGETS_LIST "clean") |
| 74 | endif() |
| 75 | |
Richard Burton | 527b474 | 2021-11-26 12:17:19 +0000 | [diff] [blame] | 76 | if (ETHOS_U_NPU_ID) |
| 77 | string(TOLOWER ${ETHOS_U_NPU_ID} ETHOSU_ARCH) |
| 78 | endif() |
| 79 | |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 80 | # Primary target |
| 81 | list(APPEND MAKE_TARGETS_LIST "microlite") |
| 82 | message(STATUS "TensorFlow Lite Micro build to be called for these targets: ${MAKE_TARGETS_LIST}") |
| 83 | |
| 84 | # Commands and targets |
| 85 | add_custom_target(tensorflow_build ALL |
| 86 | |
| 87 | # Command to build the TensorFlow Lite Micro library |
| 88 | COMMAND make -j${J} -f ${TENSORFLOW_LITE_MICRO_PATH}/tools/make/Makefile ${MAKE_TARGETS_LIST} |
| 89 | TARGET_TOOLCHAIN_ROOT=${TENSORFLOW_LITE_MICRO_TARGET_TOOLCHAIN_ROOT} |
| 90 | TOOLCHAIN=${TENSORFLOW_LITE_MICRO_TOOLCHAIN} |
| 91 | GENDIR=${TENSORFLOW_LITE_MICRO_GENDIR} |
| 92 | TARGET=${TENSORFLOW_LITE_MICRO_TARGET} |
| 93 | TARGET_ARCH=${TENSORFLOW_LITE_MICRO_TARGET_ARCH} |
| 94 | BUILD_TYPE=${TENSORFLOW_LITE_MICRO_BUILD_TYPE} |
Richard Burton | 527b474 | 2021-11-26 12:17:19 +0000 | [diff] [blame] | 95 | ETHOSU_ARCH=${ETHOSU_ARCH} |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 96 | |
| 97 | # Conditional arguments |
Ayaan Masood | ccd0c66 | 2021-12-14 11:26:06 +0000 | [diff] [blame] | 98 | $<$<NOT:$<STREQUAL:${TARGET_PLATFORM},"native">>:ETHOSU_DRIVER_PATH=${ETHOS_U_NPU_DRIVER_SRC_PATH}> |
| 99 | $<$<NOT:$<STREQUAL:${TARGET_PLATFORM},"native">>:CMSIS_PATH=${CMSIS_SRC_PATH}> |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 100 | $<$<BOOL:${ARMCLANG_DEBUG_DWARF_LEVEL}>:ARMCLANG_DEBUG_DWARF_LEVEL=${ARMCLANG_DEBUG_DWARF_LEVEL}> |
Richard Burton | 0d11059 | 2021-08-12 17:26:30 +0100 | [diff] [blame] | 101 | $<$<BOOL:${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}>:CORE_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_CORE_OPTIMIZATION_LEVEL}> |
| 102 | $<$<BOOL:${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}>:KERNEL_OPTIMIZATION_LEVEL=${TENSORFLOW_LITE_MICRO_KERNEL_OPTIMIZATION_LEVEL}> |
alexander | 3c79893 | 2021-03-26 21:42:19 +0000 | [diff] [blame] | 103 | $<$<BOOL:${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}>:OPTIMIZED_KERNEL_DIR=${TENSORFLOW_LITE_MICRO_OPTIMIZED_KERNEL}> |
| 104 | $<$<BOOL:${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}>:CO_PROCESSOR=${TENSORFLOW_LITE_MICRO_CO_PROCESSOR}> |
| 105 | |
| 106 | # Command to copy over the generated library to the local build tree. |
| 107 | COMMAND ${CMAKE_COMMAND} -E copy ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME} |
| 108 | ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME} |
| 109 | |
| 110 | COMMENT "Building TensorFlow Lite Micro library..." |
| 111 | |
| 112 | BYPRODUCTS ${TENSORFLOW_SRC_PATH}/tensorflow/tensorflow/lite/micro/tools/make/downloads |
| 113 | ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME} |
| 114 | ${TENSORFLOW_LITE_MICRO_GENDIR}/lib/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME} |
| 115 | |
| 116 | WORKING_DIRECTORY ${TENSORFLOW_SRC_PATH}) |
| 117 | |
| 118 | # Create library |
| 119 | add_library(tensorflow-lite-micro STATIC IMPORTED) |
| 120 | add_dependencies(tensorflow-lite-micro tensorflow_build) |
ayamas01 | 15f8070 | 2021-11-18 14:22:23 +0000 | [diff] [blame] | 121 | set_property(TARGET tensorflow-lite-micro PROPERTY IMPORTED_LOCATION |
| 122 | "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME}") |