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} $ COMMAND ${CMAKE_OBJCOPY} -O binary -R .eeprom $ $/fantemp.bin COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom $ $/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)