# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit cmake cuda flag-o-matic

DESCRIPTION="Development platform for CAD/CAE, 3D surface/solid modeling and data exchange"
HOMEPAGE="https://www.opencascade.com
	https://github.com/Open-Cascade-SAS/OCCT"

MY_PN="OCCT"
MY_PV="${PV//./_}"
SRC_URI="https://github.com/Open-Cascade-SAS/${MY_PN}/archive/refs/tags/V${MY_PV}.tar.gz -> ${P}.tar.gz"
S="${WORKDIR}/${MY_PN}-${MY_PV}"

LICENSE="|| ( Open-CASCADE-LGPL-2.1-Exception-1.0 LGPL-2.1 )"
SLOT="0/$(ver_cut 1-2)"
KEYWORDS="~amd64 ~arm64"
IUSE="X debug freeimage gles2 jemalloc json opengl optimize tbb test tk truetype vtk"

# vtk libs are hardcoded in src/Draw/TKIVtkDraw/EXTERNLIB.cmake
REQUIRED_USE="
	?? (
		optimize
		tbb
	)
	vtk? (
		X
		opengl
	)
"

RESTRICT="!test? ( test )"

RDEPEND="
	dev-lang/tcl:=
	dev-libs/double-conversion
	tk? (
		dev-lang/tk:=
	)
	gles2? (
		media-libs/libglvnd
	)
	opengl? (
		media-libs/libglvnd[X]
	)
	X? (
		x11-libs/libX11
	)
	freeimage? (
		media-libs/freeimage
	)
	jemalloc? (
		dev-libs/jemalloc
	)
	tbb? (
		dev-cpp/tbb:=
	)
	truetype? (
		media-libs/fontconfig
		media-libs/freetype:2
	)
	vtk? (
		sci-libs/vtk:=[rendering,truetype?]
		tbb? (
			sci-libs/vtk[tbb]
		)
	)
"
DEPEND="
	${RDEPEND}
	X? (
		x11-base/xorg-proto
	)
	json? (
		dev-libs/rapidjson
	)
	test? (
		dev-cpp/gtest
	)
"

PATCHES=(
	"${FILESDIR}/${PN}-7.9.2-0001-fix-installation-of-cmake-config-files.patch"
	"${FILESDIR}/${P}-avoid-pre-stripping-binaries.patch"
	"${FILESDIR}/${PN}-7.9.0-0004-Only-try-to-find-the-jemalloc-libs-we-are-going-to-u.patch"
	"${FILESDIR}/${PN}-7.8.0-tests.patch"
	"${FILESDIR}/${P}-posix_memalign-noexcept.patch"
	"${FILESDIR}/${P}-no-tk.patch"
	# OrcaSlicer applies this to its bundled copy; cone faces with a tilted
	# seam pcurve are otherwise left untriangulated. OCCT#572
	"${FILESDIR}/${P}-brepmesh-seam-pcurve.patch"
)

src_prepare() {
	cmake_src_prepare

	# There is an OCCT_UPDATE_TARGET_FILE cmake macro that fails due to some
	# assumptions it makes about installation paths. Rather than fixing it, just
	# get rid of the mechanism altogether - its purpose is to allow a
	# side-by-side installation of release and debug libraries.
	sed -e 's|\\${OCCT_INSTALL_BIN_LETTER}||' \
		-i adm/cmake/occt_toolkit.cmake || die
}

src_configure() {
	# -Werror=odr
	# https://bugs.gentoo.org/862912
	# https://tracker.dev.opencascade.org/view.php?id=33091
	filter-lto

	local mycmakeargs=(
		-D3RDPARTY_DIR="${ESYSROOT}/usr"
		-DBUILD_SOVERSION_NUMBERS=2

		-DBUILD_DOC_Overview=no
		-DBUILD_ENABLE_FPE_SIGNAL_HANDLER="$(usex debug)"
		-DBUILD_USE_PCH=no
		-DBUILD_RELEASE_DISABLE_EXCEPTIONS=no # bug #847916

		-DBUILD_GTEST="$(usex test)"

		-DINSTALL_DIR="${EPREFIX}/usr"
		-DINSTALL_DIR_BIN="$(get_libdir)/${PN}/bin"
		-DINSTALL_DIR_CMAKE="$(get_libdir)/cmake/${PN}"
		-DINSTALL_DIR_DATA="share/${PN}/data"
		-DINSTALL_DIR_DOC="share/doc/${PF}"
		-DINSTALL_DIR_INCLUDE="include/${PN}"
		-DINSTALL_DIR_LIB="$(get_libdir)/${PN}"
		-DINSTALL_DIR_RESOURCE="share/${PN}/resources"
		-DINSTALL_DIR_SCRIPT="$(get_libdir)/${PN}/bin"
		-DINSTALL_DIR_TESTS="share/${PN}/tests"
		-DINSTALL_DIR_WITH_VERSION=no
		-DINSTALL_TEST_CASES=no

		-DUSE_DRACO=no
		-DUSE_EIGEN=no
		# ffmpeg: https://tracker.dev.opencascade.org/view.php?id=32871
		-DUSE_FFMPEG=no
		-DUSE_FREEIMAGE="$(usex freeimage)"
		-DUSE_FREETYPE="$(usex truetype)"
		-DUSE_GLES2="$(usex gles2)"
		-DUSE_OPENGL="$(usex opengl)"
		# no package in tree
		-DUSE_OPENVR=no
		-DUSE_RAPIDJSON="$(usex json)"
		-DUSE_TBB="$(usex tbb)"
		-DUSE_TK="$(usex tk)"
		-DUSE_VTK="$(usex vtk)"
		-DUSE_XLIB="$(usex X)"
	)

	# Select using memory manager tool.
	if ! use jemalloc && ! use tbb; then
		mycmakeargs+=( -DUSE_MMGR_TYPE=NATIVE )
	elif use jemalloc && ! use tbb; then
		mycmakeargs+=(
			-DUSE_MMGR_TYPE=JEMALLOC
			-D3RDPARTY_JEMALLOC_INCLUDE_DIR="${ESYSROOT}/usr/include/jemalloc"
		)
	elif ! use jemalloc && use tbb; then
		mycmakeargs+=( -DUSE_MMGR_TYPE=TBB )
	elif use jemalloc && use tbb; then
		mycmakeargs+=( -DUSE_MMGR_TYPE=FLEXIBLE )
	fi

	if use test; then
		# Build the GoogleTest suite against system gtest, never a fetched copy.
		mycmakeargs+=(
			-DGTEST_USE_FETCHCONTENT=OFF
			-DINSTALL_GTEST=OFF
		)
	fi

	if use tbb; then
		mycmakeargs+=(
			-D3RDPARTY_TBB_DIR="${ESYSROOT}/usr"
		)
	fi

	if use vtk; then
		local vtk_ver
		vtk_ver="$(best_version "sci-libs/vtk")"
		vtk_ver=$(ver_cut 1-2 "${vtk_ver#sci-libs/vtk-}")
		mycmakeargs+=(
			-D3RDPARTY_VTK_INCLUDE_DIR="${ESYSROOT}/usr/include/vtk-${vtk_ver}"
			-D3RDPARTY_VTK_LIBRARY_DIR="${ESYSROOT}/usr/$(get_libdir)"
		)

		# USE=vtk depends on sci-lib/vtk, which looks up a cuda compiler when build with USE=cuda.
		# We therefore need to set the correct CUDAHOSTCXX and setup the sandbox.
		if has_version "sci-libs/vtk[cuda]"; then
			cuda_add_sandbox
			addpredict "/dev/char"
			export CUDAHOSTCXX="$(cuda_gccdir)"
		fi
	fi

	cmake_src_configure

	sed -e "s|lib/|$(get_libdir)/|" \
		-e "s|VAR_CASROOT|${EPREFIX}/usr|" \
		< "${FILESDIR}/${PN}.env.in" > "${T}/99${PN}" || die

	# use TBB for memory allocation optimizations
	if use tbb; then
		sed -e 's|^#MMGT_OPT=0$|MMGT_OPT=2|' -i "${T}/99${PN}" || die
	fi

	# use internal optimized memory manager and don't clear memory with this
	# memory manager.
	if use optimize ; then
		sed -e 's|^#MMGT_OPT=0$|MMGT_OPT=1|' \
			-e 's|^#MMGT_CLEAR=1$|MMGT_CLEAR=0|' \
			-i "${T}/99${PN}" || die
	fi
}

src_install() {
	cmake_src_install

	doenvd "${T}/99${PN}"
}