Skip to content

Commit 9782875

Browse files
Refactor boot/zephyr/CMakeLists.txt for includes
The Zephyr build system expects CMakeLists.txt to be only in directories beneath the module-level CMakeLists.txt. The solution most consistent with Zephyr led to putting the subsystem-specific build logic within the `zephyr/` subdirectory. This also led to relocating the `boot/bootutil/zephyr/CMakelists.txt`. It also led to adding an explicit `name:` setting in `module.yml` to ensure files can consistently reference the module independent of where the module is mounted. Created a module-level CMakeLists.txt for extending the include paths to find "mcuboot-mbedtls-cfg.h" within the boot/zephyr component. Incremental verification: 1. (Pass) west build -p always -b nrf52840dk_nrf52840 mcuboot/boot/zephyr 2. (Pass) ./zephyr/scripts/twister --testsuite-root zephyr/tests/subsys/dfu 3. (Pass) ./zephyr/scripts/twister --testsuite-root zephyr/samples/subsys/mgmt/mcumgr/smp_svr/ 4. (Pass) ./zephyr/scripts/twister --testsuite-root mcuboot/boot/zephyr 5. (FAIL) ./zephyr/scripts/twister --testsuite-root mcuboot/samples/zephyr_external_config This new sample is expected to fail while we evolve the minimum implementation to support it. Currently the build failure message is: ''' ... /home/zephyr/zephyr-sdk-0.15.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.1.0/../../../../arm-zephyr-eabi/bin/ld.bfd: zephyr/libzephyr.a(image_validate.c.obj): in function `bootutil_find_key': /home/zephyr/mcuboot_dev/mcuboot/boot/bootutil/src/image_validate.c:215: undefined reference to `bootutil_key_cnt' /home/zephyr/zephyr-sdk-0.15.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.1.0/../../../../arm-zephyr-eabi/bin/ld.bfd: /home/zephyr/mcuboot_dev/mcuboot/boot/bootutil/src/image_validate.c:215: undefined reference to `bootutil_keys' /home/zephyr/zephyr-sdk-0.15.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.1.0/../../../../arm-zephyr-eabi/bin/ld.bfd: zephyr/libzephyr.a(image_validate.c.obj): in function `bootutil_img_validate': /home/zephyr/mcuboot_dev/mcuboot/boot/bootutil/src/image_validate.c:530: undefined reference to `bootutil_key_cnt' /home/zephyr/zephyr-sdk-0.15.0/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.1.0/../../../../arm-zephyr-eabi/bin/ld.bfd: zephyr/libzephyr.a(image_rsa.c.obj): in function `bootutil_verify_sig': /home/zephyr/mcuboot_dev/mcuboot/boot/bootutil/src/image_rsa.c:316: undefined reference to `bootutil_keys' collect2: error: ld returned 1 exit status ''' Signed-off-by: Gregory Shue <[email protected]>
1 parent a9a1e07 commit 9782875

File tree

6 files changed

+292
-276
lines changed

6 files changed

+292
-276
lines changed

boot/zephyr/CMakeLists.txt

Lines changed: 4 additions & 269 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# CMakeLists.txt for building mcuboot as a Zephyr project
22
#
33
# Copyright (c) 2017 Open Source Foundries Limited
4+
# Copyright (c) 2022 Legrand North America, LLC.
45
#
56
# SPDX-License-Identifier: Apache-2.0
67

@@ -44,230 +45,10 @@ endmacro()
4445
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
4546
project(NONE)
4647

47-
# Path to "boot" subdirectory of repository root.
48-
get_filename_component(BOOT_DIR ${APPLICATION_SOURCE_DIR} DIRECTORY)
49-
# Path to top-level repository root directory.
50-
get_filename_component(MCUBOOT_DIR ${BOOT_DIR} DIRECTORY)
51-
# Path to tinycrypt library source subdirectory of MCUBOOT_DIR.
52-
set(TINYCRYPT_DIR "${MCUBOOT_DIR}/ext/tinycrypt/lib")
53-
assert_exists(TINYCRYPT_DIR)
54-
set(TINYCRYPT_SHA512_DIR "${MCUBOOT_DIR}/ext/tinycrypt-sha512/lib")
55-
assert_exists(TINYCRYPT_SHA512_DIR)
56-
# Path to crypto-fiat
57-
set(FIAT_DIR "${MCUBOOT_DIR}/ext/fiat")
58-
assert_exists(FIAT_DIR)
59-
# Path to mbed-tls' asn1 parser library.
60-
set(MBEDTLS_ASN1_DIR "${MCUBOOT_DIR}/ext/mbedtls-asn1")
61-
assert_exists(MBEDTLS_ASN1_DIR)
62-
set(NRF_DIR "${MCUBOOT_DIR}/ext/nrf")
63-
64-
if(CONFIG_BOOT_USE_NRF_CC310_BL)
65-
set(NRFXLIB_DIR ${ZEPHYR_BASE}/../nrfxlib)
66-
if(NOT EXISTS ${NRFXLIB_DIR})
67-
message(FATAL_ERROR "
68-
------------------------------------------------------------------------
69-
No such file or directory: ${NRFXLIB_DIR}
70-
The current configuration enables nRF CC310 crypto accelerator hardware
71-
with the `CONFIG_BOOT_USE_NRF_CC310_BL` option. Please follow
72-
`ext/nrf/README.md` guide to fix your setup or use tinycrypt instead of
73-
the HW accelerator.
74-
To use the tinycrypt set `CONFIG_BOOT_ECDSA_TINYCRYPT` to y.
75-
------------------------------------------------------------------------")
76-
endif()
77-
# Don't include this if we are using west
78-
add_subdirectory(${NRFXLIB_DIR} ${PROJECT_BINARY_DIR}/nrfxlib)
79-
endif()
80-
81-
zephyr_library_include_directories(
82-
include
83-
targets
84-
)
85-
if(EXISTS targets/${BOARD}.h)
86-
zephyr_library_compile_definitions(MCUBOOT_TARGET_CONFIG="${BOARD}.h")
87-
endif()
88-
89-
# Zephyr port-specific sources.
90-
zephyr_library_sources(
91-
main.c
92-
flash_map_extended.c
93-
os.c
48+
target_sources(app PRIVATE
9449
keys.c
9550
)
9651

97-
if(DEFINED CONFIG_ENABLE_MGMT_PERUSER)
98-
zephyr_library_sources(
99-
boot_serial_extensions.c
100-
)
101-
endif()
102-
103-
if(NOT DEFINED CONFIG_FLASH_PAGE_LAYOUT)
104-
zephyr_library_sources(
105-
flash_map_legacy.c
106-
)
107-
endif()
108-
109-
# Generic bootutil sources and includes.
110-
zephyr_library_include_directories(${BOOT_DIR}/bootutil/include)
111-
zephyr_library_sources(
112-
${BOOT_DIR}/bootutil/src/image_validate.c
113-
${BOOT_DIR}/bootutil/src/tlv.c
114-
${BOOT_DIR}/bootutil/src/encrypted.c
115-
${BOOT_DIR}/bootutil/src/image_rsa.c
116-
${BOOT_DIR}/bootutil/src/image_ec256.c
117-
${BOOT_DIR}/bootutil/src/image_ed25519.c
118-
${BOOT_DIR}/bootutil/src/bootutil_misc.c
119-
${BOOT_DIR}/bootutil/src/fault_injection_hardening.c
120-
)
121-
122-
# library which might be common source code for MCUBoot and an application
123-
zephyr_link_libraries(MCUBOOT_BOOTUTIL)
124-
125-
if(CONFIG_BOOT_FIH_PROFILE_HIGH)
126-
zephyr_library_sources(
127-
${BOOT_DIR}/bootutil/src/fault_injection_hardening_delay_rng_mbedtls.c
128-
)
129-
endif()
130-
131-
if(CONFIG_SINGLE_APPLICATION_SLOT)
132-
zephyr_library_sources(
133-
${BOOT_DIR}/zephyr/single_loader.c
134-
)
135-
zephyr_library_include_directories(${BOOT_DIR}/bootutil/src)
136-
else()
137-
zephyr_library_sources(
138-
${BOOT_DIR}/bootutil/src/loader.c
139-
${BOOT_DIR}/bootutil/src/swap_misc.c
140-
${BOOT_DIR}/bootutil/src/swap_scratch.c
141-
${BOOT_DIR}/bootutil/src/swap_move.c
142-
${BOOT_DIR}/bootutil/src/caps.c
143-
)
144-
endif()
145-
146-
if(CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256 OR CONFIG_BOOT_ENCRYPT_EC256 OR CONFIG_BOOT_SERIAL_ENCRYPT_EC256)
147-
zephyr_library_include_directories(
148-
${MBEDTLS_ASN1_DIR}/include
149-
)
150-
zephyr_library_sources(
151-
# Additionally pull in just the ASN.1 parser from mbedTLS.
152-
${MBEDTLS_ASN1_DIR}/src/asn1parse.c
153-
${MBEDTLS_ASN1_DIR}/src/platform_util.c
154-
)
155-
if(CONFIG_BOOT_USE_TINYCRYPT)
156-
# When using ECDSA signatures, pull in our copy of the tinycrypt library.
157-
zephyr_library_include_directories(
158-
${BOOT_DIR}/zephyr/include
159-
${TINYCRYPT_DIR}/include
160-
)
161-
zephyr_include_directories(${TINYCRYPT_DIR}/include)
162-
163-
zephyr_library_sources(
164-
${TINYCRYPT_DIR}/source/ecc.c
165-
${TINYCRYPT_DIR}/source/ecc_dsa.c
166-
${TINYCRYPT_DIR}/source/sha256.c
167-
${TINYCRYPT_DIR}/source/utils.c
168-
)
169-
elseif(CONFIG_BOOT_USE_NRF_CC310_BL)
170-
zephyr_library_sources(${NRF_DIR}/cc310_glue.c)
171-
zephyr_library_include_directories(${NRF_DIR})
172-
zephyr_link_libraries(nrfxlib_crypto)
173-
endif()
174-
175-
# Since here we are not using Zephyr's mbedTLS but rather our own, we need
176-
# to set MBEDTLS_CONFIG_FILE ourselves. When using Zephyr's copy, this
177-
# variable is set by its Kconfig in the Zephyr codebase.
178-
zephyr_library_compile_definitions(
179-
MBEDTLS_CONFIG_FILE="${CMAKE_CURRENT_LIST_DIR}/include/mcuboot-mbedtls-cfg.h"
180-
)
181-
elseif(CONFIG_BOOT_SIGNATURE_TYPE_NONE)
182-
zephyr_library_include_directories(
183-
${BOOT_DIR}/zephyr/include
184-
${TINYCRYPT_DIR}/include
185-
)
186-
187-
zephyr_library_sources(
188-
${TINYCRYPT_DIR}/source/sha256.c
189-
${TINYCRYPT_DIR}/source/utils.c
190-
)
191-
elseif(CONFIG_BOOT_SIGNATURE_TYPE_RSA)
192-
# Use mbedTLS provided by Zephyr for RSA signatures. (Its config file
193-
# is set using Kconfig.)
194-
zephyr_include_directories(include)
195-
if(CONFIG_BOOT_ENCRYPT_RSA)
196-
set_source_files_properties(
197-
${BOOT_DIR}/bootutil/src/encrypted.c
198-
PROPERTIES
199-
INCLUDE_DIRECTORIES ${ZEPHYR_MBEDTLS_MODULE_DIR}/library
200-
)
201-
endif()
202-
elseif(CONFIG_BOOT_SIGNATURE_TYPE_ED25519 OR CONFIG_BOOT_ENCRYPT_X25519)
203-
if(CONFIG_BOOT_USE_TINYCRYPT)
204-
zephyr_library_include_directories(
205-
${MBEDTLS_ASN1_DIR}/include
206-
${BOOT_DIR}/zephyr/include
207-
${TINYCRYPT_DIR}/include
208-
${TINYCRYPT_SHA512_DIR}/include
209-
)
210-
zephyr_library_sources(
211-
${TINYCRYPT_DIR}/source/sha256.c
212-
${TINYCRYPT_DIR}/source/utils.c
213-
${TINYCRYPT_SHA512_DIR}/source/sha512.c
214-
# Additionally pull in just the ASN.1 parser from mbedTLS.
215-
${MBEDTLS_ASN1_DIR}/src/asn1parse.c
216-
${MBEDTLS_ASN1_DIR}/src/platform_util.c
217-
)
218-
zephyr_library_compile_definitions(
219-
MBEDTLS_CONFIG_FILE="${CMAKE_CURRENT_LIST_DIR}/include/mcuboot-mbedtls-cfg.h"
220-
)
221-
else()
222-
zephyr_include_directories(include)
223-
endif()
224-
225-
zephyr_library_include_directories(
226-
${BOOT_DIR}/zephyr/include
227-
${FIAT_DIR}/include/
228-
)
229-
230-
zephyr_library_sources(
231-
${FIAT_DIR}/src/curve25519.c
232-
)
233-
endif()
234-
235-
if(CONFIG_BOOT_ENCRYPT_EC256 OR CONFIG_BOOT_ENCRYPT_X25519 OR CONFIG_BOOT_SERIAL_ENCRYPT_EC256)
236-
zephyr_library_sources(
237-
${TINYCRYPT_DIR}/source/aes_encrypt.c
238-
${TINYCRYPT_DIR}/source/aes_decrypt.c
239-
${TINYCRYPT_DIR}/source/ctr_mode.c
240-
${TINYCRYPT_DIR}/source/hmac.c
241-
${TINYCRYPT_DIR}/source/ecc_dh.c
242-
)
243-
endif()
244-
245-
if(CONFIG_BOOT_ENCRYPT_EC256)
246-
zephyr_library_sources(
247-
${TINYCRYPT_DIR}/source/ecc_dh.c
248-
)
249-
endif()
250-
251-
if(CONFIG_MCUBOOT_SERIAL)
252-
zephyr_sources(${BOOT_DIR}/zephyr/serial_adapter.c)
253-
zephyr_sources(${BOOT_DIR}/boot_serial/src/boot_serial.c)
254-
zephyr_sources(${BOOT_DIR}/boot_serial/src/serial_recovery_cbor.c)
255-
zephyr_sources(${BOOT_DIR}/boot_serial/src/zcbor_decode.c)
256-
zephyr_sources(${BOOT_DIR}/boot_serial/src/zcbor_encode.c)
257-
zephyr_sources(${BOOT_DIR}/boot_serial/src/zcbor_common.c)
258-
259-
zephyr_sources_ifdef(CONFIG_BOOT_MGMT_ECHO ${BOOT_DIR}/boot_serial/src/serial_recovery_echo.c)
260-
261-
zephyr_include_directories(${BOOT_DIR}/bootutil/include)
262-
zephyr_include_directories(${BOOT_DIR}/boot_serial/include)
263-
zephyr_include_directories(include)
264-
265-
zephyr_include_directories_ifdef(
266-
CONFIG_BOOT_ERASE_PROGRESSIVELY
267-
${BOOT_DIR}/bootutil/src
268-
)
269-
endif()
270-
27152
if(NOT CONFIG_BOOT_SIGNATURE_KEY_FILE STREQUAL "")
27253
# CONF_FILE points to the KConfig configuration files of the bootloader.
27354
foreach (filepath ${CONF_FILE})
@@ -288,7 +69,7 @@ if(NOT CONFIG_BOOT_SIGNATURE_KEY_FILE STREQUAL "")
28869
(EXISTS ${CONF_DIR}/${CONFIG_BOOT_SIGNATURE_KEY_FILE}))
28970
set(KEY_FILE ${CONF_DIR}/${CONFIG_BOOT_SIGNATURE_KEY_FILE})
29071
else()
291-
set(KEY_FILE ${MCUBOOT_DIR}/${CONFIG_BOOT_SIGNATURE_KEY_FILE})
72+
set(KEY_FILE ${ZEPHYR_MCUBOOT_MODULE_DIR}/${CONFIG_BOOT_SIGNATURE_KEY_FILE})
29273
endif()
29374
message("MCUBoot bootloader key file: ${KEY_FILE}")
29475

@@ -297,7 +78,7 @@ if(NOT CONFIG_BOOT_SIGNATURE_KEY_FILE STREQUAL "")
29778
OUTPUT ${GENERATED_PUBKEY}
29879
COMMAND
29980
${PYTHON_EXECUTABLE}
300-
${MCUBOOT_DIR}/scripts/imgtool.py
81+
${ZEPHYR_MCUBOOT_MODULE_DIR}/scripts/imgtool.py
30182
getpub
30283
-k
30384
${KEY_FILE}
@@ -306,49 +87,3 @@ if(NOT CONFIG_BOOT_SIGNATURE_KEY_FILE STREQUAL "")
30687
)
30788
zephyr_library_sources(${GENERATED_PUBKEY})
30889
endif()
309-
310-
if(CONFIG_BOOT_ENCRYPTION_KEY_FILE AND NOT CONFIG_BOOT_ENCRYPTION_KEY_FILE STREQUAL "")
311-
# CONF_FILE points to the KConfig configuration files of the bootloader.
312-
unset(CONF_DIR)
313-
foreach(filepath ${CONF_FILE})
314-
file(READ ${filepath} temp_text)
315-
string(FIND "${temp_text}" ${CONFIG_BOOT_ENCRYPTION_KEY_FILE} match)
316-
if(${match} GREATER_EQUAL 0)
317-
if(NOT DEFINED CONF_DIR)
318-
get_filename_component(CONF_DIR ${filepath} DIRECTORY)
319-
else()
320-
message(FATAL_ERROR "Encryption key file defined in multiple conf files")
321-
endif()
322-
endif()
323-
endforeach()
324-
325-
if(IS_ABSOLUTE ${CONFIG_BOOT_ENCRYPTION_KEY_FILE})
326-
set(KEY_FILE ${CONFIG_BOOT_ENCRYPTION_KEY_FILE})
327-
elseif((DEFINED CONF_DIR) AND
328-
(EXISTS ${CONF_DIR}/${CONFIG_BOOT_ENCRYPTION_KEY_FILE}))
329-
set(KEY_FILE ${CONF_DIR}/${CONFIG_BOOT_ENCRYPTION_KEY_FILE})
330-
else()
331-
set(KEY_FILE ${MCUBOOT_DIR}/${CONFIG_BOOT_ENCRYPTION_KEY_FILE})
332-
endif()
333-
message("MCUBoot bootloader encryption key file: ${KEY_FILE}")
334-
335-
set(GENERATED_ENCKEY ${ZEPHYR_BINARY_DIR}/autogen-enckey.c)
336-
add_custom_command(
337-
OUTPUT ${GENERATED_ENCKEY}
338-
COMMAND
339-
${PYTHON_EXECUTABLE}
340-
${MCUBOOT_DIR}/scripts/imgtool.py
341-
getpriv
342-
-k
343-
${KEY_FILE}
344-
> ${GENERATED_ENCKEY}
345-
DEPENDS ${KEY_FILE}
346-
)
347-
zephyr_library_sources(${GENERATED_ENCKEY})
348-
endif()
349-
350-
if(CONFIG_MCUBOOT_CLEANUP_ARM_CORE)
351-
zephyr_library_sources(
352-
${BOOT_DIR}/zephyr/arm_cleanup.c
353-
)
354-
endif()

zephyr/CMakeLists.txt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Copyright (c) 2022 Legrand North America, LLC.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
6+
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
7+
8+
9+
# Detect the platform reliably
10+
if(ZEPHYR_BASE)
11+
else()
12+
message(FATAL_ERROR "ZEPHYR_BASE needs to be defined for Zephyr builds")
13+
endif()
14+
15+
# Verify the module name is set correctly
16+
set(expected_module_name "mcuboot")
17+
if(NOT "${module_name}" STREQUAL ${expected_module_name})
18+
message(FATAL_ERROR "A module configuration error has occurred.
19+
This module is named '${module_name}' when '${expected_module_name}' \
20+
is expected.
21+
Verify `module.yml` contains the line 'name: ${expected_module_name}'.")
22+
endif()
23+
unset(expected_module_name)
24+
25+
#Do not allow in source builds
26+
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
27+
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
28+
29+
30+
#
31+
# Module options managed through Kconfig and use names CONFIG_*
32+
#
33+
34+
zephyr_include_directories(../boot/zephyr/include)
35+
36+
add_subdirectory(subsys)

zephyr/module.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
name: mcuboot
22
samples:
33
- boot/zephyr
4+
- boot/zephyr_external_config
45
build:
5-
cmake: ./boot/bootutil/zephyr
6+
cmake: ./zephyr
67
kconfig: ./zephyr/Kconfig

zephyr/subsys/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) 2022 Legrand North America, LLC.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
6+
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
7+
8+
add_subdirectory_ifdef(CONFIG_MCUBOOT_BOOTUTIL_LIB mcuboot_util)
9+
add_subdirectory_ifdef(CONFIG_MCUBOOT mcuboot_svc)

0 commit comments

Comments
 (0)