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

EAPI=8

inherit flag-o-matic ninja-utils toolchain-funcs

DESCRIPTION="Tool for polyhedral geometry and combinatorics"
SRC_URI="https://polymake.org/lib/exe/fetch.php/download/${P}-minimal.tar.bz2"
HOMEPAGE="https://polymake.org/"

# polymake itself is GPL-2, but even the minimal tarball bundles a lot
# of other code. I've included everything that turns up with a
#
#   find ./ -name 'LICENSE' -o -name 'COPYING'
#
# in the list below. If any of these bother you, you may want to take a
# closer look at how (or even if) the corresponding code is being used.
LICENSE="BSD GPL-2 GPL-2+ MIT WTFPL-2"
SLOT="0"
KEYWORDS="amd64 ~riscv ~amd64-linux"
IUSE="bliss +cdd +flint +normaliz libpolymake lrs nauty ppl singular"

REQUIRED_USE="^^ ( bliss nauty )"

# The "configure" script isn't autotools; it basically exists just to
# exec some other perl script but using the familiar name.
BDEPEND="dev-lang/perl
	${NINJA_DEPEND}"

DEPEND="
	libpolymake? ( dev-lang/perl )
	dev-libs/boost:=
	dev-libs/gmp:=
	dev-libs/libxml2:2=
	dev-libs/libxslt:=
	dev-libs/mpfr:=
	sys-libs/readline:=
	bliss? ( sci-libs/bliss:=[gmp] )
	cdd? ( sci-libs/cddlib:= )
	flint? ( sci-mathematics/flint:= )
	lrs? ( >=sci-libs/lrslib-051:=[gmp] )
	nauty? ( sci-mathematics/nauty:= )
	normaliz? ( >=sci-mathematics/normaliz-3.8:= )
	ppl? ( dev-libs/ppl:= )
	singular? ( sci-mathematics/singular:= )"

RDEPEND="${DEPEND}
	dev-lang/perl
	dev-perl/JSON
	dev-perl/Term-ReadLine-Gnu
	dev-perl/TermReadKey
	dev-perl/XML-SAX
	dev-perl/XML-Writer"

PATCHES=(
	"${FILESDIR}/${P}-singular-sat.patch"
	"${FILESDIR}/${P}-barycentric-subdiv.patch"
)

src_configure() {
	# Without this, the build system tries to use "the highest possible"
	# optimization level and will override what's in your CXXFLAGS.
	export CXXOPT=""

	tc-export CC CXX

	# We need to define BLISS_USE_GMP if bliss was built with gmp support.
	# Therefore we require gmp support on bliss, so that the package
	# manager can prevent rebuilds with changed gmp flag. Yes, this should
	# be append-cppflags; but the build system doesn't respect CPPFLAGS.
	use bliss && append-cxxflags -DBLISS_USE_GMP

	# This isn't an autotools ./configure script, so a lot of things
	# don't work the way you'd expect. We disable openmp unconditionally
	# because it's only supposedly only used for building the bundled
	# libnormaliz (we unbundle it) and for something called to_simplex
	# that I can't find anywhere in the polymake source.
	./configure --prefix="${EPREFIX}/usr" \
		--libdir="${EPREFIX}/usr/$(get_libdir)" \
		--libexecdir="${EPREFIX}/usr/$(get_libdir)/polymake" \
		$(usev !libpolymake "--without-callable") \
		--without-java \
		--without-javaview \
		--without-native \
		--without-scip \
		--without-soplex \
		--without-openmp \
		$(use_with bliss bliss "${EPREFIX}/usr") \
		$(use_with cdd cdd "${EPREFIX}/usr") \
		$(use_with flint flint "${EPREFIX}/usr") \
		$(use_with lrs lrs "${EPREFIX}/usr") \
		$(use_with nauty nauty "${EPREFIX}/usr") \
		$(use_with normaliz libnormaliz "${EPREFIX}/usr") \
		$(use_with ppl ppl "${EPREFIX}/usr") \
		$(use_with singular singular "${EPREFIX}/usr") \
		|| die
}

# There is a backwards-compatible Makefile that would call ninja for us
# in src_compile/src_install, but it doesn't handle MAKEOPTS correctly.
src_compile() {
	eninja -C build/Opt
}

src_install() {
	# DESTDIR needs to find its way into the real install script,
	# support/install.pl.
	export DESTDIR="${D}"
	eninja -C build/Opt install
}

src_test() {
	perl/polymake --script run_testcases --emacs-style \
		|| die "test suite failed"
}

pkg_postinst() {
	elog "Additional features for polymake are available through external"
	elog "software such as sci-mathematics/4ti2 and sci-mathematics/topcom."
	elog "After installing new external software run 'polymake --reconfigure'."
}