summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/reference/hil_boards.md2
-rw-r--r--docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md13
-rwxr-xr-xtools/build.py4
3 files changed, 16 insertions, 3 deletions
diff --git a/docs/reference/hil_boards.md b/docs/reference/hil_boards.md
index e8f364646..678f7f0ed 100644
--- a/docs/reference/hil_boards.md
+++ b/docs/reference/hil_boards.md
@@ -12,7 +12,7 @@
| espressif_s3_devkitm | device, host | esptool | espressif_s3_devkitm, espressif_s3_devkitm-DMA | Use TS3USB30 mux to test both device and host |
| feather_nrf52840_express | device | jlink | | |
| max32666fthr | device | openocd | | |
-| metro_m4_express | device, dual | jlink | | pl23x; audio_test_freertos skipped: samd51 iso-IN capture fails (arecord EIO) |
+| metro_m4_express | device, dual | jlink | metro_m4_express | pl23x; audio_test_freertos skipped: samd51 iso-IN capture fails (arecord EIO) |
| lpcxpresso11u37 | device | jlink | | |
| lpcxpresso55s28 | device | jlink | | |
| ra4m1_ek | device | jlink | | |
diff --git a/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md b/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md
index b10f5b4ae..524568aeb 100644
--- a/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md
+++ b/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md
@@ -146,6 +146,19 @@ the existing `test_hil_util.BottomLayer` structural tests.
Fail-open survives where it belongs: an *unclassified* path or any exception widens to `ALL` on
every axis.
+### A class no example enables selects nothing
+
+`src/class/bth` is the live instance: no example's `tusb_config.h` sets `CFG_TUD_BTH`, so
+rules 8-10 resolve to no examples and a bth-only PR builds nothing and runs nothing. That is
+the empty-means-empty ruling applied to classes, and it is deliberate — nothing compiles the
+file, so nothing can validate it, and the master-push build is the net.
+
+Worth stating plainly because the exposure changed: GHA used to rebuild everything for such
+a PR by accident, through the empty-`families` bug in `build.yml`. With that fixed, both
+providers now correctly build nothing, so `tud_bt_*` can be broken by a green PR.
+`TestClassesWithNoEnablingExample` pins the set to `{bth}` so a second class cannot enter
+this state unnoticed.
+
### Why `hw/mcu/**` is rule 7 and not "full"
`hw/mcu` is overwhelmingly dependency territory — `tools/get_deps.py` has 87 entries under it,
diff --git a/tools/build.py b/tools/build.py
index eeefca22d..0bb366e3d 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -356,11 +356,11 @@ def get_family_boards(family, one_random, one_first, examples=None, build_system
# the WHOLE preferred list, in order - stopping at entry one would abandon a
# curated list for the raw alphabetical order the moment its first board cannot
# build the filter, which also moves the board the metrics baseline is keyed on
+ # the whole preferred list, in order. Unreachable-when-unfiltered: with
+ # examples is None, buildable() is True and the loop returns on entry one.
for b in preferred_list:
if buildable(b):
return [b]
- if preferred_list and examples is None:
- return [preferred_list[0]]
candidates = [b for b in all_boards if buildable(b)] or all_boards
if one_first:
return [candidates[0]]