pureboot is at git.blackmark.me/avr/pureboot now, with its own history: the files it kept in pureboot/ sit at the top level there, its CMakeLists is the merged whole of that unit and the build around it, and the v1..v8 tags moved with it - each one checks out and compiles to exactly the .text it compiled to here. The loader that repo builds is byte-identical to the one this commit removes, verified before the removal rather than after. Nothing is rewritten on this side. The history and the tags are untouched, so every commit before this one still has pureboot in it and still builds it; this is one commit that stops carrying it forward. What goes with it: the four pureboot files, the thirteen pb*.py protocol drivers and their four host-side unit tests, pbapp and the pureboot simavr runner, check_pi.py, pbhw.py, pbrig.py, sizes.py, and the Studio project. check_unit.cmake goes too - it had no caller left once the unit tests moved. What is left is the four TinySafeBoot tiers, and the build shrinks to fit them: 757 lines of CMakeLists to 137, and the preset matrix from 37 chips to one, because the tiers reimplement an ATmega328P-only protocol and every other chip in that list was there for pureboot. check.sh loses its size-table pass - the table it checked was pureboot's README - and the Studio solution loses the project that is now in the other repo. Gate green: nine tests, four tiers at their section sizes and each one's protocol suite against the simulator. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
61 lines
1.9 KiB
Bash
Executable File
61 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# The port's gate: the generated workflow - build, size tests, and the
|
|
# simulator-driven protocol suite. --full adds the reflect build, which
|
|
# compiles the same TUs through libavr's other producer. libavr resolves from
|
|
# the `libavr/` submodule; LIBAVR_ROOT overrides it for a working tree.
|
|
set -e
|
|
cd "$(dirname "$0")/.."
|
|
|
|
full=0
|
|
[[ "$1" == "--full" ]] && { full=1; shift; }
|
|
|
|
# The chip lists come from the presets rather than being spelled a second time
|
|
# here: a chip added to make_presets.py and missed in a copy of its list would
|
|
# be a gate that silently never builds it, which is the one failure mode a gate
|
|
# cannot report. tools/make_presets.py is the single source, CMakePresets.json
|
|
# is its output, and this reads that.
|
|
readarray -t WORKFLOWS < <(python3 -c '
|
|
import json, sys
|
|
presets = json.load(open("CMakePresets.json"))["workflowPresets"]
|
|
print("\n".join(p["name"] for p in presets))')
|
|
if ((${#WORKFLOWS[@]} == 0)); then
|
|
echo "no workflow presets in CMakePresets.json - run tools/make_presets.py" >&2
|
|
exit 1
|
|
fi
|
|
CHIPS=()
|
|
REFLECT_SPOT=()
|
|
for workflow in "${WORKFLOWS[@]}"; do
|
|
case $workflow in
|
|
*-generated) CHIPS+=("${workflow%-generated}") ;;
|
|
*-reflect) REFLECT_SPOT+=("${workflow%-reflect}") ;;
|
|
esac
|
|
done
|
|
|
|
# Every preset runs even after one goes red, and the gate fails at the end
|
|
# naming all of them: stopping at the first failure turns a red - a stale size
|
|
# canary above all - into an alibi for every chip behind it, and a loader can
|
|
# ship on a chip this gate has not compiled since.
|
|
red=()
|
|
run_preset() {
|
|
echo "==== $1 ===="
|
|
cmake --workflow --preset "$1" "${@:2}" || red+=("$1")
|
|
}
|
|
|
|
for chip in "${CHIPS[@]}"; do
|
|
run_preset "$chip-generated" "$@"
|
|
done
|
|
|
|
if ((full)); then
|
|
for chip in "${REFLECT_SPOT[@]}"; do
|
|
run_preset "$chip-reflect" "$@"
|
|
done
|
|
fi
|
|
|
|
if ((${#red[@]})); then
|
|
printf '==== red presets ====\n' >&2
|
|
printf ' %s\n' "${red[@]}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "check: every chip green"
|