blob: 2f47f6cabd3dc0643e03f4bc9938d63d1928b00f [file] [log] [blame]
Tamas Ban581034a2017-12-19 19:54:37 +00001#------------------------------------------------------------------------------
David Vincze4638b2a2019-05-24 10:14:23 +02002# Copyright (c) 2017-2019, Arm Limited. All rights reserved.
Tamas Ban581034a2017-12-19 19:54:37 +00003#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#------------------------------------------------------------------------------
7
8cmake_minimum_required(VERSION 3.7)
9
David Hu857bfa52019-05-21 13:54:50 +080010set(TFM_BUILD_IN_SPE ON)
11
Tamas Ban581034a2017-12-19 19:54:37 +000012#Tell cmake where our modules can be found
13list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/../../../cmake)
14
Ken Liue40f9a22019-06-03 16:42:47 +080015#Set variables to appropriate path
16set(MCUBOOT_DIR ${CMAKE_CURRENT_LIST_DIR})
17get_filename_component(TFM_ROOT_DIR "${MCUBOOT_DIR}/../../.." ABSOLUTE)
18
Tamas Ban581034a2017-12-19 19:54:37 +000019#Include common stuff to control cmake.
20include("Common/BuildSys")
21
22#Start an embedded project.
Ken Liue40f9a22019-06-03 16:42:47 +080023embedded_project_start(CONFIG "${TFM_ROOT_DIR}/configs/ConfigDefault.cmake")
Tamas Ban581034a2017-12-19 19:54:37 +000024project(mcuboot LANGUAGES ASM C)
25embedded_project_fixup()
26
27#Check input variables
28if (NOT DEFINED BL2)
29 message(FATAL ERROR "Incomplete build configuration: BL2 is undefined.")
30elseif(NOT BL2)
31 #If mcuboot is not need to be built then stop further processing.
32 return()
33endif()
34
Raef Coles1bb168e2019-10-17 09:04:55 +010035if (NOT DEFINED MBEDCRYPTO_C_FLAGS_BL2)
36 message(FATAL_ERROR "Incomplete build configuration: MBEDCRYPTO_C_FLAGS_BL2 is undefined.")
Tamas Ban581034a2017-12-19 19:54:37 +000037endif()
38
Marc Moreno Berenguea1f296f2018-01-25 15:21:22 +000039set(BUILD_CMSIS_CORE On)
40set(BUILD_RETARGET On)
41set(BUILD_NATIVE_DRIVERS On)
42set(BUILD_STARTUP On)
43set(BUILD_TARGET_CFG Off)
David Vincze060968d2019-05-23 01:13:14 +020044set(BUILD_TARGET_NV_COUNTERS On)
Marc Moreno Berenguea1f296f2018-01-25 15:21:22 +000045set(BUILD_CMSIS_DRIVERS On)
46set(BUILD_TIME Off)
47set(BUILD_UART_STDOUT On)
48set(BUILD_FLASH On)
Mate Toth-Pald3c77662019-02-20 16:23:00 +010049set(BUILD_PLAT_TEST Off)
Tamas Band4bf3472019-09-06 12:59:56 +010050set(BUILD_BOOT_HAL On)
Tamas Band0f4e1d2019-07-11 09:39:03 +010051
52if (MCUBOOT_HW_KEY)
53 set(BUILD_TARGET_HARDWARE_KEYS On)
54else()
55 set(BUILD_TARGET_HARDWARE_KEYS Off)
56endif()
57
Marc Moreno Berenguea1f296f2018-01-25 15:21:22 +000058if(NOT DEFINED PLATFORM_CMAKE_FILE)
59 message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
60elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
61 message (FATAL_ERROR "Platform specific CMake \"${PLATFORM_CMAKE_FILE}\" file does not exist. Please fix value of PLATFORM_CMAKE_FILE.")
62else()
63 include(${PLATFORM_CMAKE_FILE})
64endif()
65
David Hu857bfa52019-05-21 13:54:50 +080066#Add platform specific definitions in SPE
67if (DEFINED TFM_PLATFORM_SECURE_DEFS)
68 embedded_set_target_compile_defines(TARGET ${PROJECT_NAME} LANGUAGE C DEFINES ${TFM_PLATFORM_SECURE_DEFS} APPEND)
69 embedded_set_target_compile_defines(TARGET ${PROJECT_NAME} LANGUAGE ASM DEFINES ${TFM_PLATFORM_SECURE_DEFS} APPEND)
70endif()
71
Tamas Ban581034a2017-12-19 19:54:37 +000072#Append all our source files to global lists.
Tamas Bana9de4a62018-09-18 08:09:45 +010073list(APPEND ALL_SRC_C
74 "${MCUBOOT_DIR}/bl2_main.c"
David Vinczecea8b592019-10-29 16:09:51 +010075 "${MCUBOOT_DIR}/flash_map_extended.c"
76 "${MCUBOOT_DIR}/flash_map_legacy.c"
Tamas Ban581034a2017-12-19 19:54:37 +000077 "${MCUBOOT_DIR}/keys.c"
78 "${MCUBOOT_DIR}/bootutil/src/loader.c"
79 "${MCUBOOT_DIR}/bootutil/src/bootutil_misc.c"
80 "${MCUBOOT_DIR}/bootutil/src/image_validate.c"
81 "${MCUBOOT_DIR}/bootutil/src/image_rsa.c"
David Vincze07706a42019-12-12 18:20:12 +010082 "${MCUBOOT_DIR}/bootutil/src/tlv.c"
David Vinczecea8b592019-10-29 16:09:51 +010083 "${TFM_ROOT_DIR}/bl2/src/flash_map.c"
Tamas Bana9de4a62018-09-18 08:09:45 +010084 "${TFM_ROOT_DIR}/bl2/src/boot_record.c"
David Vincze060968d2019-05-23 01:13:14 +020085 "${TFM_ROOT_DIR}/bl2/src/security_cnt.c"
Tamas Ban581034a2017-12-19 19:54:37 +000086 )
87
Raef Coles1bb168e2019-10-17 09:04:55 +010088#Define location of Mbed Crypto source, build, and installation directory.
David Vinczecea8b592019-10-29 16:09:51 +010089set(MBEDTLS_CONFIG_FILE "config-rsa.h")
Raef Coles0e82adc2019-10-17 15:06:26 +010090set(MBEDTLS_CONFIG_PATH "${TFM_ROOT_DIR}/bl2/ext/mcuboot/include")
Raef Coles1bb168e2019-10-17 09:04:55 +010091get_filename_component(MBEDCRYPTO_SOURCE_DIR "${TFM_ROOT_DIR}/../mbed-crypto" ABSOLUTE)
92if(NOT EXISTS ${MBEDCRYPTO_SOURCE_DIR})
93 message(FATAL_ERROR "Missing mbed-crypto. Please clone the mbed-crypto repo to directory \"${MBEDCRYPTO_SOURCE_DIR}\".")
Tamas Ban581034a2017-12-19 19:54:37 +000094endif()
Raef Coles1bb168e2019-10-17 09:04:55 +010095set (MBEDCRYPTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/mbed-crypto/build")
96set (MBEDCRYPTO_INSTALL_DIR ${MBEDCRYPTO_BINARY_DIR}/../install)
Tamas Ban581034a2017-12-19 19:54:37 +000097
Tamas Banf824e742019-10-25 21:22:26 +010098if (CRYPTO_HW_ACCELERATOR OR CRYPTO_HW_ACCELERATOR_OTP_STATE STREQUAL "PROVISIONING")
Raef Coles0e82adc2019-10-17 15:06:26 +010099 if(NOT DEFINED CRYPTO_HW_ACCELERATOR_CMAKE_BUILD)
100 message(FATAL_ERROR "CRYPTO_HW_ACCELERATOR_CMAKE_BUILD not defined.")
101 endif()
102 include(${CRYPTO_HW_ACCELERATOR_CMAKE_BUILD})
103endif()
104
Raef Coles1bb168e2019-10-17 09:04:55 +0100105#Build Mbed Crypto as external project.
106#This ensures Mbed Crypto is built with exactly defined settings.
Raef Coles0e82adc2019-10-17 15:06:26 +0100107#Mbed Crypto will be used from its install location
108string(APPEND MBEDCRYPTO_C_FLAGS " ${MBEDCRYPTO_C_FLAGS_BL2}")
Raef Coles1bb168e2019-10-17 09:04:55 +0100109set(MBEDCRYPTO_TARGET_NAME "mbedcrypto_mcuboot_lib")
110include(${TFM_ROOT_DIR}/BuildMbedCrypto.cmake)
Tamas Ban581034a2017-12-19 19:54:37 +0000111
112#Setting include directories
Tamas Bandb69d522018-03-01 10:04:41 +0000113embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR} ABSOLUTE APPEND)
Raef Coles4d6ea2f2019-10-15 14:30:40 +0100114embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/interface/include ABSOLUTE APPEND)
Tamas Bana9de4a62018-09-18 08:09:45 +0100115embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/include ABSOLUTE APPEND)
Tamas Bandb69d522018-03-01 10:04:41 +0000116embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/include ABSOLUTE APPEND)
117embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/bootutil/include/ ABSOLUTE APPEND)
Raef Coles1bb168e2019-10-17 09:04:55 +0100118embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${MBEDCRYPTO_INSTALL_DIR}/include ABSOLUTE APPEND)
Tamas Ban581034a2017-12-19 19:54:37 +0000119
120#Define linker file
Mate Toth-Pal48fc6a02018-01-24 09:50:14 +0100121if(NOT DEFINED BL2_LINKER_CONFIG)
122 message(FATAL_ERROR "ERROR: Incomplete Configuration: BL2_LINKER_CONFIG is not defined.")
123endif()
Gabor Kerteszd7d7d742018-07-04 11:50:05 +0200124embedded_set_target_linker_file(TARGET ${PROJECT_NAME} PATH "${BL2_LINKER_CONFIG}")
125
126if(NOT DEFINED PLATFORM_LINK_INCLUDES)
127 message(FATAL_ERROR "ERROR: Incomplete Configuration: PLATFORM_LINK_INCLUDES is not defined.")
128endif()
129embedded_set_target_link_includes(TARGET ${PROJECT_NAME} INCLUDES "${PLATFORM_LINK_INCLUDES}")
Tamas Ban581034a2017-12-19 19:54:37 +0000130
David Hu857bfa52019-05-21 13:54:50 +0800131add_executable(${PROJECT_NAME} ${ALL_SRC_ASM} ${ALL_SRC_C_BL2} ${ALL_SRC_ASM_BL2} ${ALL_SRC_C} ${ALL_SRC_CXX})
Tamas Ban581034a2017-12-19 19:54:37 +0000132
Tamas Bandb69d522018-03-01 10:04:41 +0000133#Set common compiler and linker flags
134config_setting_shared_compiler_flags(${PROJECT_NAME})
135config_setting_shared_linker_flags(${PROJECT_NAME})
136
David Vincze63eda7a2019-08-09 17:42:51 +0200137#Add BL2 and MCUBOOT_IMAGE_NUMBER defines to linker to resolve symbols in region_defs.h and flash_layout.h
138embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "BL2" "MCUBOOT_IMAGE_NUMBER=${MCUBOOT_IMAGE_NUMBER}")
Tamas Ban581034a2017-12-19 19:54:37 +0000139
Marc Moreno Berenguecae2c532018-10-09 12:58:46 +0100140if(NOT DEFINED TEST_FRAMEWORK_S)
141 message(FATAL_ERROR "Incomplete build configuration: TEST_FRAMEWORK_S is undefined.")
142elseif(TEST_FRAMEWORK_S)
143 embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "TEST_FRAMEWORK_S")
144endif()
145
146if(NOT DEFINED TEST_FRAMEWORK_NS)
147 message(FATAL_ERROR "Incomplete build configuration: TEST_FRAMEWORK_NS is undefined.")
148elseif(TEST_FRAMEWORK_NS)
149 embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "TEST_FRAMEWORK_NS")
150endif()
151
Tamas Ban581034a2017-12-19 19:54:37 +0000152#Link mbedcrypto library to project
Raef Coles1bb168e2019-10-17 09:04:55 +0100153target_link_libraries(${PROJECT_NAME} "${MBEDCRYPTO_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX_C}mbedcrypto${CMAKE_STATIC_LIBRARY_SUFFIX_C}")
154add_dependencies(${PROJECT_NAME} ${MBEDCRYPTO_TARGET_NAME}_install)
Tamas Ban581034a2017-12-19 19:54:37 +0000155
Raef Coles0e82adc2019-10-17 15:06:26 +0100156#Link crypto accelerator libraries if applicable
Tamas Banf824e742019-10-25 21:22:26 +0100157if (CRYPTO_HW_ACCELERATOR OR CRYPTO_HW_ACCELERATOR_OTP_STATE STREQUAL "PROVISIONING")
Raef Coles0e82adc2019-10-17 15:06:26 +0100158 if(NOT DEFINED CRYPTO_HW_ACCELERATOR_CMAKE_LINK)
159 message(FATAL_ERROR "CRYPTO_HW_ACCELERATOR_CMAKE_LINK not defined.")
160 endif()
161 include(${CRYPTO_HW_ACCELERATOR_CMAKE_LINK})
162endif()
163
Tamas Ban581034a2017-12-19 19:54:37 +0000164#Generate binary file from axf
165compiler_generate_binary_output(${PROJECT_NAME})
166
David Vincze73dfbc52019-10-11 13:54:58 +0200167message("- MCUBOOT_IMAGE_NUMBER: '${MCUBOOT_IMAGE_NUMBER}'.")
168message("- MCUBOOT_UPGRADE_STRATEGY: '${MCUBOOT_UPGRADE_STRATEGY}'.")
169message("- MCUBOOT_SIGNATURE_TYPE: '${MCUBOOT_SIGNATURE_TYPE}'.")
170message("- MCUBOOT_HW_KEY: '${MCUBOOT_HW_KEY}'.")
171message("- MCUBOOT_LOG_LEVEL: '${MCUBOOT_LOG_LEVEL}'.")
David Vincze54d05552019-08-05 12:58:47 +0200172
Tamas Ban581034a2017-12-19 19:54:37 +0000173#Set macro definitions for the project.
174target_compile_definitions(${PROJECT_NAME} PRIVATE
David Vincze8bdfc2d2019-03-18 15:49:23 +0100175 MCUBOOT_VALIDATE_PRIMARY_SLOT
Tamas Ban581034a2017-12-19 19:54:37 +0000176 MCUBOOT_USE_FLASH_AREA_GET_SECTORS
Raef Coles0e82adc2019-10-17 15:06:26 +0100177 MBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}"
Tamas Bandb69d522018-03-01 10:04:41 +0000178 MCUBOOT_TARGET_CONFIG="flash_layout.h")
179
Tamas Ban7801ed42019-05-20 13:21:53 +0100180if (MCUBOOT_SIGNATURE_TYPE STREQUAL "RSA-3072")
181 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_SIGN_RSA MCUBOOT_SIGN_RSA_LEN=3072)
182elseif(MCUBOOT_SIGNATURE_TYPE STREQUAL "RSA-2048")
183 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_SIGN_RSA MCUBOOT_SIGN_RSA_LEN=2048)
184else()
185 message(FATAL_ERROR "${MCUBOOT_SIGNATURE_TYPE} is not supported as firmware signing algorithm")
186endif()
187
David Vincze4638b2a2019-05-24 10:14:23 +0200188if (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "OVERWRITE_ONLY")
189 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_OVERWRITE_ONLY)
190elseif (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "NO_SWAP")
Tamas Bandb69d522018-03-01 10:04:41 +0000191 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_NO_SWAP)
David Vincze4638b2a2019-05-24 10:14:23 +0200192elseif (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "RAM_LOADING")
Oliver Swedef9982442018-08-24 18:37:44 +0100193 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_RAM_LOADING)
David Vincze4638b2a2019-05-24 10:14:23 +0200194elseif (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "SWAP")
195 #No compile definition needs to be specified for this upgrade strategy
196else()
David Vincze54d05552019-08-05 12:58:47 +0200197 get_property(_upgrade_strategies CACHE MCUBOOT_UPGRADE_STRATEGY PROPERTY STRINGS)
198 message(FATAL_ERROR "ERROR: MCUBoot supports the ${_upgrade_strategies} upgrade strategies only.")
Oliver Swedef9982442018-08-24 18:37:44 +0100199endif()
200
Tamas Band0f4e1d2019-07-11 09:39:03 +0100201if (MCUBOOT_HW_KEY)
202 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_HW_KEY)
203endif()
204
David Vincze219a1752019-10-14 11:35:09 +0200205if (ATTEST_BOOT_INTERFACE STREQUAL "INDIVIDUAL_CLAIMS")
206 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_INDIVIDUAL_CLAIMS)
207 message(WARNING "ATTEST_BOOT_INTERFACE was set to ${ATTEST_BOOT_INTERFACE}. This configuration is "
208 "deprecated and this feature will probably be removed from MCUBoot in the future.")
209endif()
210
David Vincze73dfbc52019-10-11 13:54:58 +0200211#Configure log level for MCUBoot.
212get_property(_log_levels CACHE MCUBOOT_LOG_LEVEL PROPERTY STRINGS)
213list(FIND _log_levels ${MCUBOOT_LOG_LEVEL} LOG_LEVEL_ID)
David Vincze99f1b362019-12-12 16:17:35 +0100214target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_LOG_LEVEL=${LOG_LEVEL_ID})
David Vincze73dfbc52019-10-11 13:54:58 +0200215
Tamas Bandb69d522018-03-01 10:04:41 +0000216#Set install location. Keep original value to avoid overriding command line settings.
217if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
218 set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install location for MCUBoot." FORCE)
219endif()
220
221#Collect executables to common location: build/install/outputs/
222install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.axf
223 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.bin
224 DESTINATION outputs/${TARGET_PLATFORM}/)
225
226install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.axf
227 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.bin
228 DESTINATION outputs/fvp/)
Tamas Ban581034a2017-12-19 19:54:37 +0000229
230#Finally let cmake system apply changes after the whole project is defined.
231embedded_project_end(${PROJECT_NAME})