From afe6d113753773da627bf2e7029407cca17b8c4d Mon Sep 17 00:00:00 2001 From: Tommaso Bianchi Date: Sat, 25 Jul 2026 15:09:26 +0200 Subject: [PATCH] Make this fork's GUI link: OpenCV was reusing snaporca's JPEG-enabled build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First successful link of orca-slicer in this fork's history (158 MB, 738/738 objects, plus OrcaSlicer_profile_validator). 1633005bba got the test binary green; the GUI had still never linked. The blocker was in the deps image, not the code. That commit's message says OCCT V7_6_0, Boost 1.84.0 and OpenCV 4.6.0 "are pinned identically in both forks and were reused as-is". That is true of the VERSIONS and false of the FLAGS: this fork's deps/OpenCV/OpenCV.cmake passes -DWITH_JPEG=OFF, -DWITH_TIFF=OFF and -DBUILD_TIFF=OFF, and snaporca's does not. So the reused build shipped lib/opencv4/3rdparty/liblibjpeg-turbo.a, which collides with the deps' own lib/libjpeg.a — wx pulls that in via wxUSE_LIBJPEG=sys — on jpeg_stdio_dest. Under -flto that duplicate is fatal, not a warning. snaporca never sees it because its GUI does not link libopencv_world.a at all. Fixed by rebuilding OpenCV 4.6.0 in orcacad-deps with this fork's own flags (read out of the recipe rather than retyped), from the source already cached in the image, into a clean build dir so no stale cache entry survived, and deleting the orphaned bundled jpeg archive. The rebuilt libopencv_world.a has no jpeg or tiff symbol references and its CMake config no longer names either library. --allow-multiple-definition would have hidden this while leaving OpenCV carrying codecs mainline deliberately turns off. Lesson for the next dep: comparing deps recipes by version is not enough, diff the CMAKE_ARGS. Two more mounts, same root cause as the CMakeLists.txt mount this script already documents — the baked tree is snaporca's: - build_linux.sh, which builds `--target Snapmaker_Orca`; here the target is OrcaSlicer and its output name is orca-slicer, so configure passed and ninja then died on "unknown target". The binary check was looking for the wrong name too. - scripts/, because the packaging step needs scripts/appimage_lib_policy.sh; without it a fully successful link still exited non-zero with "missing AppImage helper" and the binary check never ran. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/docker-iter-build.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/scripts/docker-iter-build.sh b/scripts/docker-iter-build.sh index 481ed4a42e..af1665c9c3 100755 --- a/scripts/docker-iter-build.sh +++ b/scripts/docker-iter-build.sh @@ -13,7 +13,7 @@ # IMAGE=orcacad-deps scripts/docker-iter-build.sh # # On success the binary is inside the persistent volume at -# /OrcaSlicer/build/package/bin/snapmaker-orca (copy it out with a follow-up +# /OrcaSlicer/build/package/bin/orca-slicer (copy it out with a follow-up # `docker run --rm -v orcacad_buildcache:/b alpine cp ...` or via this script's tail). set -euo pipefail @@ -29,16 +29,28 @@ echo "REPO=$REPO IMAGE=$IMAGE BUILD_VOL=$BUILD_VOL" # they carry the build-time gates (e.g. SLIC3R_CAD -> add_definitions(-DSLIC3R_CAD)) that the # mounted headers are compiled against. With a stale baked copy the gate silently stays off and # the build fails with "class GLCanvas3D has no member named set_design_sketch_tool". +# +# build_linux.sh must be mounted for the same reason, and here the stale copy is guaranteed +# wrong rather than merely risky: orcacad-deps is layered on snaporca-deps, so the baked script +# is the OTHER fork's and builds `--target Snapmaker_Orca`. This fork's target is `OrcaSlicer`, +# so without this mount configure succeeds and then ninja dies on "unknown target". +# scripts/ likewise: build_linux.sh's packaging step sources scripts/appimage_lib_policy.sh, +# which the baked snaporca tree does not have, so a fully successful link still exited +# non-zero with "missing AppImage helper" and the binary check never ran. docker run --rm \ -v "$REPO/src":/OrcaSlicer/src \ -v "$REPO/resources":/OrcaSlicer/resources \ -v "$REPO/CMakeLists.txt":/OrcaSlicer/CMakeLists.txt \ -v "$REPO/cmake":/OrcaSlicer/cmake \ -v "$REPO/deps_src":/OrcaSlicer/deps_src \ + -v "$REPO/build_linux.sh":/OrcaSlicer/build_linux.sh \ + -v "$REPO/scripts":/OrcaSlicer/scripts \ -v "$BUILD_VOL":/OrcaSlicer/build \ "$IMAGE" \ bash -lc 'cd /OrcaSlicer && ./build_linux.sh -sr' +# src/CMakeLists.txt:151 renames the OrcaSlicer target's output to "orca-slicer" — not +# "snapmaker-orca", which is the other fork's binary name. echo "=== build finished; checking for binary ===" docker run --rm -v "$BUILD_VOL":/b "$IMAGE" \ - bash -lc 'ls -lh /b/package/bin/snapmaker-orca 2>/dev/null && file /b/package/bin/snapmaker-orca || echo "NO BINARY"' + bash -lc 'ls -lh /b/package/bin/orca-slicer 2>/dev/null && file /b/package/bin/orca-slicer || echo "NO BINARY"'