# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
WX_GTK_VER="3.3-gtk3"
MY_PN="OrcaSlicer"
# Vendored Eigen: 2.4.0 hard-requires Eigen 5, which shares main SLOT 3 with
# the system Eigen 3.4 and cannot coexist -- prestaged + privately installed
# in src_configure rather than depended on. See the eigen block there.
EIGEN5_PV="5.0.1"
inherit check-reqs cmake multiprocessing wxwidgets xdg
DESCRIPTION="Open-source 3D printer slicer (PrusaSlicer/Bambu Studio fork)"
HOMEPAGE="https://www.orcaslicer.com/
https://github.com/OrcaSlicer/OrcaSlicer"
SRC_URI="https://github.com/OrcaSlicer/OrcaSlicer/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz
https://gitlab.com/libeigen/eigen/-/archive/${EIGEN5_PV}/eigen-${EIGEN5_PV}.tar.bz2"
S="${WORKDIR}/${MY_PN}-${PV}"
# MPL-2.0 covers the vendored Eigen 5 compiled into the binary (src_configure).
LICENSE="AGPL-3 Apache-2.0 Boost-1.0 GPL-2 LGPL-2.1+ LGPL-3 MIT MPL-2.0"
SLOT="0"
# 2.4.0 needs two things ::gentoo doesn't provide for this consumer: Eigen 5
# (vendored in src_configure -- see the eigen block there) and wxWidgets >=3.3
# (src/CMakeLists.txt:34, no wxGTK 3.3 slot in ::gentoo -- provided by ::stuff's
# x11-libs/wxGTK-3.3.* slot + forked wxwidgets.eclass, selected via
# WX_GTK_VER=3.3-gtk3 above). verified 2026-06-20.
KEYWORDS="~amd64"
IUSE="test"
RESTRICT="!test? ( test )"
PATCHES=(
# Unchanged from 2.3.2 (apply cleanly to 2.4.1) -- reference the original
# files rather than per-version copies to avoid DuplicateFiles.
"${FILESDIR}/${PN}-2.3.2-boost-1.90.patch"
"${FILESDIR}/${PN}-2.3.2-boost-process-v1.patch"
"${FILESDIR}/${PN}-2.3.2-boost-asio-fs.patch"
# The five 2.4.0-introduced patches below apply unchanged to 2.4.1
# (verified 2026-06-29, zero fuzz/offset) -- referenced by their 2.4.0
# filenames literally to avoid per-version DuplicateFiles copies, same
# as the 2.3.2 set above.
# New in 2.4.0: reserve_loopback_port() still uses the removed
# boost::asio::io_service type; switch it to io_context (Boost 1.87+).
"${FILESDIR}/${PN}-2.4.0-boost-asio-io_context.patch"
"${FILESDIR}/${PN}-2.3.2-cgal-6.patch"
"${FILESDIR}/${PN}-2.3.2-occt-7.8-tkdestep.patch"
"${FILESDIR}/${PN}-2.3.2-opencv-no-world.patch"
# wx-set-values-ambig dropped for 2.4.0: upstream already ships
# set_values(std::vector<std::string>{...}) at PhysicalPrinterDialog.cpp.
# Silence wx assertions at runtime: upstream's bundled wx build
# sets wxBUILD_DEBUG_LEVEL=0 (deps/wxWidgets/wxWidgets.cmake) so
# bad sizer/widget calls never raise; system wxGTK ships with
# wxDEBUG_LEVEL=1 and the modal assert dialog wedges startup.
"${FILESDIR}/${PN}-2.3.2-wx-noop-assert-handler.patch"
# Rebased for 2.4.0 (upstream context shifted): force unconditional
# X11/webkit2gtk linking (was FLATPAK-only), and guard the
# g_object_set("audio-sink") with g_object_class_find_property.
"${FILESDIR}/${PN}-2.4.0-link-webkit2gtk.patch"
"${FILESDIR}/${PN}-2.4.0-mediactrl-audio-sink-guard.patch"
# Static-link the customized vendored Clipper2 (no system equivalent -- it
# ships a bespoke clipper2_z Z-coordinate variant), and build md4c against
# the system lib instead of the vendored copy. Both otherwise build shared
# but uninstalled, resolving to system libs after the install rpath strip.
"${FILESDIR}/${PN}-2.4.0-clipper2-static.patch"
"${FILESDIR}/${PN}-2.4.0-md4c-system.patch"
)
# orca-slicer links OpenSSL (OpenSSL::SSL/Crypto via find_package) and the
# system md4c (the vendored md4c is unbundled to the system lib by the
# md4c-system patch) -- both real build+runtime deps. The vendored clipper2 is
# static-linked instead (clipper2-static patch; it ships a customized clipper2_z
# variant the system lib lacks), so it is baked in and is NOT a dependency.
# libspnav is build-time only -- the 3D-mouse support links it statically
# (CMakeLists find_library libspnav.a) -- so it lives in DEPEND, not RDEPEND.
# verified 2026-06-20.
RDEPEND="
app-crypt/libsecret
dev-cpp/nlohmann_json:=
dev-cpp/tbb:=
dev-libs/boost:=[nls]
dev-libs/cereal
dev-libs/expat
dev-libs/glib:2
dev-libs/gmp:=
dev-libs/md4c
dev-libs/mpfr:=
dev-libs/openssl:=
media-gfx/openvdb:=
media-libs/draco
media-libs/fontconfig
media-libs/glfw
media-libs/gst-plugins-base:1.0
media-libs/gstreamer:1.0
media-libs/libjpeg-turbo:=
media-libs/libnoise
media-libs/libpng:0=
media-libs/nanosvg:=
media-libs/qhull:=
media-libs/opencv:=
net-libs/webkit-gtk:4.1
net-misc/curl[adns]
sci-libs/libigl
sci-libs/nlopt
sci-libs/opencascade:=
sci-mathematics/cgal:=
sys-apps/dbus
virtual/opengl
virtual/zlib:=
x11-libs/gtk+:3
x11-libs/wxGTK:${WX_GTK_VER}=[X,curl,gstreamer,keyring,opengl,webkit]
"
DEPEND="${RDEPEND}
media-libs/qhull[static-libs]
dev-libs/libspnav
"
BDEPEND="
sys-devel/gettext
virtual/pkgconfig
"
pkg_pretend() {
if [[ ${MERGE_TYPE} != binary ]]; then
# Several CGAL/Eigen-heavy translation units (CutSurface, MeshBoolean,
# Arrange, BuildVolume, ...) peak around 4-5 GiB of resident RAM each
# while cc1plus instantiates templates. Scale the requirement with
# MAKEOPTS jobs so the merge fails up front instead of getting OOM
# killed mid-link.
local jobs
jobs=$(makeopts_jobs)
local CHECKREQS_DISK_BUILD="12G"
local CHECKREQS_MEMORY="$((jobs * 4 + 2))G"
check-reqs_pkg_pretend
if (( jobs > 4 )); then
ewarn "MAKEOPTS=\"-j${jobs}\" will instantiate many heavy CGAL/Eigen"
ewarn "translation units in parallel. If cc1plus gets OOM-killed,"
ewarn "drop to -j4 via /etc/portage/env/${CATEGORY}/${PN}."
fi
fi
}
pkg_setup() {
if [[ ${MERGE_TYPE} != binary ]]; then
local jobs
jobs=$(makeopts_jobs)
local CHECKREQS_DISK_BUILD="12G"
local CHECKREQS_MEMORY="$((jobs * 4 + 2))G"
check-reqs_pkg_setup
fi
}
src_prepare() {
# 2.4.1's version.inc hardcodes a clean "2.4.1" with no "+UNKNOWN" build
# sentinel (2.4.0 carried one that we rewrote to "_Gentoo"). The only
# remaining "+UNKNOWN" lives in upstream's build_linux.sh, which we do not
# use -- so no version-string fixup is needed here. verified 2026-06-29
cmake_src_prepare
}
src_configure() {
CMAKE_BUILD_TYPE="Release"
setup-wxwidgets
# Vendored Eigen 5 (header-only). 2.4.0 hard-requires Eigen 5.0.1
# (find_package(Eigen3 5.0.1 REQUIRED) at CMakeLists.txt:1044), but
# ::gentoo's dev-cpp/eigen-5.0.1 is SLOT="3/5.0" -- the same main slot as
# the system Eigen 3.4 -- so it cannot be installed alongside without
# replacing it and force-rebuilding every eigen:3 consumer (cgal, libigl,
# opencv, ...). Instead configure+install a private Eigen 5 into the work
# dir and point find_package at it (the onnxruntime vendoring pattern),
# leaving the system eigen:3 untouched. Eigen is header-only, so the
# "install" is just headers + the generated Eigen3Config.cmake. orcaslicer
# and the header-only libigl/CGAL templates it pulls all instantiate against
# this private Eigen 5. verified 2026-06-20.
local eigen5_root="${WORKDIR}/eigen5-root"
cmake -S "${WORKDIR}/eigen-${EIGEN5_PV}" -B "${WORKDIR}/eigen5-build" \
-DCMAKE_INSTALL_PREFIX="${eigen5_root}/usr" \
-DEIGEN_BUILD_TESTING=OFF \
-DEIGEN_BUILD_DOC=OFF \
-DEIGEN_BUILD_BLAS=OFF \
-DEIGEN_BUILD_LAPACK=OFF \
-DEIGEN_BUILD_PKGCONFIG=OFF \
-DBUILD_TESTING=OFF \
-Wno-dev || die "private Eigen 5 configure failed"
cmake --install "${WORKDIR}/eigen5-build" || die "private Eigen 5 install failed"
local mycmakeargs=(
-DBUILD_TESTS=$(usex test)
-DORCA_TOOLS=ON
-DSLIC3R_FHS=ON
-DSLIC3R_GTK=3
-DSLIC3R_GUI=ON
-DSLIC3R_PCH=OFF
-DSLIC3R_STATIC=OFF
-DOPENVDB_FIND_MODULE_PATH="/usr/$(get_libdir)/cmake/OpenVDB"
# Resolve find_package(Eigen3 5.0.1) to the vendored copy above; it is
# searched ahead of the system prefix, so the system eigen-3.4 config
# (which fails the 5.0.1 version check anyway) is never selected.
-DCMAKE_PREFIX_PATH="${eigen5_root}/usr"
-DEigen3_ROOT="${eigen5_root}/usr"
-Wno-dev
)
cmake_src_configure
}
src_install() {
cmake_src_install
# Upstream's CMake installs LICENSE.txt at the install-prefix root
# (/usr/LICENSE.txt), which trips the FHS/Gentoo-policy QA check. Relocate
# it to the standard per-package docs directory.
if [[ -f ${ED}/usr/LICENSE.txt ]]; then
dodir /usr/share/doc/${PF}
mv "${ED}/usr/LICENSE.txt" "${ED}/usr/share/doc/${PF}/LICENSE.txt" || die
fi
}