Fifty-two libavr commits and twenty-seven of pureboot behind, which is far enough that "it still builds" is not the interesting part. It builds, both modes, byte-identical across them, five checks green - and the image is **byte-for-byte the 8004 B the board is running**, so the catch-up costs this deployment nothing and a redeploy was ruled out by comparison rather than skipped by assumption. The loader is the gap that mattered. pureboot rode as a submodule for its geometry alone, so the commit that pinned this firmware did not build the one image this board cannot be recovered without - the same hole tempmon had. `pureboot_add_loader(pureboot)` closes it on nothing but pureboot's own defaults for the chip, and the 386 B it produces is byte-for-byte what the board's slot reads back. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
52 lines
2.5 KiB
CMake
52 lines
2.5 KiB
CMake
cmake_minimum_required(VERSION 3.28)
|
|
|
|
project(fantemp LANGUAGES CXX)
|
|
|
|
# libavr rides as the pinned submodule; LIBAVR_ROOT (cache or environment)
|
|
# overrides it for tandem development against a working tree. The toolchain
|
|
# file comes from the submodule via CMakePresets.json either way.
|
|
if(NOT LIBAVR_ROOT AND DEFINED ENV{LIBAVR_ROOT})
|
|
set(LIBAVR_ROOT $ENV{LIBAVR_ROOT})
|
|
endif()
|
|
if(NOT LIBAVR_ROOT)
|
|
set(LIBAVR_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/libavr)
|
|
endif()
|
|
if(NOT EXISTS ${LIBAVR_ROOT}/CMakeLists.txt)
|
|
message(FATAL_ERROR "libavr not found at ${LIBAVR_ROOT} - run: git submodule update --init libavr")
|
|
endif()
|
|
# pureboot rides as a pinned submodule too: this board's only way in is its
|
|
# resident loader, so the commit that names this firmware names the loader it
|
|
# has to hand over to. Consumed for the geometry it exports - the loader links
|
|
# the libavr target above, so pureboot's own libavr submodule stays
|
|
# uninitialised.
|
|
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/pureboot/CMakeLists.txt)
|
|
message(FATAL_ERROR "pureboot not found - run: git submodule update --init pureboot")
|
|
endif()
|
|
add_subdirectory(${LIBAVR_ROOT} libavr-build)
|
|
add_subdirectory(pureboot pureboot-build)
|
|
include(${LIBAVR_ROOT}/cmake/checks.cmake)
|
|
|
|
add_executable(fantemp src/main.cpp)
|
|
target_link_libraries(fantemp PRIVATE libavr)
|
|
# The raw image is what the loader takes, and what the reachability check
|
|
# measures the boot-section clearance against.
|
|
add_custom_command(TARGET fantemp POST_BUILD
|
|
COMMAND ${CMAKE_SIZE} $<TARGET_FILE:fantemp>
|
|
COMMAND ${CMAKE_OBJCOPY} -O binary -R .eeprom
|
|
$<TARGET_FILE:fantemp> $<TARGET_FILE_DIR:fantemp>/fantemp.bin
|
|
COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom
|
|
$<TARGET_FILE:fantemp> $<TARGET_FILE_DIR:fantemp>/fantemp.hex)
|
|
|
|
# The board's loader, built here rather than named from memory: consuming
|
|
# pureboot for its geometry alone left the one image this deployment cannot be
|
|
# recovered without outside the repository that pins it. Every parameter is
|
|
# pureboot's own default for this chip - USART0 at 115200 on the 16 MHz crystal
|
|
# `src/board.hpp` declares - and that is measured rather than assumed, the
|
|
# image being byte-for-byte the 386 B the board's slot reads back. It goes on
|
|
# over the wire (`--update-loader`), which is why there is no flash target
|
|
# beside it: no programmer has ever been in this board's path.
|
|
pureboot_add_loader(pureboot)
|
|
|
|
enable_testing()
|
|
add_subdirectory(test)
|