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

# LocalAI 3D-generation backend (/3d/generations): Microsoft's TRELLIS
# image/text-to-3D ported to C++/GGML, built from localai-org's
# trellis2cpp at the exact commit this LocalAI release pins. The engine
# target has no explicit library type, so BUILD_SHARED_LIBS=ON (after
# the eclass's OFF default) produces libtrellis2.so plus the shared
# libggml*.so it links — installed kimodo-style under lib/.
# USE=cgal enables the CGAL Alpha Wrap print-remeshing feature against
# the system CGAL (upstream's alternative is a network-fetching dep
# script, TRELLIS2_FETCH_PRINT_REMESH_DEPS, kept OFF).

EAPI=8

LOCAL_AI_CMAKE_TARGET="trellis2"
LOCAL_AI_ENGINE_LIB="libtrellis2.so"
LOCAL_AI_EXTRA_CMAKE_ARGS=(
	-DBUILD_SHARED_LIBS=ON
	-DTRELLIS2_BUILD_EXAMPLES=OFF
	-DTRELLIS2_BUILD_TESTS=OFF
	-DTRELLIS2_FETCH_PRINT_REMESH_DEPS=OFF
	-DCMAKE_POSITION_INDEPENDENT_CODE=ON
)
# hipcc HIP-compiles the CGAL/boost remesh TU into a frexp ambiguity;
# upstream's own hipblas recipe exports ROCm clang for this engine.
LOCAL_AI_ROCM_CLANG=1

inherit local-ai-ggml-go

# The trellis2cpp commit LocalAI v4.11.0 builds against. Source of
# truth: backend/go/trellis2cpp/Makefile (TRELLIS2CPP_VERSION) at the
# upstream release tag; the ggml pin is that commit's gitlink
# (PABannier's fork — same commit as localai-backend/sam3-cpp, the
# distfile is shared).
TRELLIS2_COMMIT="2f3e6e26edbbaaf8ce93d092f16f46968a366a6a"
GGML_COMMIT="331b9cba52b23d895bc4ad218c007eb5e667540f"

DESCRIPTION="LocalAI 3D-generation backend (trellis2cpp gRPC server)"
SRC_URI="
	${LOCAL_AI_GO_SRC_URI}
	https://github.com/localai-org/trellis2cpp/archive/${TRELLIS2_COMMIT}.tar.gz -> trellis2cpp-${TRELLIS2_COMMIT}.tar.gz
	https://github.com/PABannier/ggml/archive/${GGML_COMMIT}.tar.gz -> pabannier-ggml-${GGML_COMMIT}.tar.gz
"
S="${WORKDIR}/LocalAI-${PV}/backend/go/trellis2cpp"
CMAKE_USE_DIR="${S}/sources/trellis2cpp"

KEYWORDS="~amd64"
IUSE="+cgal"

RDEPEND+="
	cgal? (
		sci-mathematics/cgal:=
		dev-libs/boost:=
	)
"
DEPEND+="
	cgal? (
		sci-mathematics/cgal:=
		dev-libs/boost:=
	)
"

src_unpack() {
	local-ai-backend_go_unpack

	local ggml=( "pabannier-ggml-${GGML_COMMIT}.tar.gz" "ggml-${GGML_COMMIT}" ggml )
	local-ai-backend_engine_unpack "trellis2cpp-${TRELLIS2_COMMIT}.tar.gz" trellis2cpp "${ggml[@]}"
}

src_configure() {
	# Gate the auto-detected CGAL feature on the flag instead of leaving
	# an automagic dependency.
	LOCAL_AI_EXTRA_CMAKE_ARGS+=( -DTRELLIS2_CGAL=$(usex cgal) )
	local-ai-ggml_src_configure
}

src_install() {
	# Shared-libs layout: libtrellis2.so plus the libggml*.so it links,
	# symlink chains preserved, all under lib/.
	local-ai-backend_gen_run_sh "${PN}" \
		"TRELLIS2_LIBRARY=lib/${LOCAL_AI_ENGINE_LIB}" "LD_LIBRARY_PATH=lib"
	local-ai-backend_install "${PN}" "${S}/${PN}"
	local libdir="${LOCAL_AI_BACKENDS_DIR#${EPREFIX}}/${PN}/lib"
	dodir "${libdir}"
	find "${BUILD_DIR}" \( -name 'libtrellis2.so*' -o -name 'libggml*.so*' \) \
		-exec cp -a {} "${ED}${libdir}/" \; || die
}