diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d0b2ef..ca7c263 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,15 @@ if(PROJECT_IS_TOP_LEVEL) endif() endif() +# avrdude programs Intel-HEX; the ELF is only a container (symbols, section +# headers) and is never flashed. Every loader image therefore gets a .hex beside +# it at link time. .eeprom is dropped — EEPROM content is its own avrdude update. +function(add_hex_output name) + add_custom_command(TARGET ${name} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom + $ $.hex) +endfunction() + # The TinySafeBoot protocol reimplemented on libavr in three variants that trade # clarity for size. Each links into the ATmega328P boot section (BOOTSZ selects # its size; BOOTRST vectors a reset to its base) with -nostartfiles — a polled @@ -90,6 +99,7 @@ function(add_tsb_variant name bytes) target_link_options(${name} PRIVATE -nostartfiles -Wl,--section-start=.text=${base_hex} -Wl,--defsym=tsb_app=0 -Wl,--pmem-wrap-around=32k) add_custom_command(TARGET ${name} POST_BUILD COMMAND ${CMAKE_SIZE} $) + add_hex_output(${name}) if(PROJECT_IS_TOP_LEVEL) add_test(NAME ${name}.size COMMAND ${CMAKE_COMMAND} -DSIZE_TOOL=${CMAKE_SIZE} -DELF=$ @@ -166,6 +176,7 @@ target_compile_definitions(pureboot PRIVATE PUREBOOT_TIMEOUT=${PUREBOOT_TIMEOUT} target_link_options(pureboot PRIVATE -nostartfiles -Wl,--section-start=.text=${_pb_base_hex} -Wl,--defsym=pureboot_app=${_pb_app} ${_pb_wrap}) add_custom_command(TARGET pureboot POST_BUILD COMMAND ${CMAKE_SIZE} $) +add_hex_output(pureboot) if(PROJECT_IS_TOP_LEVEL) add_test(NAME pureboot.size COMMAND ${CMAKE_COMMAND} -DSIZE_TOOL=${CMAKE_SIZE} -DELF=$ @@ -214,6 +225,7 @@ if(PROJECT_IS_TOP_LEVEL) target_compile_definitions(pureboot9 PRIVATE PUREBOOT_TIMEOUT=9) target_link_options(pureboot9 PRIVATE -nostartfiles -Wl,--section-start=.text=${_pb_base_hex} -Wl,--defsym=pureboot_app=${_pb_app} ${_pb_wrap}) + add_hex_output(pureboot9) add_test(NAME pureboot.update COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/pbupdate.py ${PB_DEVICE} $ $ ${LIBAVR_MCU}