Gustavo Henrique Nihei | 6a6b891 | 2021-11-12 11:43:10 -0300 | [diff] [blame] | 1 | # SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 2 | # |
| 3 | # SPDX-License-Identifier: Apache-2.0 |
| 4 | |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 5 | cmake_minimum_required(VERSION 3.13) |
| 6 | |
Almir Okato | fa173df | 2022-04-19 01:10:30 -0300 | [diff] [blame^] | 7 | include(${CMAKE_CURRENT_LIST_DIR}/tools/utils.cmake) |
| 8 | |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 9 | if (NOT DEFINED MCUBOOT_TARGET) |
| 10 | message(FATAL_ERROR "MCUBOOT_TARGET not defined. Please pass -DMCUBOOT_TARGET flag.") |
| 11 | endif() |
| 12 | |
| 13 | project(mcuboot_${MCUBOOT_TARGET}) |
| 14 | |
Shubham Kulkarni | c75b3c7 | 2021-07-20 11:43:28 +0530 | [diff] [blame] | 15 | add_definitions(-DMCUBOOT_TARGET=${MCUBOOT_TARGET}) |
| 16 | |
Almir Okato | 712fdb5 | 2021-08-06 10:22:56 -0300 | [diff] [blame] | 17 | if ("${MCUBOOT_TARGET}" STREQUAL "esp32" OR |
Almir Okato | 42e679d | 2022-01-18 00:16:58 -0300 | [diff] [blame] | 18 | "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR |
| 19 | "${MCUBOOT_TARGET}" STREQUAL "esp32s3") |
Almir Okato | 712fdb5 | 2021-08-06 10:22:56 -0300 | [diff] [blame] | 20 | set(MCUBOOT_ARCH "xtensa") |
| 21 | elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3") |
| 22 | set(MCUBOOT_ARCH "riscv") |
| 23 | endif() |
| 24 | |
Almir Okato | fa173df | 2022-04-19 01:10:30 -0300 | [diff] [blame^] | 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 | else() |
| 35 | message(FATAL_ERROR "Unsupported target ${MCUBOOT_TARGET}") |
| 36 | endif() |
| 37 | |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 38 | if (NOT DEFINED IDF_PATH) |
Shubham Kulkarni | c75b3c7 | 2021-07-20 11:43:28 +0530 | [diff] [blame] | 39 | if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/hal/esp-idf") |
| 40 | set(IDF_PATH "${CMAKE_CURRENT_LIST_DIR}/hal/esp-idf") |
| 41 | elseif (DEFINED ENV{IDF_PATH}) |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 42 | set(IDF_PATH $ENV{IDF_PATH}) |
| 43 | else() |
Shubham Kulkarni | c75b3c7 | 2021-07-20 11:43:28 +0530 | [diff] [blame] | 44 | message(FATAL_ERROR "IDF_PATH not found. Please update submodules or set IDF_PATH environment variable or pass -DIDF_PATH flag.") |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 45 | endif() |
| 46 | endif() |
| 47 | |
| 48 | execute_process( |
| 49 | COMMAND git describe --tags |
Shubham Kulkarni | 8787bb0 | 2021-07-20 11:46:03 +0530 | [diff] [blame] | 50 | WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} |
| 51 | OUTPUT_VARIABLE MCUBOOT_VER |
| 52 | OUTPUT_STRIP_TRAILING_WHITESPACE |
| 53 | ) |
| 54 | add_definitions(-DMCUBOOT_VER=\"${MCUBOOT_VER}\") |
| 55 | |
Almir Okato | fa173df | 2022-04-19 01:10:30 -0300 | [diff] [blame^] | 56 | if (NOT DEFINED MCUBOOT_CONFIG_FILE) |
| 57 | set(MCUBOOT_CONFIG_FILE "${CMAKE_CURRENT_LIST_DIR}/port/${MCUBOOT_TARGET}/bootloader.conf") |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 58 | endif() |
| 59 | |
Almir Okato | fa173df | 2022-04-19 01:10:30 -0300 | [diff] [blame^] | 60 | string(REPLACE " " ";" MCUBOOT_CONFIG_FILE_LIST "${MCUBOOT_CONFIG_FILE}") |
| 61 | foreach(CONFIG_FILE ${MCUBOOT_CONFIG_FILE_LIST}) |
| 62 | if (NOT EXISTS "${CONFIG_FILE}") |
| 63 | message(FATAL_ERROR "MCUboot configuration file does not exist at ${CONFIG_FILE}") |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 64 | endif() |
Almir Okato | fa173df | 2022-04-19 01:10:30 -0300 | [diff] [blame^] | 65 | parse_and_set_config_file(${CONFIG_FILE}) |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 66 | endforeach() |
| 67 | |
| 68 | set(APP_NAME mcuboot_${MCUBOOT_TARGET}) |
| 69 | set(APP_EXECUTABLE ${APP_NAME}.elf) |
| 70 | |
| 71 | set(MCUBOOT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) |
| 72 | set(BOOTUTIL_DIR ${MCUBOOT_ROOT_DIR}/boot/bootutil) |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 73 | set(ESPRESSIF_PORT_DIR ${CMAKE_CURRENT_LIST_DIR}) |
| 74 | |
Gustavo Henrique Nihei | 72627c5 | 2021-11-01 18:29:25 -0300 | [diff] [blame] | 75 | # Find imgtool. |
| 76 | # Go with an explicitly installed imgtool first, falling |
| 77 | # back to mcuboot/scripts/imgtool.py. |
| 78 | find_program(IMGTOOL_COMMAND |
| 79 | NAMES imgtool imgtool.py |
| 80 | ) |
| 81 | if ("${IMGTOOL_COMMAND}" MATCHES "IMGTOOL_COMMAND-NOTFOUND") |
| 82 | set(imgtool_path "${MCUBOOT_ROOT_DIR}/scripts/imgtool.py") |
| 83 | else() |
| 84 | set(imgtool_path "${IMGTOOL_COMMAND}") |
| 85 | endif() |
| 86 | |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 87 | if (DEFINED CONFIG_ESP_SIGN_RSA) |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 88 | include(${CMAKE_CURRENT_LIST_DIR}/include/crypto_config/rsa.cmake) |
| 89 | elseif (DEFINED CONFIG_ESP_SIGN_EC256) |
| 90 | include(${CMAKE_CURRENT_LIST_DIR}/include/crypto_config/ec256.cmake) |
| 91 | elseif (DEFINED CONFIG_ESP_SIGN_ED25519) |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 92 | include(${CMAKE_CURRENT_LIST_DIR}/include/crypto_config/ed25519.cmake) |
| 93 | else() |
| 94 | # No signature verification |
| 95 | set(TINYCRYPT_DIR ${MCUBOOT_ROOT_DIR}/ext/tinycrypt/lib) |
| 96 | set(CRYPTO_INC |
| 97 | ${TINYCRYPT_DIR}/include |
| 98 | ) |
| 99 | set(crypto_srcs |
| 100 | ${TINYCRYPT_DIR}/source/sha256.c |
| 101 | ${TINYCRYPT_DIR}/source/utils.c |
| 102 | ) |
| 103 | endif() |
| 104 | |
| 105 | if(DEFINED CONFIG_ESP_SIGN_KEY_FILE) |
| 106 | if(IS_ABSOLUTE ${CONFIG_ESP_SIGN_KEY_FILE}) |
| 107 | set(KEY_FILE ${CONFIG_ESP_SIGN_KEY_FILE}) |
| 108 | else() |
| 109 | set(KEY_FILE ${MCUBOOT_ROOT_DIR}/${CONFIG_ESP_SIGN_KEY_FILE}) |
| 110 | endif() |
| 111 | message("MCUBoot bootloader key file: ${KEY_FILE}") |
| 112 | |
| 113 | set(GENERATED_PUBKEY ${CMAKE_CURRENT_BINARY_DIR}/autogen-pubkey.c) |
| 114 | add_custom_command( |
| 115 | OUTPUT ${GENERATED_PUBKEY} |
| 116 | COMMAND |
Gustavo Henrique Nihei | 72627c5 | 2021-11-01 18:29:25 -0300 | [diff] [blame] | 117 | ${imgtool_path} |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 118 | getpub |
| 119 | -k |
| 120 | ${KEY_FILE} |
| 121 | > ${GENERATED_PUBKEY} |
| 122 | DEPENDS ${KEY_FILE} |
| 123 | ) |
| 124 | list(APPEND crypto_srcs ${GENERATED_PUBKEY}) |
| 125 | endif() |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 126 | |
| 127 | set(bootutil_srcs |
| 128 | ${BOOTUTIL_DIR}/src/boot_record.c |
| 129 | ${BOOTUTIL_DIR}/src/bootutil_misc.c |
| 130 | ${BOOTUTIL_DIR}/src/bootutil_public.c |
| 131 | ${BOOTUTIL_DIR}/src/caps.c |
| 132 | ${BOOTUTIL_DIR}/src/encrypted.c |
| 133 | ${BOOTUTIL_DIR}/src/fault_injection_hardening.c |
| 134 | ${BOOTUTIL_DIR}/src/fault_injection_hardening_delay_rng_mbedtls.c |
| 135 | ${BOOTUTIL_DIR}/src/image_ec.c |
| 136 | ${BOOTUTIL_DIR}/src/image_ec256.c |
| 137 | ${BOOTUTIL_DIR}/src/image_ed25519.c |
| 138 | ${BOOTUTIL_DIR}/src/image_rsa.c |
| 139 | ${BOOTUTIL_DIR}/src/image_validate.c |
| 140 | ${BOOTUTIL_DIR}/src/loader.c |
| 141 | ${BOOTUTIL_DIR}/src/swap_misc.c |
| 142 | ${BOOTUTIL_DIR}/src/swap_move.c |
| 143 | ${BOOTUTIL_DIR}/src/swap_scratch.c |
| 144 | ${BOOTUTIL_DIR}/src/tlv.c |
| 145 | ) |
| 146 | |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 147 | set(CFLAGS |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 148 | "-Wno-frame-address" |
| 149 | "-Wall" |
| 150 | "-Wextra" |
| 151 | "-W" |
| 152 | "-Wdeclaration-after-statement" |
| 153 | "-Wwrite-strings" |
| 154 | "-Wlogical-op" |
| 155 | "-Wshadow" |
| 156 | "-ffunction-sections" |
| 157 | "-fdata-sections" |
| 158 | "-fstrict-volatile-bitfields" |
| 159 | "-Werror=all" |
| 160 | "-Wno-error=unused-function" |
| 161 | "-Wno-error=unused-but-set-variable" |
| 162 | "-Wno-error=unused-variable" |
| 163 | "-Wno-error=deprecated-declarations" |
| 164 | "-Wno-unused-parameter" |
| 165 | "-Wno-sign-compare" |
| 166 | "-ggdb" |
| 167 | "-Os" |
| 168 | "-D_GNU_SOURCE" |
| 169 | "-std=gnu99" |
| 170 | "-Wno-old-style-declaration" |
| 171 | "-Wno-implicit-int" |
| 172 | "-Wno-declaration-after-statement" |
| 173 | ) |
| 174 | |
| 175 | set(LDFLAGS |
| 176 | "-nostdlib" |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 177 | "-Wno-frame-address" |
| 178 | "-Wl,--cref" |
| 179 | "-Wl,--Map=${APP_NAME}.map" |
| 180 | "-fno-rtti" |
| 181 | "-fno-lto" |
| 182 | "-Wl,--gc-sections" |
| 183 | "-Wl,--undefined=uxTopUsedPriority" |
| 184 | "-lm" |
| 185 | "-lgcc" |
| 186 | "-lgcov" |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 187 | ) |
| 188 | |
Almir Okato | 712fdb5 | 2021-08-06 10:22:56 -0300 | [diff] [blame] | 189 | if ("${MCUBOOT_ARCH}" STREQUAL "xtensa") |
| 190 | list(APPEND CFLAGS |
| 191 | "-mlongcalls" |
| 192 | ) |
| 193 | list(APPEND LDFLAGS |
| 194 | "-mlongcalls" |
| 195 | ) |
| 196 | endif() |
| 197 | |
Shubham Kulkarni | c75b3c7 | 2021-07-20 11:43:28 +0530 | [diff] [blame] | 198 | add_subdirectory(hal) |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 199 | add_executable( |
| 200 | ${APP_EXECUTABLE} |
| 201 | ${CMAKE_CURRENT_LIST_DIR}/main.c |
| 202 | ) |
| 203 | |
| 204 | target_compile_options( |
| 205 | ${APP_EXECUTABLE} |
| 206 | PUBLIC |
| 207 | ${CFLAGS} |
| 208 | ) |
| 209 | |
| 210 | target_sources( |
| 211 | ${APP_EXECUTABLE} |
| 212 | PUBLIC |
| 213 | ${bootutil_srcs} |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 214 | ${crypto_srcs} |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 215 | ${CMAKE_CURRENT_LIST_DIR}/port/esp_mcuboot.c |
Shubham Kulkarni | 8787bb0 | 2021-07-20 11:46:03 +0530 | [diff] [blame] | 216 | ${CMAKE_CURRENT_LIST_DIR}/port/esp_loader.c |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 217 | ${CMAKE_CURRENT_LIST_DIR}/os.c |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 218 | ) |
| 219 | |
| 220 | target_include_directories( |
| 221 | ${APP_EXECUTABLE} |
| 222 | PUBLIC |
| 223 | ${BOOTUTIL_DIR}/include |
Almir Okato | eb6b7bf | 2021-09-07 17:06:35 -0300 | [diff] [blame] | 224 | ${CRYPTO_INC} |
Shubham Kulkarni | 052561d | 2021-07-20 11:42:44 +0530 | [diff] [blame] | 225 | ${CMAKE_CURRENT_LIST_DIR}/include |
| 226 | ) |
| 227 | |
| 228 | target_link_libraries( |
| 229 | ${APP_EXECUTABLE} |
| 230 | PUBLIC |
| 231 | -T${CMAKE_CURRENT_LIST_DIR}/port/${MCUBOOT_TARGET}/ld/bootloader.ld |
| 232 | ${LDFLAGS} |
| 233 | ) |
Shubham Kulkarni | c75b3c7 | 2021-07-20 11:43:28 +0530 | [diff] [blame] | 234 | |
| 235 | target_link_libraries( |
| 236 | ${APP_EXECUTABLE} |
| 237 | PUBLIC |
| 238 | hal |
| 239 | ) |
Almir Okato | fa173df | 2022-04-19 01:10:30 -0300 | [diff] [blame^] | 240 | |
| 241 | # This step uses esptool.py for generating the final bootloader binary in |
| 242 | # Espressif compatible format. |
| 243 | # Note: Both binary generation and flash steps still have some default arguments |
| 244 | add_custom_command(TARGET ${APP_EXECUTABLE} POST_BUILD |
| 245 | COMMAND |
| 246 | ${IDF_PATH}/components/esptool_py/esptool/esptool.py |
| 247 | --chip ${MCUBOOT_TARGET} elf2image --min-rev ${ESP_MIN_REVISION} |
| 248 | --flash_mode dio --flash_freq 40m --flash_size ${CONFIG_ESP_FLASH_SIZE} |
| 249 | -o ${APP_NAME}.bin ${APP_NAME}.elf |
| 250 | ) |
| 251 | |
| 252 | if (DEFINED MCUBOOT_FLASH_PORT) |
| 253 | set(FLASH_PORT ${MCUBOOT_FLASH_PORT}) |
| 254 | else() |
| 255 | # Defaults to the first USB serial port |
| 256 | set(FLASH_PORT "/dev/ttyUSB0") |
| 257 | endif() |
| 258 | |
| 259 | if (NOT EXISTS "${FLASH_PORT}") |
| 260 | message(WARNING "Could not open ${FLASH_PORT}, serial port does not exist") |
| 261 | endif() |
| 262 | |
| 263 | add_custom_target(flash DEPENDS ${APP_NAME}.bin) |
| 264 | add_custom_command(TARGET flash |
| 265 | USES_TERMINAL |
| 266 | COMMAND |
| 267 | ${IDF_PATH}/components/esptool_py/esptool/esptool.py |
| 268 | -p ${FLASH_PORT} -b 2000000 --before default_reset --after no_reset |
| 269 | --chip ${MCUBOOT_TARGET} write_flash |
| 270 | --flash_mode dio --flash_size ${CONFIG_ESP_FLASH_SIZE} |
| 271 | --flash_freq 40m ${CONFIG_ESP_BOOTLOADER_OFFSET} |
| 272 | ${APP_NAME}.bin |
| 273 | ) |