|
| 1 | +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD |
| 2 | +# |
| 3 | +# SPDX-License-Identifier: Apache-2.0 |
| 4 | + |
| 5 | +add_definitions(-DMCUBOOT_TARGET=${MCUBOOT_TARGET}) |
| 6 | +add_definitions(-D__ESPRESSIF__=1) |
| 7 | + |
| 8 | +# Set directories |
| 9 | +set(BOOTUTIL_DIR ${MCUBOOT_ROOT_DIR}/boot/bootutil) |
| 10 | +set(BOOT_SERIAL_DIR ${MCUBOOT_ROOT_DIR}/boot/boot_serial) |
| 11 | +set(ZCBOR_DIR ${MCUBOOT_ROOT_DIR}/boot/zcbor) |
| 12 | + |
| 13 | +# Set chip arch |
| 14 | +if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR |
| 15 | + "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR |
| 16 | + "${MCUBOOT_TARGET}" STREQUAL "esp32s3") |
| 17 | + set(MCUBOOT_ARCH "xtensa") |
| 18 | +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR |
| 19 | + "${MCUBOOT_TARGET}" STREQUAL "esp32c6" OR |
| 20 | + "${MCUBOOT_TARGET}" STREQUAL "esp32c2" OR |
| 21 | + "${MCUBOOT_TARGET}" STREQUAL "esp32h2") |
| 22 | + set(MCUBOOT_ARCH "riscv") |
| 23 | +endif() |
| 24 | + |
| 25 | +# Set the minimum revision for each supported chip |
| 26 | +if("${MCUBOOT_TARGET}" STREQUAL "esp32") |
| 27 | + set(ESP_MIN_REVISION 3) |
| 28 | +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s2") |
| 29 | + set(ESP_MIN_REVISION 0) |
| 30 | +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s3") |
| 31 | + set(ESP_MIN_REVISION 0) |
| 32 | +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3") |
| 33 | + set(ESP_MIN_REVISION 3) |
| 34 | +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c6") |
| 35 | + set(ESP_MIN_REVISION 0) |
| 36 | +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2") |
| 37 | + set(ESP_MIN_REVISION 0) |
| 38 | +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2") |
| 39 | + set(ESP_MIN_REVISION 0) |
| 40 | +else() |
| 41 | + message(FATAL_ERROR "Unsupported target ${MCUBOOT_TARGET}") |
| 42 | +endif() |
| 43 | + |
| 44 | +# Get MCUboot revision to be added into bootloader image version |
| 45 | +execute_process( |
| 46 | + COMMAND git describe --tags |
| 47 | + WORKING_DIRECTORY ${ESPRESSIF_PORT_DIR} |
| 48 | + OUTPUT_VARIABLE MCUBOOT_VER |
| 49 | + OUTPUT_STRIP_TRAILING_WHITESPACE |
| 50 | + ) |
| 51 | +add_definitions(-DMCUBOOT_VER=\"${MCUBOOT_VER}\") |
| 52 | + |
| 53 | +# Set Espressif HAL to use |
| 54 | +if(NOT DEFINED ESP_HAL_PATH) |
| 55 | + if(DEFINED ENV{ESP_HAL_PATH}) |
| 56 | + set(ESP_HAL_PATH $ENV{ESP_HAL_PATH}) |
| 57 | + else() |
| 58 | + message(WARNING "ESP_HAL_PATH not defined, checking if IDF_PATH exists.") |
| 59 | + if(DEFINED ENV{IDF_PATH}) |
| 60 | + set(ESP_HAL_PATH $ENV{IDF_PATH}) |
| 61 | + message("IDF installation found in the system, using IDF_PATH as ESP_HAL_PATH.") |
| 62 | + else () |
| 63 | + message(FATAL_ERROR "Please set -DESP_HAL_PATH parameter or define ESP_HAL_PATH environment variable.") |
| 64 | + endif() |
| 65 | + endif() |
| 66 | +endif() |
| 67 | +message(STATUS "Defined ESP_HAL_PATH: ${ESP_HAL_PATH}") |
| 68 | + |
| 69 | +# Verify from which IDF version the HAL is based on |
| 70 | +set(IDF_VER_HEADER_FILE "${ESP_HAL_PATH}/components/esp_common/include/esp_idf_version.h") |
| 71 | + |
| 72 | +get_version_from_header("ESP_IDF_VERSION_MAJOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MAJOR) |
| 73 | +get_version_from_header("ESP_IDF_VERSION_MINOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MINOR) |
| 74 | +get_version_from_header("ESP_IDF_VERSION_PATCH" ${IDF_VER_HEADER_FILE} IDF_VERSION_PATCH) |
| 75 | + |
| 76 | +set(IDF_VERSION "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") |
| 77 | + |
| 78 | +if(NOT IDF_VERSION VERSION_EQUAL ${EXPECTED_IDF_HAL_VERSION}) |
| 79 | + message( |
| 80 | + FATAL_ERROR " |
| 81 | + Unsupported HAL version ${IDF_VERSION}, expected ${EXPECTED_IDF_HAL_VERSION}. \ |
| 82 | + Verify if the RTOS repository, where you are trying to build from, is up to date, \ |
| 83 | + or check the installation pointed on ESP_HAL_PATH." |
| 84 | + ) |
| 85 | +else () |
| 86 | + message(STATUS "HAL based on ESP-IDF version: ${IDF_VERSION}") |
| 87 | +endif() |
| 88 | + |
| 89 | +# Find imgtool. |
| 90 | +# Go with an explicitly installed imgtool first, falling |
| 91 | +# back to mcuboot/scripts/imgtool.py. |
| 92 | +find_program(IMGTOOL_COMMAND |
| 93 | + NAMES imgtool imgtool.py |
| 94 | + ) |
| 95 | +if("${IMGTOOL_COMMAND}" MATCHES "IMGTOOL_COMMAND-NOTFOUND") |
| 96 | + set(imgtool_path "${MCUBOOT_ROOT_DIR}/scripts/imgtool.py") |
| 97 | +else() |
| 98 | + set(imgtool_path "${IMGTOOL_COMMAND}") |
| 99 | +endif() |
| 100 | + |
| 101 | +set(inc_directories |
| 102 | + ${BOOTUTIL_DIR}/include |
| 103 | + ${BOOTUTIL_DIR}/src |
| 104 | + ${ESPRESSIF_PORT_DIR}/include |
| 105 | + ) |
| 106 | + |
| 107 | +set(main_src ${ESPRESSIF_PORT_DIR}/main.c) |
| 108 | + |
| 109 | +set(port_srcs |
| 110 | + ${ESPRESSIF_PORT_DIR}/port/esp_mcuboot.c |
| 111 | + ${ESPRESSIF_PORT_DIR}/port/esp_loader.c |
| 112 | + ${ESPRESSIF_PORT_DIR}/os.c |
| 113 | + ) |
| 114 | + |
| 115 | +set(bootutil_srcs |
| 116 | + ${BOOTUTIL_DIR}/src/boot_record.c |
| 117 | + ${BOOTUTIL_DIR}/src/bootutil_misc.c |
| 118 | + ${BOOTUTIL_DIR}/src/bootutil_public.c |
| 119 | + ${BOOTUTIL_DIR}/src/caps.c |
| 120 | + ${BOOTUTIL_DIR}/src/encrypted.c |
| 121 | + ${BOOTUTIL_DIR}/src/fault_injection_hardening.c |
| 122 | + ${BOOTUTIL_DIR}/src/fault_injection_hardening_delay_rng_mbedtls.c |
| 123 | + ${BOOTUTIL_DIR}/src/image_ecdsa.c |
| 124 | + ${BOOTUTIL_DIR}/src/image_ed25519.c |
| 125 | + ${BOOTUTIL_DIR}/src/image_rsa.c |
| 126 | + ${BOOTUTIL_DIR}/src/image_validate.c |
| 127 | + ${BOOTUTIL_DIR}/src/loader.c |
| 128 | + ${BOOTUTIL_DIR}/src/swap_misc.c |
| 129 | + ${BOOTUTIL_DIR}/src/swap_move.c |
| 130 | + ${BOOTUTIL_DIR}/src/swap_scratch.c |
| 131 | + ${BOOTUTIL_DIR}/src/swap_offset.c |
| 132 | + ${BOOTUTIL_DIR}/src/tlv.c |
| 133 | + ) |
| 134 | + |
| 135 | +if(CONFIG_BOOT_RAM_LOAD) |
| 136 | + list(APPEND bootutil_srcs ${BOOTUTIL_DIR}/src/ram_load.c) |
| 137 | +endif() |
| 138 | + |
| 139 | +if(DEFINED CONFIG_ESP_SIGN_RSA) |
| 140 | + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/rsa.cmake) |
| 141 | +elseif(DEFINED CONFIG_ESP_SIGN_EC256) |
| 142 | + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ec256.cmake) |
| 143 | +elseif(DEFINED CONFIG_ESP_SIGN_ED25519) |
| 144 | + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ed25519.cmake) |
| 145 | +else() |
| 146 | + # No signature verification |
| 147 | + set(TINYCRYPT_DIR ${MCUBOOT_ROOT_DIR}/ext/tinycrypt/lib) |
| 148 | + set(CRYPTO_INC |
| 149 | + ${TINYCRYPT_DIR}/include |
| 150 | + ) |
| 151 | + set(crypto_srcs |
| 152 | + ${TINYCRYPT_DIR}/source/sha256.c |
| 153 | + ${TINYCRYPT_DIR}/source/utils.c |
| 154 | + ) |
| 155 | +endif() |
| 156 | + |
| 157 | +if(DEFINED CONFIG_ESP_SIGN_KEY_FILE) |
| 158 | + if(IS_ABSOLUTE ${CONFIG_ESP_SIGN_KEY_FILE}) |
| 159 | + set(KEY_FILE ${CONFIG_ESP_SIGN_KEY_FILE}) |
| 160 | + else() |
| 161 | + set(KEY_FILE ${MCUBOOT_ROOT_DIR}/${CONFIG_ESP_SIGN_KEY_FILE}) |
| 162 | + endif() |
| 163 | + message("MCUBoot bootloader key file: ${KEY_FILE}") |
| 164 | + |
| 165 | + set(GENERATED_PUBKEY ${CMAKE_CURRENT_BINARY_DIR}/autogen-pubkey.c) |
| 166 | + add_custom_command( |
| 167 | + OUTPUT ${GENERATED_PUBKEY} |
| 168 | + COMMAND |
| 169 | + ${imgtool_path} |
| 170 | + getpub |
| 171 | + -k |
| 172 | + ${KEY_FILE} |
| 173 | + > ${GENERATED_PUBKEY} |
| 174 | + DEPENDS ${KEY_FILE} |
| 175 | + ) |
| 176 | + list(APPEND crypto_srcs ${GENERATED_PUBKEY}) |
| 177 | +endif() |
| 178 | + |
| 179 | +if(CONFIG_ESP_MCUBOOT_SERIAL) |
| 180 | + set(MBEDTLS_DIR "${MCUBOOT_ROOT_DIR}/ext/mbedtls") |
| 181 | + |
| 182 | + list(APPEND bootutil_srcs |
| 183 | + ${BOOT_SERIAL_DIR}/src/boot_serial.c |
| 184 | + ${BOOT_SERIAL_DIR}/src/zcbor_bulk.c |
| 185 | + ${ZCBOR_DIR}/src/zcbor_decode.c |
| 186 | + ${ZCBOR_DIR}/src/zcbor_encode.c |
| 187 | + ${ZCBOR_DIR}/src/zcbor_common.c |
| 188 | + ) |
| 189 | + list(APPEND inc_directories |
| 190 | + ${BOOT_SERIAL_DIR}/include |
| 191 | + ${ZCBOR_DIR}/include |
| 192 | + ) |
| 193 | + list(APPEND port_srcs |
| 194 | + ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/serial_adapter.c |
| 195 | + ${MBEDTLS_DIR}/library/base64.c |
| 196 | + ) |
| 197 | + list(APPEND CRYPTO_INC |
| 198 | + ${MBEDTLS_DIR}/include |
| 199 | + ) |
| 200 | +endif() |
| 201 | + |
| 202 | +list(APPEND inc_directories |
| 203 | + ${CRYPTO_INC} |
| 204 | + ) |
| 205 | + |
| 206 | +set(CFLAGS |
| 207 | + "-Wno-frame-address" |
| 208 | + "-Wall" |
| 209 | + "-Wextra" |
| 210 | + "-W" |
| 211 | + "-Wdeclaration-after-statement" |
| 212 | + "-Wwrite-strings" |
| 213 | + "-Wlogical-op" |
| 214 | + "-Wshadow" |
| 215 | + "-ffunction-sections" |
| 216 | + "-fdata-sections" |
| 217 | + "-fstrict-volatile-bitfields" |
| 218 | + "-Werror=all" |
| 219 | + "-Wno-error=unused-function" |
| 220 | + "-Wno-error=unused-but-set-variable" |
| 221 | + "-Wno-error=unused-variable" |
| 222 | + "-Wno-error=deprecated-declarations" |
| 223 | + "-Wno-unused-parameter" |
| 224 | + "-Wno-sign-compare" |
| 225 | + "-ggdb" |
| 226 | + "-Os" |
| 227 | + "-D_GNU_SOURCE" |
| 228 | + "-std=gnu17" |
| 229 | + "-Wno-old-style-declaration" |
| 230 | + "-Wno-implicit-int" |
| 231 | + "-Wno-declaration-after-statement" |
| 232 | + ) |
| 233 | + |
| 234 | +set(LDFLAGS |
| 235 | + "-nostdlib" |
| 236 | + "-Wno-frame-address" |
| 237 | + "-Wl,--cref" |
| 238 | + "-fno-rtti" |
| 239 | + "-fno-lto" |
| 240 | + "-Wl,--gc-sections" |
| 241 | + "-Wl,--undefined=uxTopUsedPriority" |
| 242 | + "-lm" |
| 243 | + "-lgcc" |
| 244 | + "-lgcov" |
| 245 | + ) |
| 246 | + |
| 247 | +if("${MCUBOOT_ARCH}" STREQUAL "xtensa") |
| 248 | + list(APPEND CFLAGS |
| 249 | + "-mlongcalls" |
| 250 | + ) |
| 251 | + list(APPEND LDFLAGS |
| 252 | + "-mlongcalls" |
| 253 | + ) |
| 254 | +endif() |
| 255 | + |
| 256 | +# Set linker script |
| 257 | +set(ld_input ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/ld/bootloader.ld) |
| 258 | +set(ld_output ${CMAKE_CURRENT_BINARY_DIR}/ld/bootloader.ld) |
| 259 | + |
| 260 | +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ld") |
| 261 | + |
| 262 | +get_directory_property(configs COMPILE_DEFINITIONS) |
| 263 | +foreach(c ${configs}) |
| 264 | + list(APPEND conf_defines "-D${c}") |
| 265 | +endforeach() |
| 266 | + |
| 267 | +# Preprocess linker script |
| 268 | +add_custom_command( |
| 269 | + TARGET ${APP_EXECUTABLE} PRE_LINK |
| 270 | + COMMAND ${CMAKE_C_COMPILER} -x c -E -P -o ${ld_output} ${conf_defines} ${ld_input} |
| 271 | + MAIN_DEPENDENCY ${ld_input} |
| 272 | + COMMENT "Preprocessing bootloader.ld linker script..." |
| 273 | + ) |
0 commit comments