@@ -11,11 +11,11 @@ CircuitPython will accept it and that every requested library exists.
1111
1212| Tool | Version | Source |
1313| ---| ---| ---|
14- | mpy-cross | ` CircuitPython 10.3.0-alpha.4-73-gf1ae373ad0 on 2026-09-08; mpy-cross emitting mpy v6.3 ` (x86-64 Linux, dynamically linked) | ` gh run download --repo tyeth/circuitpython 34253440312 --name mpy-cross ` |
14+ | mpy-cross | ` CircuitPython 10.3.0-alpha.4-73-gf1ae373ad0 on 2026-09-08; mpy-cross emitting mpy v6.3 ` (x86-64 Linux, dynamically linked) | ` gh run download --repo tyeth/circuitpython 34494018766 --name mpy-cross ` |
1515| circup | 3.0.4 (in a venv) | PyPI |
1616| Adafruit_CircuitPython_Bundle | 20260905, ` 10.x-mpy ` platform | via circup |
1717| CircuitPython_Community_Bundle | 20260826 | via circup (not actually needed) |
18- | good-enough-technology/circuitpython_goodenough_bundle | 202311252150 — ** no ` 10mpy ` platform** , circup fell back to ` .py ` | via ` circup bundle-add ` (SEN5x only) |
18+ | good-enough-technology/circuitpython_goodenough_bundle | 202311252150 — ** no ` 10.x-mpy ` platform** , circup fell back to ` .py ` . Cause found and fixed, see below | via ` circup bundle-add ` (SEN5x only) |
1919
2020The committed ` boot_out.txt ` files pin circup to CircuitPython
212110.3.0-alpha.4; circup notes 10.3.0 final is now released. The bundle
@@ -41,7 +41,8 @@ adafruit_bus_device==5.2.17 adafruit_pixelbuf==2.1.0 adafruit_register==1.12.1
4141
4242SEN5x driver (` sensirion_i2c_sen5x ` + ` sensirion_i2c_driver ` ) resolved
4343from the custom bundle ** as source** : that bundle has no ` 10.x-mpy `
44- build, so circup installed the ` .py ` trees. All 22 of those ` .py ` files
44+ build, so circup installed the ` .py ` trees. The reason is a bug in the
45+ bundle's own build, now fixed -- see * The missing 10.x-mpy* below. All 22 of those ` .py ` files
4546compile with this mpy-cross (0 rejected). circup also warned
4647` circuitpython_sensirion_i2c_driver is not a known CircuitPython library `
4748— a dependency-metadata name mismatch inside the custom bundle; harmless,
@@ -71,6 +72,56 @@ empty package `__init__.py` placeholders plus `adafruit_ble/services/microbit.py
7172Informational: the 5 files in ` examples/ ` and 9 in ` tools/ ` also pass
7273mpy-cross, though ` tools/ ` is host-side Python and not deployed.
7374
75+ ## The missing 10.x-mpy in the good-enough bundle
76+
77+ The custom bundle's newest release is ` 202311252150 ` (November 2023) and
78+ carries only ` 8.x-mpy ` and ` 9.x-mpy ` platform zips, which is why circup
79+ falls back to installing the SEN5x driver as ` .py ` . Re-running its CI does
80+ produce a ` 10.x-mpy ` -- ` requirements.txt ` is unpinned, so a fresh run
81+ picks up circuitpython-build-tools 1.20.1, which builds against mpy-cross
82+ 10.0.0 -- but the first re-run came back green with an ** empty** bundle:
83+ 4 KB, containing ` lib/conftest.py ` and nothing else.
84+
85+ The cause is in the bundle repo's ` build.sh ` and ` release.yml ` . Both build
86+ the ` --package_folder_prefix ` list with a gawk that wraps it in ** literal
87+ double quotes** . ` circuitpython-build-bundles ` splits that argument on
88+ ` ", " ` and matches each entry with ` str.startswith() ` , so the entries
89+ arrive as ` "sensirion_i2c_driver ` and ` sensirion_i2c_sen5x" ` and match no
90+ folder. Both libraries then fall back to legacy autodetection, which finds
91+ only the top-level ` conftest.py ` .
92+
93+ Measured against the pinned submodules with build-tools 1.20.1:
94+
95+ | ` --package_folder_prefix ` | detection | ` py ` bundle |
96+ | ---| ---| ---|
97+ | ` "sensirion_i2c_driver, sensirion_i2c_sen5x" ` (as CI passed it) | ` is_package=False ` , ` module_name=conftest ` , 1 file each | 4 KB |
98+ | ` sensirion_i2c_driver, sensirion_i2c_sen5x ` (quotes removed) | ` is_package=True ` , correct names, 20 + 33 files | 178.5 KB |
99+
100+ Because this bundle carries exactly two libraries, both entries in the
101+ list are the quoted ones, so every asset built since the tooling moved on
102+ would have been empty. Upstream ` adafruit/CircuitPython_Community_Bundle `
103+ has the identical ` build.sh ` , but with hundreds of libraries only the
104+ first and last of the ` ls -U ` ordering are lost, which is why it goes
105+ unnoticed there.
106+
107+ Fixed in
108+ [ good-enough-technology/CircuitPython_GoodEnough_Bundle #1 ] ( https://github.com/good-enough-technology/CircuitPython_GoodEnough_Bundle/pull/1 ) :
109+ drop the literal quotes, and quote the expansion in ` release.yml ` (which
110+ expands the value unquoted -- the literal quotes were accidentally doing
111+ that job). Verified by run
112+ [ 34541266869] ( https://github.com/good-enough-technology/CircuitPython_GoodEnough_Bundle/actions/runs/34541266869 ) ,
113+ which produces ` 10.x-mpy ` , ` 9.x-mpy ` and ` py ` bundles all containing both
114+ drivers.
115+
116+ ** Still outstanding:** circup reads GitHub * releases* , so the ` 10.x-mpy `
117+ only reaches this project once that PR is merged and a new release is
118+ published. Until then the SEN5x driver keeps installing as ` .py ` , which
119+ works -- all 22 files compile with this mpy-cross -- but costs flash and
120+ import time on the node. One known wart survives the fix: build-tools'
121+ ` is_package ` flag is sticky across files, so the drivers' ` tests/ ` and
122+ ` docs/ ` trees get swept into ` lib/ ` as well (52.5 KB against 32 KB in
123+ 2023). Harmless for circup, which installs per-module.
124+
74125## What this does not cover
75126
76127* No firmware was flashed and nothing ran on hardware. The runtime
@@ -95,8 +146,8 @@ BLE under `ports/zephyr-cp`. The whole prerequisite stack is still open:
95146 [ tyeth/zephyr #2 ] ( https://github.com/tyeth/zephyr/pull/2 )
96147* [ tyeth/hal_rpi_pico #1 ] ( https://github.com/tyeth/hal_rpi_pico/pull/1 ) and
97148 [ tyeth/hal_rpi_pico #2 ] ( https://github.com/tyeth/hal_rpi_pico/pull/2 ) --
98- ** no single hal_rpi_pico branch builds working firmware; both commits
99- must be cherry-picked onto one branch **
149+ neither PR branch alone builds working firmware; both commits have to sit
150+ on one branch, which is what ` integration-pico2w-ble ` now is
100151* [ tyeth/hal_infineon #1 ] ( https://github.com/tyeth/hal_infineon/pull/1 )
101152
102153Relevance to this repo: both examples target ESP32 Feathers and lean on
@@ -106,32 +157,43 @@ only for the BLE UART path (`collector/net_ble.py`, `node/net_ble.py`,
106157
107158### CI assets on tyeth/circuitpython
108159
109- Two separate Actions runs are involved. Only the first produced anything;
110- its artifacts expire 90 days after the run (2026-12-07).
111-
112- ** 1. mpy-cross -- run [ 34253440312] ( https://github.com/tyeth/circuitpython/actions/runs/34253440312 ) **
113- (the normal ` Build CI ` workflow on ` zephyr-pico2w-ble ` @ ` f4d3e598 ` ).
114- Provides only the ` mpy-cross ` artifacts: ` mpy-cross ` , ` mpy-cross.static ` ,
115- ` mpy-cross.static-aarch64 ` , ` mpy-cross.static-raspbian ` ,
116- ` mpy-cross.static.exe ` , ` mpy-cross-macos-arm64 ` . It does ** not** build
117- board firmware. The run's overall conclusion is ** failure** (its
118- ` tests / zephyr ` job fails), so these binaries come from an otherwise-red
119- run. This is what ` tools/build_bundle.sh ` downloads by default.
120-
121- ** 2. Pico 2 W firmware -- run [ 34258666665] ( https://github.com/tyeth/circuitpython/actions/runs/34258666665 ) **
122- (the ` Build board (custom) ` workflow, ` .github/workflows/build-board-custom.yml ` ,
123- dispatched for board ` raspberrypi_rpi_pico2_w_zephyr ` , language ` en_US ` ,
124- version ` latest ` , on branch ` ci/pico2w-ble-assets ` @ ` f9626482 ` ).
125-
126- ** Outcome: failure, no artifact.** (An earlier revision of this file
127- recorded the run as ` queued ` ; it was picked up at ~ 18:11Z and failed.)
128- The job died after 5m49s in the ` Set up port ` step (` west update ` ),
129- before the build step ran, so the expected artifact
130- ` raspberrypi_rpi_pico2_w_zephyr-en_US-latest ` (` firmware.uf2 ` +
131- ` firmware.elf ` ) was ** not produced** and there is still no CI-built
132- Pico 2 W firmware anywhere. The ` .uf2 ` still has to be built locally
133- with ` make BOARD=raspberrypi_rpi_pico2_w_zephyr ` in ` ports/zephyr-cp ` .
134- The error:
160+ All three artefacts now come from ` ci/pico2w-ble-assets ` , and all three
161+ runs are green. Artifacts expire 90 days after their run.
162+
163+ ** 1. mpy-cross -- run [ 34494018766] ( https://github.com/tyeth/circuitpython/actions/runs/34494018766 ) **
164+ (` Build board (custom) ` on ` ci/pico2w-ble-assets ` @ ` 7ba84d8 ` , dispatched
165+ for ` raspberrypi_rpi_pico_w_zephyr ` ). ** Success** ; the ` mpy-cross `
166+ artifact is 178 KB and expires 2026-12-09. This is what
167+ ` tools/build_bundle.sh ` downloads by default.
168+
169+ An earlier revision took mpy-cross from run
170+ [ 34253440312] ( https://github.com/tyeth/circuitpython/actions/runs/34253440312 )
171+ (` Build CI ` on ` zephyr-pico2w-ble ` @ ` f4d3e59 ` ), whose overall conclusion
172+ was ** failure** because its ` tests / zephyr ` job failed. That job is green
173+ again (tyeth/circuitpython #11 , closed -- fixed upstream), so the old caveat
174+ about "binaries from an otherwise-red run" no longer applies to it either.
175+ The newer run is preferred regardless: it is green, it expires two days
176+ later, and it is the same build that produces the Pico W firmware. Both
177+ compilers emit the same format -- ` MPY_VERSION 6 ` / ` MPY_SUB_VERSION 3 ` ,
178+ i.e. mpy v6.3, which is the ` 10.x-mpy ` bundle platform -- so switching the
179+ default changes no compiled output.
180+
181+ ** 2. Pico 2 W firmware -- run [ 34467425010] ( https://github.com/tyeth/circuitpython/actions/runs/34467425010 ) **
182+ (` Build board (custom) ` , board ` raspberrypi_rpi_pico2_w_zephyr ` , language
183+ ` en_US ` , version ` latest ` , on ` ci/pico2w-ble-assets ` @ ` 1d80163 ` ).
184+ ** Success** in 15m20s. Artifact
185+ ` raspberrypi_rpi_pico2_w_zephyr-en_US-latest ` , 9.13 MB (` firmware.uf2 ` --
186+ drag onto the BOOTSEL drive -- plus ` firmware.elf ` for SWD/gdb), expires
187+ 2026-12-09. There is now CI-built Pico 2 W firmware; building the ` .uf2 `
188+ locally with ` make BOARD=raspberrypi_rpi_pico2_w_zephyr ` is no longer the
189+ only route.
190+
191+ ** 3. Pico W firmware -- run 34494018766** (the same run as the mpy-cross
192+ above). Artifact ` raspberrypi_rpi_pico_w_zephyr-en_US-latest ` , 9.26 MB.
193+
194+ ** What changed since the failure recorded here earlier.** Run
195+ [ 34258666665] ( https://github.com/tyeth/circuitpython/actions/runs/34258666665 )
196+ died after 5m49s in ` Set up port ` (` west update ` ) with
135197
136198```
137199--- hal_rpi_pico: fetching, need revision integration-pico2w-ble
@@ -140,23 +202,14 @@ fatal: couldn't find remote ref integration-pico2w-ble
140202ERROR: update failed for project hal_rpi_pico
141203```
142204
143- The CI-only west manifest (below) points ` hal_rpi_pico ` at
144- ` tyeth/hal_rpi_pico @ integration-pico2w-ble ` , a branch that ** does not
145- exist** -- the fork only has the two PR head branches,
146- ` cyw43-shared-bus-ble ` (#1 ) and ` flash-ram-helpers-force-inline ` (#2 ).
147- This is the "both hal_rpi_pico commits must be cherry-picked onto one
148- branch" prerequisite surfacing in CI: the integration branch was assumed
149- but never pushed. The other two fork refs (` tyeth/zephyr ` and
150- ` tyeth/hal_infineon ` @ ` cyw43-shared-bus-ble ` ) fetched fine, and the two
151- workflow fixes on the branch were never reached, so they remain
152- unexercised. To get the asset: push a branch to ` tyeth/hal_rpi_pico `
153- carrying both PR commits under the name the manifest expects (or change
154- the manifest to a real branch name), then re-dispatch
155- ` Build board (custom) ` on ` ci/pico2w-ble-assets ` .
156-
157- Had it succeeded, the artifact would have been
158- ` raspberrypi_rpi_pico2_w_zephyr-en_US-latest ` , containing ` firmware.uf2 `
159- (drag onto the BOOTSEL drive) and ` firmware.elf ` (for SWD/gdb).
205+ because the CI-only west manifest points ` hal_rpi_pico ` at
206+ ` tyeth/hal_rpi_pico @ integration-pico2w-ble ` and that branch had never
207+ been pushed -- the "both hal_rpi_pico commits must be cherry-picked onto
208+ one branch" prerequisite surfacing in CI. ** That branch now exists** on
209+ ` tyeth/hal_rpi_pico ` , alongside the PR heads ` cyw43-shared-bus-ble ` (#1 )
210+ and ` flash-ram-helpers-force-inline ` (#2 ), and the builds above are the
211+ result. The workflow fixes carried on ` ci/pico2w-ble-assets ` , previously
212+ never reached, are now exercised.
160213
161214` ci/pico2w-ble-assets ` is a ** CI-only branch** : it is ` zephyr-pico2w-ble `
162215(the PR #4 branch) plus one commit that does three things --
0 commit comments