Mirror of snaporca ac85277bac..0e7cb3ec78 (six changes, applied as a patch to DesignPanel.cpp rather than copied, so this fork's 30 permitted divergent lines survive — parity re-checked afterwards: the five shared files are byte-identical, DesignCanvas.cpp and DesignPanel.cpp differ by exactly 16 and 30 lines). - The straight slot's inline field says Radius, which is what it sets. It stores the half-width and passed the typed number through unchanged, so 30 produced a 60 mm slot. - The offer opens from the keyboard (Menu, Shift+F10), anchored on the viewport rather than wherever the pointer happens to be. The card hint names the new route. - The sketch card's Plane combo is gone; the plane comes from the viewport. Also stops build_candidate collapsing a face plane to a base plane while editing. - Mass properties and the dead Edit row are wired into the offer; DesignOffer.hpp is regenerated from tool_atlas.json, verified by re-running the generator and diffing. - docs/rig_build_traps.md + scripts/rig-build.sh, which derives its fork identity from project() so it cannot be pointed at the other fork's image or volume. - docs/design_tab.md refreshed (44 commits stale) + a PR description, with this fork's own merge-base and diff shape rather than snaporca's. Built green in the deps container with the new script and verified on the rig: Menu and Shift+F10 both open the offer at the viewport centre with the pointer parked off-canvas, and the sketch card shows no Plane row. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LyRwbuq6fjn3VV9U9UvhBM
6.2 KiB
Rig build traps
The build rig is two long-lived containers, snaporca-gui and orcacad-gui, one per fork. Each
mounts only its fork's build volume (snaporca_buildcache / orcacad_buildcache) at
/OrcaSlicer/build, its fork's resources/, and a shots directory — nothing else. They run the
binary; they do not build it. Rebuild with scripts/rig-build.sh.
| fork repo | project() | deps image | build volume | GUI container | binary |
|---|---|---|---|---|---|
snaporca |
Snapmaker_Orca |
snaporca-deps |
snaporca_buildcache |
snaporca-gui |
snapmaker-orca |
orca_cad |
OrcaSlicer |
orcacad-deps |
orcacad_buildcache |
orcacad-gui |
orca-slicer |
scripts/rig-build.sh exists alongside scripts/docker-iter-build.sh for one reason: it does a
target-only ninja into the volume the GUI rig launches from, so a session can test a single
change without a full repackage, whereas docker-iter-build.sh runs the full packaged build.
Both start a throwaway container from the deps image with the live repo mounted over the baked
tree — never build inside the GUI container (Trap 1).
Every trap below has already cost about a session to re-derive, once each. They are recorded now so no fresh session pays them again. Symptoms, causes, and exact recovery commands follow.
Trap 1 — never configure inside the GUI container
Symptom. After building inside the GUI container, the fork's targets no longer exist; ninja
reports an unknown target, and orca-slicer / OrcaSlicer have been replaced by
snapmaker-orca / Snapmaker_Orca.
Cause. The GUI image's baked /OrcaSlicer tree is the Jun-13 Snapmaker-derived source
(project(Snapmaker_Orca), executable snapmaker-orca). orcacad-deps is layered on
snaporca-deps, so even on the mainline fork the baked tree is the other fork's. A cmake .
there reconfigures the shared build dir under the wrong project name.
Fix. Build only via scripts/rig-build.sh, which starts a throwaway container from the deps
image with the live repo mounted over the baked tree — src, resources, cmake, deps_src,
localization, CMakeLists.txt, version.inc — and writes into the same volume the rig
launches from.
Trap 2 — stale NLopt_DIR in CMakeCache
Symptom. Configure fails with Cannot find NLopt library 'nlopt_cxx' in '<prefix>/lib'.
Cause. cmake/modules/FindNLopt.cmake:26 is set(NLopt_DIR $ENV{NLOPT}). With NLOPT
unset that expands to set(NLopt_DIR) — zero arguments — which unsets the normal variable and
lets a leftover CACHE entry of the same name (e.g. <prefix>/lib/cmake/nlopt) show through the
following if(NOT NLopt_DIR). The else() branch then searches for nlopt_cxx under
${NLopt_DIR}/lib with NO_DEFAULT_PATH, while the deps prefix ships plain nlopt.
Fix. From inside the build dir:
cmake -U NLopt_DIR -U NLopt_LIBS .
Do not sed the entry out of CMakeCache.txt — deleting a line breaks the cache parser.
Trap 3 — the image lacks deps_src/pybind11
Symptom. Configure aborts with pybind11 headers not found in /OrcaSlicer/deps_src/pybind11. Did you initialize submodules? (the FATAL_ERROR guarding PYBIND11_SOURCE_DIR in the mainline
fork's root CMakeLists.txt, near line 948).
Cause. The deps image predates that requirement. Only the mainline (orca_cad) fork has
deps_src/pybind11 and the requirement; snaporca has neither.
Fix. Mount deps_src over the baked tree — scripts/rig-build.sh does. Corollary: mounting a
snaporca tree into an orcacad-deps build reproduces this error exactly.
Trap 4 — OCCT_LIBS lags one configure
Symptom. A wall of undefined references to TopOpeBRepBuild symbols. It reads as a broken
OCCT installation. It is not.
Cause. src/libslic3r/CMakeLists.txt:603 does
set(OCCT_LIBS "${OCCT_LIBS}" CACHE INTERNAL "OCCT toolkits linked by libslic3r") at the END of
its own configure, while the consumer in the root CMakeLists.txt (if (NOT OCCT_LIBS) …
foreach (_tk IN LISTS OCCT_LIBS)) reads whatever is already in the cache. The first reconfigure
after the TKFillet TKOffset prepend (src/libslic3r/CMakeLists.txt:599) therefore links the
previous list and drops TKBool/TKOffset.
Fix. Configure twice. scripts/rig-build.sh runs cmake . twice for exactly this reason; if
you ever configure by hand, run it twice.
Trap 5 — SLIC3R_CAD=ON in the cache, macro never defined
Symptom. The build succeeds and links, but the Design tab is simply absent — or it fails with
class GLCanvas3D has no member named set_design_sketch_tool.
Cause. The cache carries SLIC3R_CAD=ON, but the root CMakeLists.txt actually configured is
a stale baked copy that predates the gate and never runs add_definitions(-DSLIC3R_CAD) (the
gate is if (SLIC3R_CAD) / add_definitions(-DSLIC3R_CAD) in the root list — line 179/180 in
snaporca, 319/320 in orca_cad). Every #ifdef SLIC3R_CAD block therefore compiles out while the
option still reads ON.
Fix. Always mount the live CMakeLists.txt and cmake/ — never inherit them from the image.
This is why scripts/docker-iter-build.sh, scripts/kernel-test.sh and scripts/rig-build.sh
all mount both.
The binary the rig actually launches
ninja <target> writes /OrcaSlicer/build/src/Release/<binary>; only build_linux.sh
additionally packages to /OrcaSlicer/build/package/bin/<binary>. orca_cad's
scripts/gui-session.sh defaults BIN to src/Release/orca-slicer, but snaporca's defaults to
package/bin/snapmaker-orca. So after a target-only rebuild on snaporca, launching
gui-session.sh with its default runs the stale packaged binary — the change under test is
invisible and the session hunts a phantom. Pass BIN explicitly:
docker exec -e BIN=/OrcaSlicer/build/src/Release/snapmaker-orca snaporca-gui /OrcaSlicer/scripts/gui-session.sh
scripts/rig-build.sh prints the correct line for the current fork when it finishes.
Note also that the GUI containers do not mount scripts/: /OrcaSlicer/scripts inside them
is the baked copy, so a local edit to gui-session.sh has no effect until you
docker cp scripts/gui-session.sh <container>:/OrcaSlicer/scripts/.