mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-22 08:22:58 +00:00
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
124 lines
6.2 KiB
Markdown
124 lines
6.2 KiB
Markdown
# 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/`.
|