Skip to content

Commit 99ff246

Browse files
committed
skills: add gotcha 446; queue: comfy-angle round 4 built everything
Round 4 got through gclient sync, gn gen with the prefixed GCC toolchain and all 493 ninja targets, built the wheel and passed the smoke test on cp312/cp313/cp314 - then exited 127 on the last line of the script because the free-threaded interpreter directory is /opt/python/cp314-cp314t, not cp314t-cp314t.
1 parent e8c21e3 commit 99ff246

3 files changed

Lines changed: 54 additions & 7 deletions

File tree

‎.queue.yml‎

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2317,7 +2317,7 @@ packages:
23172317
a gclient sync plus a full ANGLE build does not fit. Validation was static - patch applies with
23182318
patch --dry-run --fuzz=0, py_compile of both patched scripts, a unit test of the new
23192319
stage_licenses() against a synthetic checkout (including non-UTF8 licence bytes), bash -n of the
2320-
container script and compile() of both heredocs, and pending_versions.py resolving 0.1.1. PR #2123 open; three CI rounds so far, every one inside gclient sync before anything compiled.
2320+
container script and compile() of both heredocs, and pending_versions.py resolving 0.1.1. PR #2123 open; four CI rounds so far - the first three never got out of gclient sync, the fourth built everything.
23212321
Round 1 (~2 min): vpython3 could not build its venv, since infra/python/wheels publishes no
23222322
linux-riscv64 crcmod/lxml (gotcha 423) - fixed by setting VPYTHON_BYPASS for riscv64 hosts in
23232323
build_linux.py. Round 2 (~4 min): the bypass worked and moved the wall one layer down - with
@@ -2352,12 +2352,26 @@ packages:
23522352
third_party/depot_tools at the same revision the driver clones, so gotcha 427''s gsutil
23532353
4.68/six split does not apply (both are 5.35, fine on 3.12), and the Linux hooks that follow
23542354
(clang, llvm_objdump, rust, lastchange, configure_siso) import nothing outside the stdlib and
2355-
depot_tools. Still not rehearsed end to end locally (no docker daemon, 4.5 GB free). Left to
2356-
watch: those hooks (all 23 use plain python3, so the vpython class of failure is behind us,
2357-
and update.py maps every Linux host to Linux_x64 so the x86-only prebuilts still download),
2358-
gn gen with the prefixed GCC toolchain, and whether the statically linked
2359-
Vulkan-Loader falls back to its C unknown-ext-chain path on riscv64 instead of wanting
2360-
per-arch assembly.'
2355+
depot_tools. Still not rehearsed end to end locally (no docker daemon, 4.5 GB free). Round 4
2356+
(~64 min) closed every open question at once: gclient sync completed, all 23 hooks ran, gn gen
2357+
with the prefixed GCC toolchain worked, and ninja built all 493 targets - including
2358+
third_party/vulkan-loader/src/libvulkan.a, so the statically linked Vulkan-Loader does take its
2359+
portable C unknown-ext-chain path on riscv64 and needs no per-arch assembly. Both of gotcha
2360+
438''s watch items are therefore closed. libEGL.so and libGLESv2.so linked, scripts/build.py
2361+
produced the 3.4 MB comfy_angle-0.1.1-py3-none-manylinux_2_39_riscv64.whl with all four
2362+
expected members, and the smoke test loaded both libraries and printed the real EGL client
2363+
extension string (EGL_ANGLE_platform_angle_vulkan among them) on cp312, cp313 and cp314; the
2364+
gpl_sources job passed in parallel. The job then failed on the very last line of the container
2365+
script with exit 127, purely because the smoke-test loop spelled the free-threaded interpreter
2366+
/opt/python/cp314t-cp314t while manylinux names that directory cp314-cp314t, so pip was not
2367+
there and set -e took the step down after the whole build had already succeeded (new gotcha
2368+
446; the only compile diagnostics in the log are warnings, none of them riscv64-specific).
2369+
Round 5 changes that one path and nothing else. The fix needed no CI to validate:
2370+
build-mujoco.yml drives the same manylinux_2_39_riscv64 image with /opt/python/cp314-cp314t and
2371+
docs/packages/mujoco.yaml lists published cp314-cp314t riscv64 wheels, while
2372+
build-onnxruntime.yml, build-labmaze.yml and build-vtk.yml all derive the directory as
2373+
${TAG%t}-${TAG}. Barring a free-threading-specific surprise from loading a py3-none ctypes
2374+
wrapper, round 5 should be green and publishable.'
23612375
- pkg: solders
23622376
version: 0.29.0
23632377
home: https://github.com/kevinheavey/solders

‎skills/python-project-porting/references/gotchas-index.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,10 @@ The porting gotchas (431 of them) live in [`references/gotchas/`](gotchas/), spl
488488
only through `TARGET=`, so pass `TARGET=RISCV64_GENERIC` (the rv64gc baseline) as the twin of
489489
the `TARGET=ARMV8` the project already has — and first ask whether gotcha 401's Rocky
490490
`openblas` package would do.
491+
- **446** — The image's free-threaded interpreter directory is `/opt/python/cp3XX-cp3XXt`
492+
(`<implementation tag>-<ABI tag>`), not `cp3XXt-cp3XXt`, so a hand-written per-interpreter
493+
loop that doubles the `t` exits 127 — derive it as `${TAG%t}-${TAG}`, and confirm any
494+
`/opt/python` path with a `grep` over the green workflows rather than a CI round.
491495

492496
### Native dependencies & linking — [`gotchas/native-deps-and-linking.md`](gotchas/native-deps-and-linking.md)
493497

‎skills/python-project-porting/references/gotchas/manylinux-image-and-toolchain.md‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ To pull up one entry: `grep -n '^N\. ' references/gotchas/manylinux-image-and-to
7171
- **428** — A project on the *deprecated* `find_package(PythonLibs REQUIRED)` has no
7272
`Development.Module` way out of gotcha 374's static-libpython wall — and satisfying it
7373
with manylinux's non-PIC `libpython3.XX.a` only moves the failure to the final link.
74+
- **446** — The image's free-threaded interpreter directory is `/opt/python/cp3XX-cp3XXt`, not
75+
`cp3XXt-cp3XXt`; a hand-written loop that doubles the `t` dies with exit 127, possibly on the
76+
last line of an hour-long build.
7477

7578
---
7679

@@ -1229,3 +1232,29 @@ To pull up one entry: `grep -n '^N\. ' references/gotchas/manylinux-image-and-to
12291232
whole transaction on one unmatched argument, so a speculative package name is a build
12301233
failure, not insurance. Install what the build needs and let the dependency solver
12311234
pull the runtimes.
1235+
1236+
446. **The manylinux image's free-threaded interpreter directory is
1237+
`/opt/python/cp3XX-cp3XXt`, not `/opt/python/cp3XXt-cp3XXt` — the directory is
1238+
`<implementation tag>-<ABI tag>`, and only the ABI tag carries the `t`.** A hand-written
1239+
per-interpreter loop that appends the free-threaded tag to itself (`cp314t-cp314t`) names
1240+
a path that does not exist, `"$pybin/bin/pip"` is "No such file or directory", and `set -e`
1241+
ends the step with **exit 127**. This is a one-line typo with an expensive failure mode:
1242+
in comfy-angle's round 4 (run 35496806279) it landed on the *last* line of the container
1243+
script, after a 64-minute ANGLE compile had already produced the wheel and the smoke test
1244+
had passed on cp312/cp313/cp314 — the log's final error says nothing about the build that
1245+
worked, so read *upwards* from an exit 127 before concluding the port regressed.
1246+
- **Derive the directory, don't write it out.** The rule is `${TAG%t}-${TAG}`, which
1247+
`build-onnxruntime.yml`, `build-labmaze.yml` and `build-vtk.yml` all encode as
1248+
`case "$PYTHON_TAG" in *t) python_dir="/opt/python/${PYTHON_TAG%t}-${PYTHON_TAG}/bin" ;;
1249+
*) python_dir="/opt/python/${PYTHON_TAG}-${PYTHON_TAG}/bin" ;; esac`. A literal list is
1250+
fine only if every free-threaded entry is spelled `cp3XX-cp3XXt` (as
1251+
`build-mujoco.yml`'s matrix and `build-cryptography.yml`'s do).
1252+
- **Verify a `/opt/python` path off-target instead of in CI.** No container is needed:
1253+
`grep -rn 'opt/python' .github/workflows/` shows how every green workflow on the same
1254+
`MANYLINUX_RISCV64_IMAGE` spells it, and `docs/packages/<pkg>.yaml` listing a published
1255+
`…-cp314-cp314t-manylinux_2_39_riscv64.whl` (mujoco has two) is proof that that exact
1256+
directory exists on that exact image. That pair of greps is seconds against an hour.
1257+
- **A `py3-none` wheel still wants the free-threaded leg in the smoke test.** The
1258+
interpreter list here is not a build matrix (gotcha 145): one platform wheel is loaded
1259+
on every interpreter we ship for, so a wrong path in the list fails a job that has
1260+
nothing else left to do.

0 commit comments

Comments
 (0)