blob: a36d00d1370a7edba76fd5ad59adc894a26b2cd4 [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#----------------------------------------------------------------------------
Kshitij Sisodia9c6f9f82022-05-20 14:30:02 +010017cmake_minimum_required(VERSION 3.21.0)
alexander3c798932021-03-26 21:42:19 +000018
19# Build in release mode by default
20if (NOT CMAKE_BUILD_TYPE STREQUAL Debug)
21 set(CMAKE_BUILD_TYPE Release CACHE INTERNAL "")
22endif()
23
24message(STATUS "Build type is set to ${CMAKE_BUILD_TYPE}")
25
alexander31ae9f02022-02-10 16:15:54 +000026# Set language standards.
alexander3c798932021-03-26 21:42:19 +000027set(CMAKE_C_STANDARD 99)
ayamas0115f80702021-11-18 14:22:23 +000028set(CMAKE_CXX_STANDARD 14)
alexander3c798932021-03-26 21:42:19 +000029
30# Make the standard a requirement => prevent fallback to previous
31# supported standard
32set(CMAKE_C_STANDARD_REQUIRED ON)
33set(CMAKE_CXX_STANDARD_REQUIRED ON)
34
35# We want to pass standard C/C++ flags, without gnu extensions
36set(CMAKE_C_EXTENSIONS OFF)
37set(CMAKE_CXX_EXTENSIONS OFF)
38
alexander31ae9f02022-02-10 16:15:54 +000039set(SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/scripts)
40set(CMAKE_SCRIPTS_DIR ${SCRIPTS_DIR}/cmake)
41set(CMAKE_TOOLCHAIN_DIR ${CMAKE_SCRIPTS_DIR}/toolchains)
Kshitij Sisodiaf9c19ea2021-05-07 16:08:14 +010042set(DOWNLOAD_DEP_DIR ${CMAKE_BINARY_DIR}/dependencies)
alexander31ae9f02022-02-10 16:15:54 +000043set(DEPENDENCY_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dependencies)
Kshitij Sisodiac22e80e2022-03-14 09:26:48 +000044set(CORE_PLATFORM_DIR ${DEPENDENCY_ROOT_DIR}/core-platform)
alexander3c798932021-03-26 21:42:19 +000045
Kshitij Sisodiaddcb56d2021-05-11 14:46:01 +010046set(RESOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/resources_downloaded
47 CACHE PATH "Resources directory")
Kshitij Sisodiac22e80e2022-03-14 09:26:48 +000048set(HAL_PLATFORM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/source/hal/source/platform)
Kshitij Sisodiaddcb56d2021-05-11 14:46:01 +010049
alexander3c798932021-03-26 21:42:19 +000050include(${CMAKE_SCRIPTS_DIR}/source_gen_utils.cmake)
alexander3c798932021-03-26 21:42:19 +000051
Eanna O Cathain7bc68322022-05-31 14:14:32 +010052enable_testing()
53
alexander3c798932021-03-26 21:42:19 +000054if (${CMAKE_BINARY_DIR} STREQUAL ${CMAKE_SOURCE_DIR})
55 message(FATAL_ERROR "Source and build are in the same directory")
56else()
57 message(STATUS "Source directory: ${CMAKE_SOURCE_DIR}")
58 message(STATUS "Binary directory: ${CMAKE_BINARY_DIR}")
59endif()
60
Kshitij Sisodiab59ba682021-11-23 17:19:52 +000061include(${CMAKE_SCRIPTS_DIR}/common_user_options.cmake)
alexandercb8a9872022-02-11 13:23:22 +000062
Isabella Gottardief2b9dd2022-02-16 14:24:03 +000063# Check if the resources_downloaded needs update
64check_update_public_resources(${RESOURCES_DIR})
65
alexandercb8a9872022-02-11 13:23:22 +000066add_platform_build_configuration(TARGET_PLATFORM ${TARGET_PLATFORM})
alexander31ae9f02022-02-10 16:15:54 +000067
68set_platform_global_defaults()
69
70message(STATUS "Using CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
alexander3c798932021-03-26 21:42:19 +000071
Kshitij Sisodiab59ba682021-11-23 17:19:52 +000072# Make sure the following options are defined before proceeding:
73assert_defined(LOG_LEVEL)
74assert_defined(TENSORFLOW_SRC_PATH)
75assert_defined(TARGET_PLATFORM)
76assert_defined(TARGET_SUBSYSTEM)
77assert_defined(ETHOS_U_NPU_ENABLED)
78assert_defined(USE_CASE_BUILD)
79assert_defined(CPU_PROFILE_ENABLED)
80assert_defined(CMAKE_TOOLCHAIN_FILE)
Kshitij Sisodiaf9c19ea2021-05-07 16:08:14 +010081
Nina Drozd59169522022-02-10 13:33:20 +000082if(POLICY CMP0123)
83 cmake_policy(SET CMP0123 NEW)
84endif()
85
Kshitij Sisodiaf9c19ea2021-05-07 16:08:14 +010086project(arm_ml_embedded_evaluation_kit
Kshitij Sisodia7ac0a3a2022-11-09 14:12:08 +000087 VERSION 22.11.0
alexander31ae9f02022-02-10 16:15:54 +000088 DESCRIPTION "ARM ML Embedded Evaluation Kit"
89 LANGUAGES C CXX ASM)
Kshitij Sisodiaf9c19ea2021-05-07 16:08:14 +010090
alexander3c798932021-03-26 21:42:19 +000091enforce_compiler_version()
92setup_source_generator()
93
94set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
95set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
96set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
97set(SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/source)
Isabella Gottardi85209832021-04-20 14:08:52 +010098set(TEST_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/tests)
99list(APPEND USE_CASES_TESTS_SEARCH_DIR_LIST ${TEST_SRCS}/use_case)
alexander3c798932021-03-26 21:42:19 +0000100
alexander31ae9f02022-02-10 16:15:54 +0000101# We include log target
102add_subdirectory(${SRC_PATH}/log ${CMAKE_BINARY_DIR}/log)
alexander3c798932021-03-26 21:42:19 +0000103
alexander31ae9f02022-02-10 16:15:54 +0000104# We include arm_math target
105add_subdirectory(${SRC_PATH}/math ${CMAKE_BINARY_DIR}/math)
alexander3c798932021-03-26 21:42:19 +0000106
alexander31ae9f02022-02-10 16:15:54 +0000107# We include the hal target
108add_subdirectory(${SRC_PATH}/hal ${CMAKE_BINARY_DIR}/hal)
alexander3c798932021-03-26 21:42:19 +0000109
Kshitij Sisodiae2da7ee2022-02-14 11:22:58 +0000110# Add the profiler target
111if (NOT DEFINED PROFILER_DIR)
112 set(PROFILER_DIR ${SRC_PATH}/profiler)
113endif ()
114add_subdirectory(${PROFILER_DIR} ${CMAKE_BINARY_DIR}/profiler)
115
alexander31ae9f02022-02-10 16:15:54 +0000116# Include the tensorflow build target
alexander3c798932021-03-26 21:42:19 +0000117include(${CMAKE_SCRIPTS_DIR}/tensorflow.cmake)
118
Kshitij Sisodiaaa4bcb12022-05-06 09:13:03 +0100119# Add the common API library target (tensorflow-lite-micro target is needed)
120add_subdirectory(${SRC_PATH}/application/api/common ${CMAKE_BINARY_DIR}/api/common)
121
alexander31ae9f02022-02-10 16:15:54 +0000122# Include directories for application module:
123set(APPLICATION_INCLUDE_DIRS
Kshitij Sisodiae2da7ee2022-02-14 11:22:58 +0000124 ${SRC_PATH}/application/main/include)
alexander3c798932021-03-26 21:42:19 +0000125
alexander31ae9f02022-02-10 16:15:54 +0000126# Source files for application module:
alexander3c798932021-03-26 21:42:19 +0000127file(GLOB_RECURSE SRC_APPLICATION
128 "${SRC_PATH}/application/main/*.cc"
129 "${SRC_PATH}/application/main/*.cpp"
130 "${SRC_PATH}/application/main/*.c"
alexander3c798932021-03-26 21:42:19 +0000131 )
132list(FILTER SRC_APPLICATION EXCLUDE REGEX ".*main\\.c.*$")
alexander31ae9f02022-02-10 16:15:54 +0000133set(SRC_MAIN "${SRC_PATH}/application/main/Main.cc")
134set_source_files_properties(${SRC_MAIN}
135 PROPERTIES COMPILE_DEFINITIONS
136 "PRJ_VER_STR=\"${PROJECT_VERSION}\";PRJ_DES_STR=\"${PROJECT_DESCRIPTION}\"")
alexander3c798932021-03-26 21:42:19 +0000137
138list(JOIN USE_CASE_BUILD "" USE_CASE_BUILD_STR)
Isabella Gottardi85209832021-04-20 14:08:52 +0100139list(APPEND USE_CASES_SEARCH_DIR_LIST ${SRC_PATH}/use_case)
140message(STATUS "Use-cases source paths: ${USE_CASES_SEARCH_DIR_LIST}.")
alexander31ae9f02022-02-10 16:15:54 +0000141
alexander3c798932021-03-26 21:42:19 +0000142if (${USE_CASE_BUILD_STR} STREQUAL all)
Isabella Gottardi85209832021-04-20 14:08:52 +0100143 foreach(USE_CASES_SEARCH_DIR ${USE_CASES_SEARCH_DIR_LIST})
144 SUBDIRLIST(USE_CASES_SUBDIRS ${USE_CASES_SEARCH_DIR})
145 list(APPEND USE_CASES ${USE_CASES_SUBDIRS})
146 endforeach()
alexander3c798932021-03-26 21:42:19 +0000147else()
148 set(USE_CASES ${USE_CASE_BUILD})
149endif()
150
alexandercb8a9872022-02-11 13:23:22 +0000151list(REMOVE_ITEM USE_CASES "" ${EXCLUDED_USE_CASES})
152message(STATUS "Use-cases excluded by platform configuration: ${EXCLUDED_USE_CASES}")
alexander3c798932021-03-26 21:42:19 +0000153message(STATUS "Building use-cases: ${USE_CASES}.")
Eanna O Cathain7bc68322022-05-31 14:14:32 +0100154
alexander3c798932021-03-26 21:42:19 +0000155foreach(use_case ${USE_CASES})
156
Isabella Gottardi85209832021-04-20 14:08:52 +0100157 set(SRC_USE_CASE "")
158 foreach(USE_CASES_SEARCH_DIR ${USE_CASES_SEARCH_DIR_LIST})
159 if (EXISTS ${USE_CASES_SEARCH_DIR}/${use_case})
160 message(STATUS "Found sources for use-case ${use_case}")
161 set(SRC_USE_CASE ${USE_CASES_SEARCH_DIR})
162 break()
163 endif ()
164 endforeach()
165
166 if (${SRC_USE_CASE} STREQUAL "")
167 message(FATAL_ERROR "Failed to find sources for ${use_case}!")
alexander3c798932021-03-26 21:42:19 +0000168 endif ()
Kshitij Sisodia661959c2021-11-24 10:39:52 +0000169
alexander3c798932021-03-26 21:42:19 +0000170 # Executable application:
171 set(TARGET_NAME "ethos-u-${use_case}")
172
alexander31ae9f02022-02-10 16:15:54 +0000173 set(DEFAULT_MODEL_DIR ${RESOURCES_DIR}/${use_case})
174 set(DEFAULT_TEST_DATA_DIR ${DEFAULT_MODEL_DIR})
alexander3c798932021-03-26 21:42:19 +0000175 set(SRC_GEN_DIR ${CMAKE_BINARY_DIR}/generated/${use_case}/src)
176 set(INC_GEN_DIR ${CMAKE_BINARY_DIR}/generated/${use_case}/include)
177
178 # Remove old files and recreate dirs
179 file(REMOVE_RECURSE ${SRC_GEN_DIR} ${INC_GEN_DIR})
180 file(MAKE_DIRECTORY ${SRC_GEN_DIR} ${INC_GEN_DIR})
181
alexander31ae9f02022-02-10 16:15:54 +0000182 file(GLOB UC_CMAKE_FILE
183 "${SRC_USE_CASE}/${use_case}/*.cmake")
184
Kshitij Sisodiaaa4bcb12022-05-06 09:13:03 +0100185 # Include the use case cmake file.
alexander31ae9f02022-02-10 16:15:54 +0000186 include(${UC_CMAKE_FILE})
187
alexander3c798932021-03-26 21:42:19 +0000188 file(GLOB_RECURSE UC_SRC
Isabella Gottardi85209832021-04-20 14:08:52 +0100189 "${SRC_USE_CASE}/${use_case}/src/*.cpp"
190 "${SRC_USE_CASE}/${use_case}/src/*.cc"
191 "${SRC_USE_CASE}/${use_case}/src/*.c"
192 "${SRC_USE_CASE}/${use_case}/src/**/*.cpp"
193 "${SRC_USE_CASE}/${use_case}/src/**/*.cc"
alexander31ae9f02022-02-10 16:15:54 +0000194 "${SRC_USE_CASE}/${use_case}/src/**/*.c")
alexander3c798932021-03-26 21:42:19 +0000195
196 file(GLOB_RECURSE SRC_GEN
197 "${SRC_GEN_DIR}/*.cc"
198 "${SRC_GEN_DIR}/*.cpp"
alexander31ae9f02022-02-10 16:15:54 +0000199 "${SRC_GEN_DIR}/*.c")
alexander3c798932021-03-26 21:42:19 +0000200
alexander31ae9f02022-02-10 16:15:54 +0000201 set(UC_INCLUDE ${SRC_USE_CASE}/${use_case}/include)
alexander3c798932021-03-26 21:42:19 +0000202
Kshitij Sisodiaaa5e1f62021-09-24 14:42:08 +0100203 if (DEFINED ${use_case}_COMPILE_DEFS)
204 message(STATUS "Additional compilation flags for ${use_case}: ${${use_case}_COMPILE_DEFS}")
205 set_source_files_properties(${UC_SRC}
206 PROPERTIES COMPILE_DEFINITIONS
207 "${${use_case}_COMPILE_DEFS}")
208 endif()
209
Kshitij Sisodiaaa4bcb12022-05-06 09:13:03 +0100210 set(UC_LIB_NAME ${use_case})
alexander3c798932021-03-26 21:42:19 +0000211
212 # Consolidated application static lib:
213 add_library(${UC_LIB_NAME} STATIC
214 ${SRC_APPLICATION}
alexander3c798932021-03-26 21:42:19 +0000215 ${UC_SRC}
alexander31ae9f02022-02-10 16:15:54 +0000216 ${SRC_GEN})
217
alexander3c798932021-03-26 21:42:19 +0000218 target_include_directories(${UC_LIB_NAME} PUBLIC
219 ${APPLICATION_INCLUDE_DIRS}
alexander3c798932021-03-26 21:42:19 +0000220 ${UC_INCLUDE}
Kshitij Sisodiaaa4bcb12022-05-06 09:13:03 +0100221 ${INC_GEN_DIR})
alexander3c798932021-03-26 21:42:19 +0000222
223 # Set the activation buffer size
224 target_compile_definitions(${UC_LIB_NAME} PUBLIC
Kshitij Sisodiaaa4bcb12022-05-06 09:13:03 +0100225 "ACTIVATION_BUF_SZ=${${use_case}_ACTIVATION_BUF_SZ}")
alexander3c798932021-03-26 21:42:19 +0000226
alexander31ae9f02022-02-10 16:15:54 +0000227 target_link_libraries(${UC_LIB_NAME} PUBLIC
228 log
229 arm_math
230 hal
Kshitij Sisodiae2da7ee2022-02-14 11:22:58 +0000231 profiler
Kshitij Sisodia9c6f9f82022-05-20 14:30:02 +0100232 tensorflow-lite-micro
233 common_api)
alexander3c798932021-03-26 21:42:19 +0000234
Kshitij Sisodiaaa4bcb12022-05-06 09:13:03 +0100235 # If an API exists for this use case, include the projects here and add to
236 # the library list.
237 foreach(API_TO_USE ${${use_case}_API_LIST})
238
239 # If the required target doesn't yet exist, include the project here:
240 if (NOT TARGET ${API_TO_USE}_api)
241 add_subdirectory(
242 ${SRC_PATH}/application/api/use_case/${API_TO_USE} # Source path
243 ${CMAKE_BINARY_DIR}/api/use_case/${API_TO_USE}) # Binary path
244 endif()
245
246 # Check if the target now exists
247 if (TARGET ${API_TO_USE}_api)
248 message(STATUS "Using ${API_TO_USE}_api for ${use_case}")
249 target_link_libraries(${UC_LIB_NAME} PUBLIC ${API_TO_USE}_api)
250 else()
251 message(FATAL_ERROR "${API_TO_USE}_api target not found!")
252 endif()
253 endforeach()
254
alexander31ae9f02022-02-10 16:15:54 +0000255 add_executable(${TARGET_NAME} ${SRC_MAIN})
alexander3c798932021-03-26 21:42:19 +0000256
alexander31ae9f02022-02-10 16:15:54 +0000257 target_link_libraries(${TARGET_NAME} PUBLIC ${UC_LIB_NAME})
alexander3c798932021-03-26 21:42:19 +0000258
alexander31ae9f02022-02-10 16:15:54 +0000259 platform_custom_post_build(TARGET_NAME ${TARGET_NAME})
alexander3c798932021-03-26 21:42:19 +0000260
alexander3c798932021-03-26 21:42:19 +0000261endforeach()
262
Kshitij Sisodiaa1256e32022-02-23 14:40:45 +0000263print_useroptions()