From d6b3e8528466bb0adf613e35f5931cf6b553e2f4 Mon Sep 17 00:00:00 2001 From: BlackMark Date: Mon, 20 Jul 2026 21:57:26 +0200 Subject: [PATCH] build: emit an Intel-HEX beside every loader image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit avrdude programs Intel-HEX, not ELF, and the build produced only ELFs — so flashing a loader to a real chip meant running objcopy by hand. add_hex_output() hangs a POST_BUILD objcopy on each loader image: the three tsb tiers through add_tsb_variant, pureboot, and the re-timed pureboot9. .eeprom is dropped, being its own avrdude update. It uses the toolchain file's CMAKE_OBJCOPY rather than a hardcoded path, so every chip preset emits hex, not just the mega. pbapp keeps its ELF alone: the update test converts it to a raw binary itself, and it is not a flashing target. Co-Authored-By: Claude Opus 4.8 (1M context) --- CMakeLists.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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}