blob: 6f8cad8fde6a7a7b6e514ca7dca7909a2cb6c511 [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
10#Tell cmake where our modules can be found
11list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/../../../cmake)
12
Ken Liue40f9a22019-06-03 16:42:47 +080013#Set variables to appropriate path
14set(MCUBOOT_DIR ${CMAKE_CURRENT_LIST_DIR})
15get_filename_component(TFM_ROOT_DIR "${MCUBOOT_DIR}/../../.." ABSOLUTE)
16
Tamas Ban581034a2017-12-19 19:54:37 +000017#Include common stuff to control cmake.
18include("Common/BuildSys")
19
20#Start an embedded project.
Ken Liue40f9a22019-06-03 16:42:47 +080021embedded_project_start(CONFIG "${TFM_ROOT_DIR}/configs/ConfigDefault.cmake")
Tamas Ban581034a2017-12-19 19:54:37 +000022project(mcuboot LANGUAGES ASM C)
23embedded_project_fixup()
24
25#Check input variables
26if (NOT DEFINED BL2)
27 message(FATAL ERROR "Incomplete build configuration: BL2 is undefined.")
28elseif(NOT BL2)
29 #If mcuboot is not need to be built then stop further processing.
30 return()
31endif()
32
Tamas Ban581034a2017-12-19 19:54:37 +000033if (NOT DEFINED MBEDTLS_C_FLAGS_BL2)
34 message(FATAL_ERROR "Incomplete build configuration: MBEDTLS_C_FLAGS_BL2 is undefined.")
35endif()
36
Marc Moreno Berenguea1f296f2018-01-25 15:21:22 +000037set(BUILD_CMSIS_CORE On)
38set(BUILD_RETARGET On)
39set(BUILD_NATIVE_DRIVERS On)
40set(BUILD_STARTUP On)
41set(BUILD_TARGET_CFG Off)
42set(BUILD_TARGET_HARDWARE_KEYS Off)
David Vincze060968d2019-05-23 01:13:14 +020043set(BUILD_TARGET_NV_COUNTERS On)
Marc Moreno Berenguea1f296f2018-01-25 15:21:22 +000044set(BUILD_CMSIS_DRIVERS On)
45set(BUILD_TIME Off)
46set(BUILD_UART_STDOUT On)
47set(BUILD_FLASH On)
Mate Toth-Pald3c77662019-02-20 16:23:00 +010048set(BUILD_PLAT_TEST Off)
Marc Moreno Berenguea1f296f2018-01-25 15:21:22 +000049if(NOT DEFINED PLATFORM_CMAKE_FILE)
50 message (FATAL_ERROR "Platform specific CMake is not defined. Please set PLATFORM_CMAKE_FILE.")
51elseif(NOT EXISTS ${PLATFORM_CMAKE_FILE})
52 message (FATAL_ERROR "Platform specific CMake \"${PLATFORM_CMAKE_FILE}\" file does not exist. Please fix value of PLATFORM_CMAKE_FILE.")
53else()
54 include(${PLATFORM_CMAKE_FILE})
55endif()
56
Tamas Ban581034a2017-12-19 19:54:37 +000057#Append all our source files to global lists.
Tamas Bana9de4a62018-09-18 08:09:45 +010058list(APPEND ALL_SRC_C
59 "${MCUBOOT_DIR}/bl2_main.c"
Tamas Ban581034a2017-12-19 19:54:37 +000060 "${MCUBOOT_DIR}/flash_map.c"
Tamas Ban581034a2017-12-19 19:54:37 +000061 "${MCUBOOT_DIR}/keys.c"
62 "${MCUBOOT_DIR}/bootutil/src/loader.c"
63 "${MCUBOOT_DIR}/bootutil/src/bootutil_misc.c"
64 "${MCUBOOT_DIR}/bootutil/src/image_validate.c"
65 "${MCUBOOT_DIR}/bootutil/src/image_rsa.c"
66 "${MCUBOOT_DIR}/bootutil/src/caps.c"
Tamas Bana9de4a62018-09-18 08:09:45 +010067 "${TFM_ROOT_DIR}/bl2/src/boot_record.c"
David Vincze060968d2019-05-23 01:13:14 +020068 "${TFM_ROOT_DIR}/bl2/src/security_cnt.c"
Tamas Ban581034a2017-12-19 19:54:37 +000069 )
70
71#Define location of mbedtls source, build, and installation directory.
72get_filename_component(MBEDTLS_SOURCE_DIR "${TFM_ROOT_DIR}/../mbedtls" ABSOLUTE)
73if(NOT EXISTS ${MBEDTLS_SOURCE_DIR})
74 message(FATAL_ERROR "Missing mbedtls. Please clone the mbedtls repo to directory \"${MBEDTLS_SOURCE_DIR}\".")
75endif()
76set (MBEDTLS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/mbedtls")
77set (MBEDTLS_INSTALL_DIR ${MBEDTLS_BINARY_DIR}/mbedtls_install)
78
Tamas Ban581034a2017-12-19 19:54:37 +000079#Build mbedtls as external project.
80#This ensures mbedtls is built with exactly defined settings.
81#mbedtls will be used from is't install location
82set(MBEDTLS_C_FLAGS ${MBEDTLS_C_FLAGS_BL2})
83set(MBEDTLS_TARGET_NAME "mbedtls_mcuboot_lib")
84include(${TFM_ROOT_DIR}/BuildMbedtls.cmake)
85
86#Setting include directories
Tamas Bandb69d522018-03-01 10:04:41 +000087embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR} ABSOLUTE APPEND)
Tamas Bana9de4a62018-09-18 08:09:45 +010088embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/include ABSOLUTE APPEND)
Tamas Bandb69d522018-03-01 10:04:41 +000089embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/include ABSOLUTE APPEND)
90embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/bootutil/include/ ABSOLUTE APPEND)
91embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${MBEDTLS_INSTALL_DIR}/include ABSOLUTE APPEND)
Tamas Ban581034a2017-12-19 19:54:37 +000092
93#Define linker file
Mate Toth-Pal48fc6a02018-01-24 09:50:14 +010094if(NOT DEFINED BL2_LINKER_CONFIG)
95 message(FATAL_ERROR "ERROR: Incomplete Configuration: BL2_LINKER_CONFIG is not defined.")
96endif()
Gabor Kerteszd7d7d742018-07-04 11:50:05 +020097embedded_set_target_linker_file(TARGET ${PROJECT_NAME} PATH "${BL2_LINKER_CONFIG}")
98
99if(NOT DEFINED PLATFORM_LINK_INCLUDES)
100 message(FATAL_ERROR "ERROR: Incomplete Configuration: PLATFORM_LINK_INCLUDES is not defined.")
101endif()
102embedded_set_target_link_includes(TARGET ${PROJECT_NAME} INCLUDES "${PLATFORM_LINK_INCLUDES}")
Tamas Ban581034a2017-12-19 19:54:37 +0000103
Mate Toth-Pal48fc6a02018-01-24 09:50:14 +0100104add_executable(${PROJECT_NAME} ${ALL_SRC_ASM_BL2} ${ALL_SRC_C} ${ALL_SRC_CXX})
Tamas Ban581034a2017-12-19 19:54:37 +0000105
Tamas Bandb69d522018-03-01 10:04:41 +0000106#Set common compiler and linker flags
107config_setting_shared_compiler_flags(${PROJECT_NAME})
108config_setting_shared_linker_flags(${PROJECT_NAME})
109
Tamas Ban581034a2017-12-19 19:54:37 +0000110#Add BL2 define to linker to resolve symbols in region_defs.h
Mate Toth-Pal76867262018-03-09 13:15:36 +0100111embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "BL2")
Tamas Ban581034a2017-12-19 19:54:37 +0000112
Marc Moreno Berenguecae2c532018-10-09 12:58:46 +0100113if(NOT DEFINED TEST_FRAMEWORK_S)
114 message(FATAL_ERROR "Incomplete build configuration: TEST_FRAMEWORK_S is undefined.")
115elseif(TEST_FRAMEWORK_S)
116 embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "TEST_FRAMEWORK_S")
117endif()
118
119if(NOT DEFINED TEST_FRAMEWORK_NS)
120 message(FATAL_ERROR "Incomplete build configuration: TEST_FRAMEWORK_NS is undefined.")
121elseif(TEST_FRAMEWORK_NS)
122 embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "TEST_FRAMEWORK_NS")
123endif()
124
Tamas Ban581034a2017-12-19 19:54:37 +0000125#Link mbedcrypto library to project
126target_link_libraries(${PROJECT_NAME} "${MBEDTLS_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX_C}mbedcrypto${CMAKE_STATIC_LIBRARY_SUFFIX_C}")
127add_dependencies(${PROJECT_NAME} ${MBEDTLS_TARGET_NAME}_install)
128
Tamas Ban581034a2017-12-19 19:54:37 +0000129#Generate binary file from axf
130compiler_generate_binary_output(${PROJECT_NAME})
131
David Vincze54d05552019-08-05 12:58:47 +0200132message(STATUS "MCUBOOT_UPGRADE_STRATEGY is set to: '${MCUBOOT_UPGRADE_STRATEGY}'.")
133message(STATUS "MCUBOOT_SIGNATURE_TYPE is set to: '${MCUBOOT_SIGNATURE_TYPE}'.")
134
Tamas Ban581034a2017-12-19 19:54:37 +0000135#Set macro definitions for the project.
136target_compile_definitions(${PROJECT_NAME} PRIVATE
Tamas Ban581034a2017-12-19 19:54:37 +0000137 MCUBOOT_VALIDATE_SLOT0
138 MCUBOOT_USE_FLASH_AREA_GET_SECTORS
139 MBEDTLS_CONFIG_FILE="config-boot.h"
Tamas Bandb69d522018-03-01 10:04:41 +0000140 MCUBOOT_TARGET_CONFIG="flash_layout.h")
141
Tamas Ban7801ed42019-05-20 13:21:53 +0100142if (MCUBOOT_SIGNATURE_TYPE STREQUAL "RSA-3072")
143 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_SIGN_RSA MCUBOOT_SIGN_RSA_LEN=3072)
144elseif(MCUBOOT_SIGNATURE_TYPE STREQUAL "RSA-2048")
145 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_SIGN_RSA MCUBOOT_SIGN_RSA_LEN=2048)
146else()
147 message(FATAL_ERROR "${MCUBOOT_SIGNATURE_TYPE} is not supported as firmware signing algorithm")
148endif()
149
David Vincze4638b2a2019-05-24 10:14:23 +0200150if (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "OVERWRITE_ONLY")
151 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_OVERWRITE_ONLY)
152elseif (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "NO_SWAP")
Tamas Bandb69d522018-03-01 10:04:41 +0000153 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_NO_SWAP)
David Vincze4638b2a2019-05-24 10:14:23 +0200154elseif (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "RAM_LOADING")
Oliver Swedef9982442018-08-24 18:37:44 +0100155 target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_RAM_LOADING)
David Vincze4638b2a2019-05-24 10:14:23 +0200156elseif (${MCUBOOT_UPGRADE_STRATEGY} STREQUAL "SWAP")
157 #No compile definition needs to be specified for this upgrade strategy
158else()
David Vincze54d05552019-08-05 12:58:47 +0200159 get_property(_upgrade_strategies CACHE MCUBOOT_UPGRADE_STRATEGY PROPERTY STRINGS)
160 message(FATAL_ERROR "ERROR: MCUBoot supports the ${_upgrade_strategies} upgrade strategies only.")
Oliver Swedef9982442018-08-24 18:37:44 +0100161endif()
162
Tamas Bandb69d522018-03-01 10:04:41 +0000163#Set install location. Keep original value to avoid overriding command line settings.
164if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
165 set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install location for MCUBoot." FORCE)
166endif()
167
168#Collect executables to common location: build/install/outputs/
169install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.axf
170 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.bin
171 DESTINATION outputs/${TARGET_PLATFORM}/)
172
173install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.axf
174 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.bin
175 DESTINATION outputs/fvp/)
Tamas Ban581034a2017-12-19 19:54:37 +0000176
177#Finally let cmake system apply changes after the whole project is defined.
178embedded_project_end(${PROJECT_NAME})