From 11f4c427055fbad5f77ea1f49b3fe2369f643ed8 Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Sun, 20 Sep 2026 07:12:48 -0400 Subject: [PATCH] forgefirm-image: install python3-asyncio The release image carries only the standard-library module packages its own Python recipes declare, and none of them imports asyncio, so it was left out. An extension runs on the image's interpreter and brings no standard-library module of its own: the set it may import is the set installed. Its event-stream and socket clients are written on asyncio, so the image installs python3-asyncio on purpose, with the reason in the recipe. The other modules the trim leaves out (multiprocessing, xmlrpc, the debugger, venv, ensurepip) stay out until something asks for them. Proven: an image pair built from this recipe has /usr/lib/python3.12/asyncio/__init__.py in the release rootfs, read out of the ext4 image; on the bench reference, running the dev image of that pair, python3 -c "import asyncio" succeeds. Acceptance: the change is recipe body, so it is platform content and takes the full campaign. No catalog test can hold the module itself: forgetest runs on the dev image, which installs python3-asyncio with the rest of the standard library whatever this recipe says, so the release rootfs is the thing to read, as it was here. --- .../recipes-forgefirm/images/forgefirm-image.bb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb b/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb index 69f1965..6974fb7 100644 --- a/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb +++ b/meta-forgefirm/recipes-forgefirm/images/forgefirm-image.bb @@ -18,12 +18,19 @@ DESCRIPTION = "OpenGlow/ForgeFIRM image for Glowforge" # removal spec is expanded when applied, so the variable, not the removal, # is what a requiring recipe can override). python3 is the meta-package: # it installs every standard-library module (tkinter, idle, 2to3, pydoc, -# ensurepip, venv, the debugger, asyncio, multiprocessing, xmlrpc), which -# nothing here imports. Each Python recipe declares the module packages it +# ensurepip, venv, the debugger, multiprocessing, xmlrpc), which nothing +# here imports. Each Python recipe declares the module packages it # imports (python3-core plus the few it uses), so the meta-package goes. FORGEFIRM_RELEASE_TRIM ?= "nano" IMAGE_INSTALL:remove = "python3 ${FORGEFIRM_RELEASE_TRIM}" +# The Python an extension can count on. An extension runs on the image's +# interpreter and brings no standard-library module of its own, so the set +# it may import is the set installed here: what ForgeFIRM's own Python +# recipes pull in, plus python3-asyncio, which no ForgeFIRM program imports +# and which an extension's event-stream and socket clients are written on. +IMAGE_INSTALL:append = " python3-asyncio" + # grblhal-glowforge: the grblHAL motion controller (Grbl over TCP:23). # forgectrl: the ForgeFIRM machine-services daemon (HTTP :80, HTTPS :443 # with a self-signed certificate): controller supervisor, pulse-device