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,27 +29,43 @@ 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. #
# **A host that cannot build it registers those tests anyway and skips
# them.** They used to be left out, which makes the suite a different size
# on a different machine - and a suite whose size is a property of the
# machine is one nothing can be compared against.
set(TSB_DEVICE ${CMAKE_BINARY_DIR}/tsb_device)
find_program(_host_cxx NAMES c++ g++) find_program(_host_cxx NAMES c++ g++)
find_package(Python3 COMPONENTS Interpreter) set(_tsb_absent "${LIBAVR_NO_PYTHON}")
if(_host_cxx AND Python3_FOUND) if(NOT _host_cxx)
if(LIBAVR_MCU STREQUAL "atmega328p") set(_tsb_absent "no host C++ compiler on PATH, and the simavr device is a host program")
set(TSB_DEVICE ${CMAKE_BINARY_DIR}/tsb_device) 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
-o ${TSB_DEVICE} ${CMAKE_CURRENT_SOURCE_DIR}/test/device.cpp -o ${TSB_DEVICE} ${CMAKE_CURRENT_SOURCE_DIR}/test/device.cpp
-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() 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()
# The ELF is only a container (symbols, section headers) and is never flashed - # The ELF is only a container (symbols, section headers) and is never flashed -
@@ -114,11 +130,9 @@ 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 ${_tsb_python} ${CMAKE_CURRENT_SOURCE_DIR}/test/tsbtest.py
COMMAND ${Python3_EXECUTABLE} ${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()
@@ -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