deps: the libavr pin advances, and a check its host cannot run skips rather than going missing

The protocol tests are registered on every host now and skip where the simavr
device cannot be built. They used to be left out of the suite entirely, which
makes its size a property of the machine - and a suite whose size is a property
of the machine is one nothing can be compared against.

The reason travels with the skip: no compiler, no Python, or one bounded line
of whatever stopped test/device.cpp from linking, so the reading says what is
absent rather than that something is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 18:00:38 +02:00
parent 9575145f0d
commit 243b258d4d
2 changed files with 43 additions and 23 deletions

View File

@@ -29,15 +29,20 @@ if(PROJECT_IS_TOP_LEVEL)
libavr_format_test() libavr_format_test()
# The behavioral tests drive the real wire protocols over a simavr pty # The behavioral tests drive the real wire protocols over a simavr pty
# (as the host tools do) and actually flash the device. The runners are # (as the host tools do) and actually flash the device. The runner is a
# host programs built at configure time against libsimavr (C++23 - what # host program built at configure time against libsimavr (C++23 - what the
# the distribution's compiler speaks in full); if they or Python are # distribution's compiler speaks in full).
# missing, only the size tests run. #
find_program(_host_cxx NAMES c++ g++) # **A host that cannot build it registers those tests anyway and skips
find_package(Python3 COMPONENTS Interpreter) # them.** They used to be left out, which makes the suite a different size
if(_host_cxx AND Python3_FOUND) # on a different machine - and a suite whose size is a property of the
if(LIBAVR_MCU STREQUAL "atmega328p") # machine is one nothing can be compared against.
set(TSB_DEVICE ${CMAKE_BINARY_DIR}/tsb_device) set(TSB_DEVICE ${CMAKE_BINARY_DIR}/tsb_device)
find_program(_host_cxx NAMES c++ g++)
set(_tsb_absent "${LIBAVR_NO_PYTHON}")
if(NOT _host_cxx)
set(_tsb_absent "no host C++ compiler on PATH, and the simavr device is a host program")
elseif(NOT _tsb_absent)
execute_process( execute_process(
COMMAND ${_host_cxx} -std=c++23 -Wall -Wextra -O2 COMMAND ${_host_cxx} -std=c++23 -Wall -Wextra -O2
-I/usr/include/simavr -I/usr/include/simavr/parts -I/usr/include/simavr -I/usr/include/simavr/parts
@@ -45,10 +50,21 @@ if(PROJECT_IS_TOP_LEVEL)
-lsimavr -lsimavrparts -lelf -lsimavr -lsimavrparts -lelf
RESULT_VARIABLE _dev_res ERROR_VARIABLE _dev_err) RESULT_VARIABLE _dev_res ERROR_VARIABLE _dev_err)
if(NOT _dev_res EQUAL 0) if(NOT _dev_res EQUAL 0)
message(STATUS "tsb_device not built (${_dev_err}) - protocol tests skipped") # One bounded line of it: this becomes a single argument on a
unset(TSB_DEVICE) # command line, and the reading has to say what stopped the build
# rather than that something did.
string(REGEX REPLACE "[\r\n\t]+" " " _dev_err "${_dev_err}")
string(REPLACE ";" "," _dev_err "${_dev_err}")
string(LENGTH "${_dev_err}" _dev_len)
if(_dev_len GREATER 240)
string(SUBSTRING "${_dev_err}" 0 240 _dev_err)
endif()
set(_tsb_absent "test/device.cpp does not build here: ${_dev_err}")
endif() endif()
endif() endif()
libavr_launcher(_tsb_python "${_tsb_absent}" ${Python3_EXECUTABLE})
if(_tsb_absent)
message(STATUS "the protocol tests skip here - ${_tsb_absent}")
endif() endif()
endif() endif()
@@ -114,12 +130,10 @@ function(add_tsb_variant name bytes)
add_test(NAME ${name}.size add_test(NAME ${name}.size
COMMAND ${CMAKE_COMMAND} -DSIZE_TOOL=${CMAKE_SIZE} -DELF=$<TARGET_FILE:${name}> COMMAND ${CMAKE_COMMAND} -DSIZE_TOOL=${CMAKE_SIZE} -DELF=$<TARGET_FILE:${name}>
-DLIMIT=${bytes} -P ${CMAKE_CURRENT_SOURCE_DIR}/test/check_size.cmake) -DLIMIT=${bytes} -P ${CMAKE_CURRENT_SOURCE_DIR}/test/check_size.cmake)
if(DEFINED TSB_DEVICE)
add_test(NAME ${name}.protocol add_test(NAME ${name}.protocol
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/tsbtest.py COMMAND ${_tsb_python} ${CMAKE_CURRENT_SOURCE_DIR}/test/tsbtest.py
${TSB_DEVICE} $<TARGET_FILE:${name}> ${base_hex}) ${TSB_DEVICE} $<TARGET_FILE:${name}> ${base_hex})
endif() endif()
endif()
endfunction() endfunction()
# The tiers reimplement the ATmega328P-only reference protocol, so the guard is # The tiers reimplement the ATmega328P-only reference protocol, so the guard is
@@ -135,3 +149,9 @@ if(LIBAVR_MCU STREQUAL "atmega328p")
# floors were measured with - none. # floors were measured with - none.
target_compile_options(tsb_policy PRIVATE -fno-move-loop-invariants -fno-tree-ter) target_compile_options(tsb_policy PRIVATE -fno-move-loop-invariants -fno-tree-ter)
endif() endif()
# Every test registered above carries the marker a stubbed launcher prints, so
# a check this host cannot run reads as Skipped rather than Failed.
if(PROJECT_IS_TOP_LEVEL)
libavr_skip_unverified()
endif()

2
libavr

Submodule libavr updated: b62d6b5b30...8521f48a33