# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

inherit eutils toolchain-funcs

NUSMV_PN="NuSMV"
NUSMV_PV="${PV}"
NUSMV_P="${NUSMV_PN}-${NUSMV_PV}"
NUSMV_A="${NUSMV_P}.tar.gz"
NUSMV_S="${WORKDIR}/${NUSMV_P}/nusmv"

MINISAT_PN="MiniSat"
MINISAT_PV="1.14"
MINISAT_P="${MINISAT_PN}_v${MINISAT_PV}"
MINISAT_A="${MINISAT_P}_src.zip"
MINISAT_S="${WORKDIR}/${NUSMV_P}/MiniSat/${MINISAT_P}"

CUDD_PN="cudd"
CUDD_PV="2.4.1.1"
CUDD_P="${CUDD_PN}-${CUDD_PV}"
#CUDD_A is none
CUDD_S="${WORKDIR}/${NUSMV_P}/${CUDD_P}"

DESCRIPTION="NuSMV: new symbolic model checker"
HOMEPAGE="http://nusmv.irst.itc.it/"
# The Homepage is _very_ slow, 2Kb/sec or worse.
# So we use our own mirror.
# Additionally, MiniSat is distributed with a slightly different filename
# So we mirror it ourselves
SRC_URI="mirror://gentoo/${NUSMV_A}
		http://nusmv.irst.itc.it/distrib/${NUSMV_A}
		minisat? ( mirror://gentoo/${MINISAT_A} )"
LICENSE="LGPL-2.1"
SLOT="0"
KEYWORDS="~x86 ~amd64"
IUSE="minisat examples"
RDEPEND="dev-libs/expat"
DEPEND="${RDEPEND}
		virtual/latex-base
		dev-texlive/texlive-latexextra
		app-text/ghostscript-gpl
		www-client/lynx
		dev-lang/perl"
# the above 4 are for docs, which aren't optional yet patches welcome to
# avoid building the docs but I suspect anybody using this package will
# actually need them
S="${NUSMV_S}"

src_unpack() {
	unpack ${NUSMV_A}
	if use minisat; then
		cd "${WORKDIR}"/${NUSMV_P}/MiniSat
		unpack ${MINISAT_A}
		epatch ${MINISAT_P}_nusmv.patch
		epatch "${FILESDIR}"/${MINISAT_P}-optimizedlib.patch
		epatch "${FILESDIR}"/${MINISAT_P}_gcc41.patch
	fi

	cd "${CUDD_S}"
	epatch "${FILESDIR}"/${CUDD_PN}-no-pentium4.patch
	if [[ "$(tc-arch)" = amd64 ]] ; then
		mv Makefile_64bit Makefile || die
	fi

	for i in ${NUSMV_S}/doc/{user-man,tutorial}/Makefile.in ; do
		sed -i.orig \
			'/install_sh_DATA/s!$(datadir)!$(DESTDIR)$(datadir)!g' \
			${i} || die "sed $i failed"
	done
}

src_compile() {
	rm -f ${NUSMV_S}/${MINISAT_P}
	if use minisat; then
		cd ${MINISAT_S}
		# do NOT merge these targets
		emake COPTIMIZE="${CFLAGS}" r || die "Failed to build minisat bin"
		emake COPTIMIZE="${CFLAGS}" lr || die "Failed to build minisat lib"
		ln -sf ${MINISAT_S} "${WORKDIR}"/${NUSMV_P}/${MINISAT_P}
	fi

	cd ${CUDD_S}
	emake clean || die "Failed to clean cudd out."
	emake \
		CPP="$(tc-getCPP)" CC="$(tc-getCC)" \
		RANLIB="$(tc-getRANLIB)" ICFLAGS="${CFLAGS}" \
		|| die "Failed to build cudd."

	local myconf="$(use_enable minisat) --enable-pslparser"
	if use minisat; then
		myconf="${myconf}
			--with-minisat-incdir=../${MINISAT_P}
			--with-minisat-libdir=../${MINISAT_P}"
	fi

	cd ${NUSMV_S}
	econf ${myconf}
	emake || die "emake failed"

	VARTEXFONTS="${T}"/fonts emake docs
}

src_install() {
	into /usr
	if use minisat; then
		newbin ${MINISAT_S}/minisat_release minisat
	fi

	dodir /usr/share/nusmv/doc
	cd ${NUSMV_S}
	emake DESTDIR="${D}" install || die "emake install failed"
	# duplicate items
	rm -f "${D}"/usr/share/nusmv/{LGPL-2.1,README*,NEWS}
	# real docs
	dodoc README* NEWS AUTHORS
	dodoc doc/tutorial/tutorial.pdf
	dodoc doc/user-man/nusmv.pdf

	# move package-installed docs
	mv "${D}"/usr/share/nusmv/doc/* "${D}"/usr/share/doc/${PF}/
	rmdir "${D}"/usr/share/nusmv/doc

	# clean out examples if not needed
	if use !examples ; then
		rm -rf "${D}"/usr/share/nusmv/examples || die "Failed to remove examples"
	fi
}

src_test() {
	cd ${NUSMV_S}
	emake check || die "emake check failed"
}
