blob: b57cb171a70394134849dabe9bba563fb22f465b [file] [log] [blame]
Marti Bolivarbf909a12017-11-13 19:43:46 -05001# CMakeLists.txt for building mcuboot as a Zephyr project
2#
3# Copyright (c) 2017 Open Source Foundries Limited
4#
5# SPDX-License-Identifier: Apache-2.0
6
7cmake_minimum_required(VERSION 3.8.2)
8
Marti Bolivardde1b1c2018-01-29 14:41:58 -05009set(KCONFIG_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/Kconfig)
Andrzej Puzdrowski8e96b832017-09-08 16:49:14 +020010
Marti Bolivarbf909a12017-11-13 19:43:46 -050011########################
12# Configuration choices.
13########################
14
15# Set CONF_SIGNATURE_TYPE to determine the signature type used.
16# Currently, it should be set to either RSA or ECDSA_P256.
17#
18# To choose RSA (this is the default):
19#
20# cmake -DCONF_SIGNATURE_TYPE=RSA [...]
21#
22# To use ECDSA_P256:
23#
24# cmake -DCONF_SIGNATURE_TYPE=ECDSA_P256 [...]
25if (NOT DEFINED CONF_SIGNATURE_TYPE)
26 set(CONF_SIGNATURE_TYPE RSA)
27endif()
28
29# If CONF_VALIDATE_SLOT0 is set, the bootloader attempts to validate
30# the signature of slot0 every boot. This adds the signature check
31# time to every boot, but can mitigate against some changes that are
32# able to modify the flash image itself.
33#
34# To enable validation (this is the default):
35#
36# cmake -DCONF_VALIDATE_SLOT0=YES [...]
37#
38# To disable validation:
39#
40# cmake -DCONF_VALIDATE_SLOT0=NO [...]
41if (NOT DEFINED CONF_VALIDATE_SLOT0)
42 set(CONF_VALIDATE_SLOT0 YES)
43endif()
44
45# If CONF_UPGRADE_ONLY is set, overwrite slot0 with the upgrade image
46# instead of swapping them. This prevents the fallback recovery, but
47# uses a much simpler code path.
48#
49# To enable "upgrade only" mode:
50#
51# cmake -DCONF_UPGRADE_ONLY=YES [...]
52#
53# To disable "upgrade only" mode (this is the default):
54#
55# cmake -DCONF_UPGRADE_ONLY=NO [...]
56if (NOT DEFINED CONF_UPGRADE_ONLY)
57 set(CONF_UPGRADE_ONLY NO)
58endif()
59
60##############################
61# End of configuration blocks.
62##############################
63
64set(MCUBOOT_EXTRA_CFLAGS)
65
66# Determine CFLAGS / MCUBOOT_CONF_FILE / NEED_TINYCRYPT from the signature type.
67if(CONF_SIGNATURE_TYPE STREQUAL RSA)
68 set(MCUBOOT_CONF_FILE prj.conf) # RSA
69 list(APPEND MCUBOOT_EXTRA_CFLAGS "-DMCUBOOT_SIGN_RSA" "-DMCUBOOT_USE_MBED_TLS")
70 set(NEED_TINYCRYPT NO)
71elseif(CONF_SIGNATURE_TYPE STREQUAL ECDSA_P256)
72 set(MCUBOOT_CONF_FILE prj-p256.conf) # ECDSA P-256
73 list(APPEND MCUBOOT_EXTRA_CFLAGS "-DMCUBOOT_SIGN_EC256" "-DMCUBOOT_USE_TINYCRYPT")
74 set(NEED_TINYCRYPT YES)
75else()
76 message(FATAL_ERROR "Invalid CONF_SIGNATURE_TYPE specified: '${CONF_SIGNATURE_TYPE}'")
77endif()
78
79# Board-specific CONF_FILES should get merged into the build as well.
80#
81# Do this by defining the set_conf_file macro:
82# http://docs.zephyrproject.org/application/application.html#application-configuration
83macro(set_conf_file)
84 if (EXISTS ${APPLICATION_SOURCE_DIR}/boards/${BOARD}.conf)
85 set(CONF_FILE "${MCUBOOT_CONF_FILE} ${APPLICATION_SOURCE_DIR}/boards/${BOARD}.conf")
86 else()
87 set(CONF_FILE "${MCUBOOT_CONF_FILE}")
88 endif()
89endmacro()
90
91# Check if we need to validate slot 0.
92if(CONF_VALIDATE_SLOT0 STREQUAL YES)
93 list(APPEND MCUBOOT_EXTRA_CFLAGS "-DMCUBOOT_VALIDATE_SLOT0")
94endif()
95
96# Enabling this option uses newer flash map APIs. This saves RAM and
97# avoids deprecated API usage.
98#
99# (This can be deleted when flash_area_to_sectors() is removed instead
100# of simply deprecated.)
101list(APPEND MCUBOOT_EXTRA_CFLAGS "-DMCUBOOT_USE_FLASH_AREA_GET_SECTORS")
102
103# Check if we're operating in overwrite-only mode.
104if(CONF_UPGRADE_ONLY STREQUAL YES)
105 list (APPEND MCUBOOT_EXTRA_CFLAGS "-DMCUBOOT_OVERWRITE_ONLY" "-DMCUBOOT_OVERWRITE_ONLY_FAST")
106endif()
107
108# Add values in MCUBOOT_EXTRA_CFLAGS_STR to the Zephyr build's
109# EXTRA_CFLAGS variable.
110string(REPLACE ";" " " MCUBOOT_EXTRA_CFLAGS_STR "${MCUBOOT_EXTRA_CFLAGS}")
111set(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${MCUBOOT_EXTRA_CFLAGS_STR}")
112
113# The board should be set to a supported target.
114if (NOT DEFINED BOARD)
115 set(BOARD qemu_x86)
116endif()
117
118# This is necessary to ensure mcuboot is linked into, and fits inside,
119# the boot partition.
Sebastian Bøe8680b902018-01-29 10:34:43 +0100120set(DTC_OVERLAY_FILE ${CMAKE_CURRENT_LIST_DIR}/dts.overlay)
Marti Bolivarbf909a12017-11-13 19:43:46 -0500121
122# Standard Zephyr application boilerplate:
123# http://docs.zephyrproject.org/application/application.html
124include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
125project(NONE)
126
127# Path to "boot" subdirectory of repository root.
128get_filename_component(BOOT_DIR ${APPLICATION_SOURCE_DIR} DIRECTORY)
129# Path to top-level repository root directory.
130get_filename_component(MCUBOOT_DIR ${BOOT_DIR} DIRECTORY)
131# Path to tinycrypt library source subdirectory of MCUBOOT_DIR.
132set(TINYCRYPT_DIR "${MCUBOOT_DIR}/ext/tinycrypt/lib")
Fabio Utzig28ee5b02017-12-12 08:10:40 -0200133# Path to mbed-tls' asn1 parser library.
134set(MBEDTLS_ASN1_DIR "${MCUBOOT_DIR}/ext/mbedtls")
Marti Bolivarbf909a12017-11-13 19:43:46 -0500135
136# Zephyr application include directories.
Fabio Utzig28ee5b02017-12-12 08:10:40 -0200137if (NOT NEED_TINYCRYPT)
138 # Zephyr's mbedTLS needs this.
139 zephyr_include_directories(include)
140
141 # Use full mbedtls provided by OS for RSA
142 target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/crypto/mbedtls/include)
143endif()
144
Marti Bolivarbf909a12017-11-13 19:43:46 -0500145target_include_directories(app PRIVATE include)
146target_include_directories(app PRIVATE targets)
147if(EXISTS "${APPLICATION_SOURCE_DIR}/targets/${BOARD}.h")
148 target_compile_definitions(app PRIVATE "-DMCUBOOT_TARGET_CONFIG='\"${BOARD}.h\"'")
149endif()
150
151# Zephyr port-specific sources.
152target_sources(app PRIVATE main.c)
153target_sources(app PRIVATE flash_map.c)
154target_sources(app PRIVATE hal_flash.c)
155target_sources(app PRIVATE os.c)
156target_sources(app PRIVATE keys.c)
157if(NOT DEFINED CONFIG_FLASH_PAGE_LAYOUT)
158 target_sources(app PRIVATE flash_map_legacy.c)
159endif()
160
161# Generic bootutil sources and includes.
162target_include_directories(app PRIVATE "${BOOT_DIR}/bootutil/include")
163target_sources(app PRIVATE "${BOOT_DIR}/bootutil/src/loader.c")
164target_sources(app PRIVATE "${BOOT_DIR}/bootutil/src/bootutil_misc.c")
165target_sources(app PRIVATE "${BOOT_DIR}/bootutil/src/image_validate.c")
166target_sources(app PRIVATE "${BOOT_DIR}/bootutil/src/image_rsa.c")
167target_sources(app PRIVATE "${BOOT_DIR}/bootutil/src/image_ec256.c")
168target_sources(app PRIVATE "${BOOT_DIR}/bootutil/src/caps.c")
169
170# Tinycrypt sources and includes, if needed.
171if (NEED_TINYCRYPT)
Fabio Utzig28ee5b02017-12-12 08:10:40 -0200172 target_include_directories(app PRIVATE "${BOOT_DIR}/zephyr/include")
Marti Bolivarbf909a12017-11-13 19:43:46 -0500173 target_include_directories(app PRIVATE "${TINYCRYPT_DIR}/include")
Fabio Utzig28ee5b02017-12-12 08:10:40 -0200174 target_include_directories(app PRIVATE "${MBEDTLS_ASN1_DIR}/include")
Marti Bolivarbf909a12017-11-13 19:43:46 -0500175
176 target_sources(app PRIVATE "${TINYCRYPT_DIR}/source/ecc.c")
177 target_sources(app PRIVATE "${TINYCRYPT_DIR}/source/ecc_dsa.c")
178 target_sources(app PRIVATE "${TINYCRYPT_DIR}/source/sha256.c")
179 target_sources(app PRIVATE "${TINYCRYPT_DIR}/source/utils.c")
Fabio Utzig28ee5b02017-12-12 08:10:40 -0200180
181 target_sources(app PRIVATE "${MBEDTLS_ASN1_DIR}/src/asn1parse.c")
Marti Bolivarbf909a12017-11-13 19:43:46 -0500182endif()
Andrzej Puzdrowski8e96b832017-09-08 16:49:14 +0200183
184if (CONFIG_MCUBOOT_SERIAL)
185zephyr_sources(${BOOT_DIR}/zephyr/serial_adapter.c)
186
187add_subdirectory(${BOOT_DIR}/boot_serial ./boot/boot_serial)
188add_subdirectory(${BOOT_DIR}/zephyr/tinycbor)
189add_subdirectory(${BOOT_DIR}/zephyr/cborattr)
190
191endif()