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

EAPI=8

inherit autotools flag-o-matic multibuild toolchain-funcs virtualx

DESCRIPTION="The Next Generation Spice (Electronic Circuit Simulator)"
HOMEPAGE="http://ngspice.sourceforge.net"
SRC_URI="
	https://downloads.sourceforge.net/ngspice/${P}.tar.gz
	doc? ( https://downloads.sourceforge.net/ngspice/${P}-manual.pdf )
"

LICENSE="BSD GPL-2 MPL-2.0"
SLOT="0"
IUSE="X debug deprecated doc examples fftw +klu openmp +readline +shared tcl"
KEYWORDS="~amd64 ~arm64 ~ppc ~riscv ~sparc ~x86 ~x64-macos"
RESTRICT="!test? ( test )"

DEPEND="
	sys-libs/ncurses:=
	X? (
		x11-libs/libXaw
		x11-libs/libXt
		x11-libs/libX11
	)
	fftw? ( sci-libs/fftw:3.0= )
	readline? ( sys-libs/readline:= )
	tcl? (
		dev-lang/tcl:=
		dev-tcltk/blt
	)
"
RDEPEND="${DEPEND}"

DOCS=(
	ANALYSES
	AUTHORS
	BUGS
	ChangeLog
	DEVICES
	FAQ
	NEWS
	README
	README.vdmos
	Stuarts_Poly_Notes
)

pkg_pretend() {
	[[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp
}

pkg_setup() {
	[[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp

	MULTIBUILD_VARIANTS=( "binaries" )
	use shared && MULTIBUILD_VARIANTS+=( "shared" )
	use tcl && MULTIBUILD_VARIANTS+=( "tcl" )
}

src_prepare() {
	default

	if use tcl; then
		if use examples; then
			find examples/tclspice -type f -iname \*tcl -or -iname \*.sh |
			while read s
			do
				sed -i -e 's@../../../src/.libs/libspice.so@libspice.so@g' \
					-e 's@package require BLT@package require Tk\npackage require BLT@g' \
					-e "s@spice::codemodel \(.*\)/\(.*\).cm@spice::codemodel /usr/$(get_libdir)/ngspice/\2.cm@g" \
					"${s}" || die "sed failed"
			done
		fi
	fi

	eautoreconf
	multibuild_copy_sources
}

src_configure() {
	# -Werror=lto-type-mismatch
	# https://bugs.gentoo.org/862513
	# https://sourceforge.net/p/ngspice/bugs/665/
	filter-lto

	multibuild_foreach_variant ngspice_configure
}

ngspice_configure() {
	local myeconfargs

	pushd "${BUILD_DIR}" &>/dev/null || die

	if use debug; then
		myeconfargs=(
			--enable-debug
			--enable-ftedebug
			--enable-cpdebug
			--enable-sensdebug
			--enable-asdebug
			--enable-stepdebug
			--enable-pzdebug
		)
	else
		myeconfargs=(
			--disable-debug
			--disable-ftedebug
			--disable-cpdebug
			--disable-sensdebug
			--disable-asdebug
			--disable-stepdebug
			--disable-pzdebug
		)
	fi

	# As of March 2021, these do not compile
	myeconfargs+=(
		--disable-blktmsdebug
		--disable-smltmsdebug
	)

	myeconfargs+=(
		--enable-xspice
		--enable-cider
		--disable-rpath
		$(use_enable klu)
		$(use_enable openmp)
		$(use_with fftw fftw3)
		$(use_with readline)
	)

	if [[ "${MULTIBUILD_VARIANT}" == "shared" ]]; then
		myeconfargs+=( --with-ngshared )
	elif [[ "${MULTIBUILD_VARIANT}" == "tcl" ]]; then
		myeconfargs+=( --with-tcl="${EPREFIX}/usr/$(get_libdir)" )
	else
		myeconfargs+=(
			$(use_enable deprecated oldapps)
			$(use_with X x)
		)
	fi

	econf "${myeconfargs[@]}"

	popd &>/dev/null || die
}

src_compile() {
	multibuild_foreach_variant ngspice_compile
}

ngspice_compile() {
	pushd "${BUILD_DIR}" &>/dev/null || die
	default
	popd &>/dev/null || die
}

src_test() {
	if ! use debug; then
		# tests can be only executed for the binaries variant
		pushd "${WORKDIR}/${P}-binaries" &>/dev/null || die
		echo "set ngbehavior=mc" > "${HOME}"/.spiceinit || die "Failed to configure ${PN} for running the test suite"
		virtx default
		popd &>/dev/null || die
	else
		# https://sourceforge.net/p/ngspice/bugs/353/
		ewarn
		ewarn "Skipping tests because they are known to fail in debug mode"
		ewarn
	fi
}

src_install() {
	multibuild_foreach_variant ngspice_install

	# merge the installations of all variants
	local v
	for v in "${MULTIBUILD_VARIANTS[@]}" ; do
		cp -a "${ED}/tmp/${v}"/* "${ED}" || die "Failed to combine multibuild installations"
	done
	rm -rf "${ED}/tmp" || die

	use tcl && DOCS+=( README.tcl )
	use shared && DOCS+=( README.shared-xspice )
	use doc && DOCS+=( "${DISTDIR}"/${P}-manual.pdf )

	default

	if use examples; then
		if ! use tcl; then
			rm -rf examples/tclspice || die
		fi

		insinto /usr/share/${PN}
		doins -r examples
	fi
}

ngspice_install() {
	pushd "${BUILD_DIR}" &>/dev/null || die

	emake DESTDIR="${ED}/tmp/${MULTIBUILD_VARIANT}" install

	# Strip shared-library and Tcl-module builds to the bare minimum;
	# all the support files will have been handled by the 'binaries' build.
	if [[ "${MULTIBUILD_VARIANT}" != "binaries" ]]; then
		rm -rf "${ED}/tmp/${MULTIBUILD_VARIANT}"/usr/bin{,.debug} || die
		rm -rf "${ED}/tmp/${MULTIBUILD_VARIANT}"/usr/share || die
		rm -rf "${ED}/tmp/${MULTIBUILD_VARIANT}"/usr/$(get_libdir)/*.la || die
		rm -rf "${ED}/tmp/${MULTIBUILD_VARIANT}"/usr/$(get_libdir)/ngspice/*.cm{,.debug} || die
	fi

	popd &>/dev/null || die
}