# Copyright 1999-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI=5
PYTHON_COMPAT=( python{2_6,2_7} )

inherit autotools eutils flag-o-matic java-pkg-opt-2 multilib python-single-r1

DESCRIPTION="Open Source Graph Visualization Software"
HOMEPAGE="http://www.graphviz.org/"
SRC_URI="http://www.graphviz.org/pub/graphviz/stable/SOURCES/${P}.tar.gz"

LICENSE="CPL-1.0"
SLOT="0"
KEYWORDS="amd64 x86"
IUSE="+cairo devil doc examples gdk-pixbuf gtk gts guile java lasi nls pdf perl postscript python qt4 ruby svg static-libs tcl X elibc_FreeBSD"

# Requires ksh
RESTRICT="test"

RDEPEND="
	sys-libs/zlib
	>=dev-libs/expat-2
	>=dev-libs/glib-2.11.1
	>=media-libs/fontconfig-2.3.95
	>=media-libs/freetype-2.1.10
	>=media-libs/gd-2.0.34[fontconfig,jpeg,png,truetype,zlib]
	>=media-libs/libpng-1.2:0
	!<=sci-chemistry/cluster-1.3.081231
	virtual/jpeg:0
	virtual/libiconv
	X? (
		x11-libs/libXaw
		x11-libs/libX11
		x11-libs/libXmu
		x11-libs/libXpm
		x11-libs/libXt
	)
	cairo?	(
		>=x11-libs/pango-1.12
		>=x11-libs/cairo-1.1.10[svg]
	)
	devil?	( media-libs/devil[png,jpeg] )
	postscript? ( app-text/ghostscript-gpl )
	gtk?	( x11-libs/gtk+:2 )
	gts?	( sci-libs/gts )
	lasi?	( media-libs/lasi )
	pdf?	( app-text/poppler )
	python?	( ${PYTHON_DEPS} )
	qt4?	(
		dev-qt/qtcore:4
		dev-qt/qtgui:4
	)
	ruby?	( dev-lang/ruby )
	svg?	( gnome-base/librsvg )
	tcl?	( >=dev-lang/tcl-8.3 )"
DEPEND="${RDEPEND}
	virtual/pkgconfig
	sys-devel/flex
	guile?	( dev-scheme/guile dev-lang/swig )
	java?	( >=virtual/jdk-1.5 dev-lang/swig )
	nls?	( >=sys-devel/gettext-0.14.5 )
	perl?	( dev-lang/swig )
	python?	( dev-lang/swig )
	ruby?	( dev-lang/swig )
	tcl?	( dev-lang/swig )"
REQUIRED_USE="
	!cairo? ( !X !gtk !postscript !lasi )
	python? ( ${PYTHON_REQUIRED_USE} )"

# Dependency description / Maintainer-Info:

# Rendering is done via the following plugins (/plugins):
# - core, dot_layout, neato_layout, gd , dot
#   the ones which are always compiled in, depend on zlib, gd
# - gtk
#   Directly depends on gtk-2.
#   needs 'pangocairo' enabled in graphviz configuration
#   gtk-2 depends on pango, cairo and libX11 directly.
# - gdk-pixbuf
#   Disabled, GTK-1 junk.
# - glitz
#   Disabled, no particular reason
#   needs 'pangocairo' enabled in graphviz configuration
# - ming
#   flash plugin via -Tswf requires media-libs/ming-0.4. Disabled as it's
#   incomplete.
# - cairo/pango:
#   Needs pango for text layout, uses cairo methods to draw stuff
# - xlib:
#   needs cairo+pango,
#   can make use of gnomeui and inotify support (??? unsure),
#   needs libXaw for UI
#   UI also links directly against libX11, libXmu, and libXt
#   and uses libXpm if available so we make sure it always is

# There can be swig-generated bindings for the following languages (/tclpkg/gv):
# - c-sharp (disabled)
# - scheme (enabled via guile) ... no longer broken on ~x86
# - io (disabled)
# - java (enabled via java) *2
# - lua (enabled via lua)
# - ocaml (enabled via ocaml)
# - perl (enabled via perl) *1
# - php (enabled via php) *2
# - python (enabled via python) *1
# - ruby (enabled via ruby) *1
# - tcl (enabled via tcl)
# *1 = The ${P}-bindings.patch takes care that those bindings are installed to the right location
# *2 = Those bindings don't build because the paths for the headers/libs aren't
#      detected correctly and/or the options passed to swig are wrong (-php instead of -php4/5)

# There are several other tools in /tclpkg:
# gdtclft, tcldot, tclhandle, tclpathplan, tclstubs ; enabled with: --with-tcl
# tkspline, tkstubs ; enabled with: --with-tk

# And the commands (/cmd):
# - dot, dotty, gvedit, gvpr, lefty, lneato, smyrna, tools/* :)
#   sci-libs/gts can be used for some of these
# - lefty:
#   needs Xaw and X to build
# - gvedit (via 'qt4'):
#   based on ./configure it needs qt-core and qt-gui only
# - smyrna : experimental opengl front-end (via 'smyrna')
#   currently disabled -- it segfaults a lot
#   needs x11-libs/gtkglext, gnome-base/libglade, media-libs/freeglut
#   sci-libs/gts, x11-libs/gtk.  Also needs 'gtk','glade','glut','gts' and 'png'
#   with flags enabled at configure time

pkg_setup() {
	use python && python-single-r1_pkg_setup

	java-pkg-opt-2_pkg_setup
}

src_prepare() {
	epatch \
		"${FILESDIR}"/${PN}-2.34.0-Xaw-configure.patch \
		"${FILESDIR}"/${PN}-2.34.0-dot-pangocairo-link.patch

	# ToDo: Do the same thing for examples and/or
	#       write a patch for a configuration-option
	#       and send it to upstream
	# note - the longer sed expression removes multi-line assignments that are extended via '\'
	if ! use doc ; then
		find . -iname Makefile.am \
			| xargs sed -i -e '/^\(html\|pdf\)_DATA.*\\[[:space:]]*$/{:m;N;s/\\\n//;tm;d}' \
				-e '/^\(html\|pdf\)_DATA/d' || die
	fi

	# This is an old version of libtool
	# use the ./configure option to exclude its use, and
	# delete the dir since we don't need to eautoreconf it
	rm -rf libltdl

	# no nls, no gettext, no iconv macro, so disable it
	use nls || { sed -i -e '/^AM_ICONV/d' configure.ac || die; }

	# Nuke the dead symlinks for the bindings
	sed -i -e '/$(pkgluadir)/d' tclpkg/gv/Makefile.am || die

	# replace the whitespace with tabs
	sed -i -e 's:  :\t:g' doc/info/Makefile.am || die

	# workaround for http://www.graphviz.org/mantisbt/view.php?id=1895
	use elibc_FreeBSD && append-flags $(test-flags -fno-builtin-sincos)

	use java && append-cppflags $(java-pkg_get-jni-cflags)

	eautoreconf
}

src_configure() {
	# libtool file collision, bug 276609
	local myconf="--without-included-ltdl --disable-ltdl-install"

	myconf="${myconf}
		$(use_with cairo pangocairo)
		$(use_with devil)
		$(use_with gtk)
		$(use_with gts)
		$(use_with qt4)
		$(use_with lasi)
		$(use_with svg rsvg)
		$(use_with X x)
		$(use_with X xaw)
		$(use_with X lefty)
		--with-digcola
		--with-fontconfig
		--with-freetype2
		--with-ipsepcola
		--with-libgd
		--with-sfdp
		$(use_enable gdk-pixbuf)
		--without-ming"

	# new/experimental features, to be tested, disable for now
	myconf="${myconf}
		--with-cgraph
		--without-glitz
		--without-ipsepcola
		--without-smyrna
		--without-visio"

	# Bindings:
	myconf="${myconf}
		$(use_enable guile)
		--disable-io
		$(use_enable java)
		--disable-lua
		--disable-ocaml
		$(use_enable perl)
		--disable-php
		$(use_enable python)
		--disable-r
		$(use_enable ruby)
		--disable-sharp
		$(use_enable tcl)"

	econf \
		--enable-ltdl \
		--disable-silent-rules \
		$(use_enable static-libs static) \
		${myconf}
}

src_install() {
	sed -i -e "s:htmldir:htmlinfodir:g" doc/info/Makefile || die

	emake DESTDIR="${D}" \
		txtdir="${EPREFIX}"/usr/share/doc/${PF} \
		htmldir="${EPREFIX}"/usr/share/doc/${PF}/html \
		htmlinfodir="${EPREFIX}"/usr/share/doc/${PF}/html/info \
		pdfdir="${EPREFIX}"/usr/share/doc/${PF}/pdf \
		pkgconfigdir="${EPREFIX}"/usr/$(get_libdir)/pkgconfig \
		install

	use examples || rm -rf "${ED}"/usr/share/graphviz/demo

	use static-libs || find "${ED}" -name '*.la' -exec rm -f {} +

	dodoc AUTHORS ChangeLog NEWS README

	use python && python_optimize \
		"${D}$(python_get_sitedir)" \
		"${D}/usr/$(get_libdir)/graphviz/python"
}

pkg_postinst() {
	# This actually works if --enable-ltdl is passed
	# to configure
	dot -c
}