Add surfer + cicwave waveform viewers; gate optional out of bulk groups#2
Merged
Merged
Conversation
Three related additions plus a resolver tightening. Shared files (packages.json, regenerated bash completion, CLAUDE.md, HANDOFF, ADDING_BINARIES) carry all three intermixed, so this is one atomic commit to keep every intermediate state valid. surfer 0.7.0 (gitlab.com/surfer-project/surfer) - Rust egui/glow (OpenGL) waveform viewer, built from the v0.7.0 tag on EL8 (native glibc-2.28; release profile has no -march=native). - Packaged gvim-style: bin/surfer.bz2 (wrapper with the wezterm Mesa/GLVND env block) + bin/surfer.bin.bz2 (stripped ELF, RPATH $ORIGIN/../lib64). - packages.json kind: bin, optional, depends [gui_libs, mesa3d_libs]. The ELF NEEDs only glibc + libgcc_s; winit/glow dlopen libGL/X11/wayland/xkbcommon. - build-surfer.sh: tag-enforced, --recurse-submodules (v0.7.0 vendors f128 + instruction-decoder as submodules), fresh CARGO_HOME (bypasses the loadout's offline crate-store), strip+patchelf+wrapper. farm-versions entry added. Resolver: all / @shared skip optional: true (loadout_main.py expand_groups) - The synthetic `all` sweep (and @shared, which builds on it) now exclude packages flagged optional. So surfer is name-only -- in no bulk group, installable via `./loadout install surfer`. - Intended side effect: the @rust trio (rust, rust-crate-store, env-cargo, all optional) likewise drops from @engineering-loadout / @shared; still reachable via @rust. Nothing depends on rust, so no fallout. The release smoke (test-prebuilt-binaries installs @shared) no longer drags rust. - Purged stale `default: true` / "default set" references from ADDING_BINARIES (cloc/scc/tokei + the new-binary template); the registry has 0 default flags and the resolver never read the field -- optional is the only gating field. cicwave 0.5.2 (github.com/wulffern/cicwave) -- loadout PyQt6 fork - PyQtGraph waveform viewer (ngspice/Xyce/VCD/CSV). Upstream imports PySide6, which has no wheel that is both EL8 (glibc 2.28) and Python 3.14: 6.9.x is manylinux_2_28 but python<3.14; 6.10+ added 3.14 and simultaneously raised the linux floor to manylinux_2_34 (glibc 2.34/RHEL9; QtCore.abi3.so floor GLIBC_2.34, verified) -- a one-way ratchet. PyQt6 satisfies both (PyQt6-Qt6 6.9.2 manylinux_2_28, libQt6Core floor GLIBC_2.28; binding abi3 cp39; sip cp314), so we carry a small fork. - 0001-port-pyside6-to-pyqt6.patch (wave_pg.py + pyproject, 56 +/- lines): PySide6->PyQt6 imports, pyqtSignal as Signal, 25 strict-enum scopings (Qt.AlignCenter -> Qt.AlignmentFlag.AlignCenter, ...), two dynamic getattr(QPalette.ColorRole, ...) / ShortcutContext fixes, and the pyproject PySide6 -> PyQt6 dependency (else the built wheel can't resolve offline). - build-cicwave.sh clones the stable tag, applies the patch, uv builds the wheel, downloads the PyQt6 + matplotlib closure as EL8/cp314 wheels, and splits the ~79 MB pyqt6_qt6 wheel into .whl.part-NNN (installer _prepare_wheels_dir rejoins it, like polars/pyarrow). numpy/pandas/click/ pyyaml/packaging/python_dateutil/six reused from the existing bundle. - packages.json kind: python-tool, uv_tool: cicwave, optional, depends [portable-python, uv]. Verified end-to-end on EL8: full `./loadout install cicwave --dest-dir` (portable Python + rejoin + offline uv tool install) then a headless QT_QPA_PLATFORM=offscreen render (window + 3 plotted waves + matplotlib PNG export, no enum errors). Not yet smoked on a real X/WSLg display -- interactive-only enum paths are statically scoped but unexercised headlessly. time-plot: rolling-git wheel rebuilt 2a1c077 -> 4e94f23 (./update time-plot). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three related additions plus a resolver tightening. Shared files (packages.json, regenerated bash completion, CLAUDE.md, HANDOFF, ADDING_BINARIES) carry all three intermixed, so this is one atomic commit to keep every intermediate state valid.
surfer 0.7.0 (gitlab.com/surfer-project/surfer)
-march=native).bin/surfer.bz2(wrapper with the wezterm Mesa/GLVND env block) +bin/surfer.bin.bz2(stripped ELF, RPATH$ORIGIN/../lib64).kind: bin,optional,depends: [gui_libs, mesa3d_libs]. The ELF NEEDs only glibc + libgcc_s; winit/glow dlopen libGL/X11/wayland/xkbcommon.build-surfer.sh: tag-enforced,--recurse-submodules(v0.7.0 vendors f128 + instruction-decoder as submodules), freshCARGO_HOME(bypasses the loadout's offline crate-store), strip+patchelf+wrapper. farm-versions entry added.Resolver:
all/@sharedskipoptional: trueallsweep (and@shared, which builds on it) now excludeoptionalpackages. So surfer is name-only — in no bulk group, installable via./loadout install surfer.@rusttrio (rust,rust-crate-store,env-cargo, all optional) likewise drops from@engineering-loadout/@shared; still reachable via@rust. Nothing depends onrust, so no fallout. The release smoke (test-prebuilt-binariesinstalls@shared) no longer drags rust.default: true/ "default set" references from ADDING_BINARIES (cloc/scc/tokei + the new-binary template); the registry has 0 default flags and the resolver never read the field —optionalis the only gating field.cicwave 0.5.2 (github.com/wulffern/cicwave) — loadout PyQt6 fork
manylinux_2_28butpython<3.14; 6.10+ added 3.14 and simultaneously raised the linux floor tomanylinux_2_34(glibc 2.34/RHEL9;QtCore.abi3.sofloorGLIBC_2.34, verified) — a one-way ratchet. PyQt6 satisfies both (PyQt6-Qt6 6.9.2manylinux_2_28,libQt6CorefloorGLIBC_2.28; binding abi3 cp39; sip cp314), so we carry a small fork.0001-port-pyside6-to-pyqt6.patch(wave_pg.py+pyproject, 56 ± lines): PySide6→PyQt6 imports,pyqtSignal as Signal, 25 strict-enum scopings (Qt.AlignCenter→Qt.AlignmentFlag.AlignCenter, …), two dynamicgetattr(QPalette.ColorRole, …)/ShortcutContextfixes, and the pyprojectPySide6→PyQt6dependency (else the built wheel can't resolve offline).build-cicwave.shclones the stable tag, applies the patch,uv builds the wheel, downloads the PyQt6 + matplotlib closure as EL8/cp314 wheels, and splits the ~79 MBpyqt6_qt6wheel into.whl.part-NNN(installer_prepare_wheels_dirrejoins it, like polars/pyarrow). numpy/pandas/click/pyyaml/packaging/python_dateutil/six reused from the existing bundle.kind: python-tool,uv_tool: cicwave,optional,depends: [portable-python, uv].time-plot
2a1c077→4e94f23(./update time-plot).Verification (on this EL8 box)
surfer 0.7.0 (git: v0.7.0);./loadout install surfer --no-deps --dest-dirthen installed wrapper ran--version; resolver assertions (surfer +@rustabsent fromall/@shared/@engineering-loadout, reachable by name / via@rust); doctor exit 0.0.5.2clone; offlineuv tool installreuses existing numpy/pandas; full./loadout install cicwave --dest-dir(portable Python + Qt-wheel rejoin + uv tool install) then a headlessQT_QPA_PLATFORM=offscreen CICSIM_USE_OPENGL=0render (window + 3 plotted waves + matplotlib PNG export, no enum errors). Not smoked on a real X/WSLg display — interactive-only enum paths (drag/drop, context menus, key modifiers) are statically scoped but unexercised headlessly.py_compile,json.tool packages.json,sh -n loadout,bash -n(build scripts, completion, bashrc),git diff --check.🤖 Generated with Claude Code