PORTNAME=	graphviz
PORTVERSION=	12.2.1
PORTREVISION=	2
CATEGORIES=	graphics tk
MASTER_SITES=	https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/${PORTVERSION}/

MAINTAINER=	dinoex@FreeBSD.org
COMMENT=	Graph Visualization Software from AT&T and Bell Labs
WWW=		https://www.graphviz.org/

LICENSE=	EPL
LICENSE_FILE=	${WRKSRC}/COPYING

BUILD_DEPENDS=	tclsh${TCL_VER}:lang/tcl${_TCLTK_WANTED_VERSION}
LIB_DEPENDS=	libltdl.so:devel/libltdl \
		libpng.so:graphics/png \
		libwebp.so:graphics/webp \
		libfreetype.so:print/freetype2 \
		libfontconfig.so:x11-fonts/fontconfig \
		libexpat.so:textproc/expat2 \
		libharfbuzz.so:print/harfbuzz \
		libgd.so:${GD_PORT}

USES=		compiler:c++11-lang cpe pathfix shebangfix gmake bison \
		pkgconfig libtool:keepla autoreconf localbase:ldflags jpeg \
		tcl:build

GNU_CONFIGURE=	yes
GNU_CONFIGURE_MANPREFIX=	${PREFIX}/share
# sincos is broken on armv6, see ports/220591
CFLAGS_armv6=	-fno-builtin-sincos -fno-builtin-sin -fno-builtin-cos \
		-fno-builtin-sincosf -fno-builtin-sinf -fno-builtin-cosf \
		-fno-builtin-sincosl -fno-builtin-sinl -fno-builtin-cosl
CFLAGS_armv7=	-fno-builtin-sincos -fno-builtin-sin -fno-builtin-cos \
		-fno-builtin-sincosf -fno-builtin-sinf -fno-builtin-cosf \
		-fno-builtin-sincosl -fno-builtin-sinl -fno-builtin-cosl
MAKE_ENV=	EXPR_COMPAT=yes

CONFLICTS_INSTALL=	ghmm

INSTALL_TARGET=	install-strip
PLIST_SUB=	PORTVERSION="${PORTVERSION}"
SHEBANG_FILES=	cmd/dot/dot_sandbox

FIX_INCLUDE=	lib/cdt/dthdr.h lib/pathplan/tri.h \
		lib/pathplan/pathutil.h lib/pathplan/solvers.h \
		lib/pathplan/vis.h lib/pathplan/vispath.h \
		lib/common/globals.h lib/gvc/gvcint.h
FIX_TCL_SCRIPT=	tclpkg/gdtclft/demo/entities.tcl \
		tclpkg/tcldot/demo/gcat.tcl
FIX_TK_SCRIPT=	tclpkg/tcldot/demo/doted.tcl \
		tclpkg/tclpathplan/demo/pathplan.tcl

OPTIONS_DEFINE=	XPM DIGCOLA IPSEPCOLA ICONV NLS ANN GTS \
		PANGOCAIRO POPPLER GDK GHOSTSCRIPT DEVIL \
		SMYRNA GVEDIT \
		PERL PHP PYTHON RUBY LUA TCL TK GUILE GO \
		NVTHREADS DOCS EXAMPLES
OPTIONS_DEFAULT=XPM DIGCOLA IPSEPCOLA ICONV PANGOCAIRO NVTHREADS
NO_OPTIONS_SORT=yes
OPTIONS_SUB=	yes
DIGCOLA_DESC=	neato layout engine with DIGCOLA features
IPSEPCOLA_DESC=	neato layout engine with IPSEPCOLA features
ANN_DESC=	ANN edge bundling support
GTS_DESC=	GNU Triangulated Surface Library support
PANGOCAIRO_DESC=pangocairo support
POPPLER_DESC=	PDF and PS file support via poppler (requires PANGOCAIRO)
GDK_DESC=	gdk plugin support (requires PANGOCAIRO)
GHOSTSCRIPT_DESC=ghostscript plugin (requires PANGOCAIRO)
DEVIL_DESC=	devil plugin
SMYRNA_DESC=	SMYRNA graph viewer (GTK2)
GVEDIT_DESC=	GVEDIT graph viewer (QT6)
PERL_DESC=	Perl bindings (swig)
PHP_DESC=	PHP bindings (swig)
PYTHON_DESC=	Python bindings (swig)
RUBY_DESC=	Ruby bindings (swig)
LUA_DESC=	Lua bindings (swig)
TCL_DESC=	TCL bindings (swig)
GUILE_DESC=	Guile bindings (swig)
GO_DESC=	Go bindings (swig)
TK_DESC=	TK toolkit support
NVTHREADS_DESC=	Link with threads (needed for nvidia)

XPM_USES=	xorg
XPM_USE=	XORG=xaw,xpm,xmu,xt,sm,ice,xext,x11,xau,xdmcp
ICONV_USES=	iconv
NLS_USES=	gettext
PANGOCAIRO_USES=gnome xorg
PANGOCAIRO_USE=	GNOME=pango,cairo XORG=xrender,x11,xau,xdmcp
GDK_USES=	gnome xorg
GDK_USE=	GNOME=gtk30
SMYRNA_USES=	gnome gl xorg
SMYRNA_USE=	GNOME=libglade2,pangox-compat,gdkpixbuf,gtk20 \
		GL=glut,glu,gl
GVEDIT_USES=	qt:6
GVEDIT_USE=	QT=tools:build,base
PERL_USES=	perl5
PHP_USES=	php:build gnome ssl
PHP_USE=	GNOME=libxml2
PYTHON_USES=	python:build
RUBY_USES=	ruby
LUA_USES=	lua
TCL_USES=	python:build
TK_USES=	tk:build
GUILE_USES=	guile:3.0
GO_USES=	go:no_targets
DOCS_USES=	groff

ANN_LIB_DEPENDS=	libann.so:math/ann
GTS_LIB_DEPENDS=	libgts.so:graphics/gts
POPPLER_LIB_DEPENDS=	libpoppler-glib.so:graphics/poppler-glib
DEVIL_LIB_DEPENDS=	libIL.so:graphics/devil
SMYRNA_LIB_DEPENDS=	libgtkgl-2.0.so:x11-toolkits/gtkglarea2 \
			libgtkglext-x11-1.0.so:x11-toolkits/gtkglext \
			libgts.so:graphics/gts
PHP_LIB_DEPENDS=	libpcre2-8.so:devel/pcre2 \
			libargon2.so:security/libargon2

XPM_CONFIGURE_WITH=		x
XPM_CONFIGURE_ENV=		ac_cv_header_sys_inotify_h=no
DIGCOLA_CONFIGURE_WITH=		digcola
IPSEPCOLA_CONFIGURE_WITH=	ipsepcola
IPSEPCOLA_IMPLIES=		DIGCOLA
NLS_CONFIGURE_ENABLE=		nls
ANN_CONFIGURE_WITH=		ann
ANN_CONFIGURE_ENV=	ANN_CFLAGS=-I${LOCALBASE}/include ANN_LIBS=-lann
GTS_CONFIGURE_WITH=		gts
PANGOCAIRO_CONFIGURE_WITH=	pangocairo
POPPLER_CONFIGURE_WITH=		poppler
POPPLER_IMPLIES=		PANGOCAIRO
GTK3_CONFIGURE_WITH=		gtk
GDK_CONFIGURE_WITH=		gdk gdk-pixbuf 
GDK_IMPLIES=			PANGOCAIRO
GHOSTSCRIPT_CONFIGURE_OFF=	--with-ghostscript=no
GHOSTSCRIPT_IMPLIES=		PANGOCAIRO
DEVIL_CONFIGURE_WITH=		devil
GVEDIT_CONFIGURE_WITH=		qt
SMYRNA_CONFIGURE_OFF=		--with-glut=no
SMYRNA_CONFIGURE_WITH=		smyrna glade gtkgl gtkglext gtk
SMYRNA_IMPLIES=			GTS
PERL_CONFIGURE_ENABLE=		perl
PERL_VARS=		SHEBANG_FILES+=tclpkg/gv/demo/modgraph.pl
PHP_CONFIGURE_ENABLE=		php
PHP_CPPFLAGS=		-I${LOCALBASE}/include/php/Zend
PHP_VARS=		SHEBANG_FILES+=tclpkg/gv/demo/modgraph.php
PYTHON_CONFIGURE_ENABLE=	python3
PYTHON_LDFLAGS=		"-L${PYTHONBASE}/lib"
PYTHON_VARS=		SHEBANG_FILES+=tclpkg/gv/demo/modgraph.py
PYTHON_CONFIGURE_ENV=	PYTHON_INCLUDEDIR="${PYTHON_INCLUDEDIR}"
RUBY_CONFIGURE_ENABLE=		ruby
RUBY_CONFIGURE_ENV=	RUBY="${RUBY}" RUBY_VER="${RUBY_VER}" \
			RUBY_CFLAGS="${RUBY_CFLAGS}" \
			RUBY_LDFLAGS="${RUBY_LDFLAGS}" \
			RUBY_INSTALL_DIR="${RUBY_SITEARCHLIBDIR}"
RUBY_VARS=		SHEBANG_FILES+=tclpkg/gv/demo/modgraph.rb
LUA_CONFIGURE_ENABLE=		lua
LUA_CFLAGS=		-I${LUA_INCDIR}
LUA_LDFLAGS=		-L${LUA_LIBDIR} -lm
LUA_CONFIGURE_ENV=	LUA="${LUA_BINDIR}/lua" \
			LUA_INSTALL_DIR=${PREFIX}/lib/lua/${LUA_VER}
LUA_VARS=		SHEBANG_FILES+=tclpkg/gv/demo/modgraph.lua
TCL_CONFIGURE_ENABLE=		tcl
TCL_CPPFLAGS=		-I${TCL_INCLUDEDIR}
TCL_CONFIGURE_ENV=	TCLCONFIG="${TCL_LIBDIR}/tclConfig.sh"
TCL_VARS=		SHEBANG_FILES+=tclpkg/gv/demo/modgraph.tcl \
			SHEBANG_FILES+=tclpkg/gv/demo/modgraph.py \
			PLIST_SUB+=TCL_VER="${TCL_VER}"
TK_CPPFLAGS=		-I${TK_INCLUDEDIR}
TK_CONFIGURE_ON=	--with-wish=${WISH}
TK_CONFIGURE_ENV=	TKCONFIG="${TK_LIBDIR}/tkConfig.sh"
TK_IMPLIES=	TCL
GUILE_CONFIGURE_ENABLE=		guile
GO_CONFIGURE_ENABLE=		go
NVTHREADS_LDFLAGS=	-lpthread

.include <bsd.port.options.mk>

# allow the use localized gd ports in Makefile.local or slave ports.
GD_PORT?=	graphics/gd

CONFIGURE_ARGS+=	--program-transform-name="s/x/x/" \
		--enable-dependency-tracking \
		--enable-r=no \
		--with-demos="${EXAMPLESDIR}" \
		--with-freetype2=yes \
		--with-libgd \
		--with-webp \
		--with-fontconfigincludedir=${LOCALBASE}/include \
		--with-fontconfiglibdir=${LOCALBASE}/lib \
		--with-tclsh=${TCLSH} \
		--without-rsvg \
		--disable-io --disable-ocaml --disable-java \
		--disable-python2 \
		--disable-sharp

.if ${PORT_OPTIONS:MPYTHON} || ${PORT_OPTIONS:MTCL}
BINARY_ALIAS+=	python3=${PYTHON_CMD}
.else
USES+=	python:env
.endif

.if ${PORT_OPTIONS:MRUBY}
RUBY_CFLAGS+=	-I "${LOCALBASE}/include/ruby-${RUBY_VER}/" \
		-I "${LOCALBASE}/include/ruby-${RUBY_VER}/${RUBY_ARCH}"
.if exists(${LOCALBASE}/bin/ruby${RUBY_SHLIBVER})
RUBY_LIBS!=	${LOCALBASE}/bin/ruby${RUBY_SHLIBVER} \
		-r rbconfig -e "print RbConfig::CONFIG[ 'LIBS' ]"
RUBY_LDFLAGS+=	${RUBY_LIBS}
.endif
.endif

.if ${PORT_OPTIONS:MICONV}
CONFIGURE_ARGS+=	--with-iconvlibdir=${ICONV_PREFIX}/lib
CONFIGURE_ARGS+=	--with-iconvincludedir=${ICONV_PREFIX}/include
.else
CONFIGURE_ARGS+=	--without-libiconv-prefix
.endif

.if ${PORT_OPTIONS:MPERL} || ${PORT_OPTIONS:MPHP} || ${PORT_OPTIONS:MPYTHON} || \
    ${PORT_OPTIONS:MRUBY} || ${PORT_OPTIONS:MLUA} || ${PORT_OPTIONS:MTCL} || \
    ${PORT_OPTIONS:MGUILE} || ${PORT_OPTIONS:MGO}
BUILD_DEPENDS+=		swig:devel/swig
RUN_DEPENDS+=		swig:devel/swig
CONFIGURE_ARGS+=	--enable-swig
CONFIGURE_ENV+=		SWIG="${LOCALBASE}/bin/swig"
.else
CONFIGURE_ARGS+=	--disable-swig
CONFIGURE_ENV+=		SWIG="/nonexistent"
.endif

.if ${PORT_OPTIONS:MGHOSTSCRIPT}
USES_GHOSTSCRIPT_ARGS+=	lib
.endif

.if ${PORT_OPTIONS:MDOCS}
USES_GHOSTSCRIPT_ARGS+=	build
.endif

.if defined(USES_GHOSTSCRIPT_ARGS)
USES+=	ghostscript:${USES_GHOSTSCRIPT_ARGS:ts,}
.endif

.include <bsd.port.pre.mk>

post-patch:
	${REINPLACE_CMD} \
		-e 's|PHP_INSTALL_DATADIR=.*|PHP_INSTALL_DATADIR="${PREFIX}/share/php"|' \
		-e 's|LUA_INSTALL_DIR=.*|LUA_INSTALL_DIR="${LUA_MODLIBDIR}"|' \
		-e 's| vendorarchdir| sitearchdir|' \
		${WRKSRC}/configure.ac
	${REINPLACE_CMD} -e 's|#include "gui.h"|#include "gui/gui.h"|' \
		${WRKSRC}/cmd/smyrna/tvnodes.h
	cd ${WRKSRC} && ${REINPLACE_CMD} \
		-e 's|exec tclsh |exec tclsh${TCL_VER} |' ${FIX_TCL_SCRIPT}
	cd ${WRKSRC} && ${REINPLACE_CMD} \
		-e 's|exec wish |exec wish${TCL_VER} |' ${FIX_TK_SCRIPT}

pre-configure-DOCS-off:
	${REINPLACE_CMD} -e 's| doc | |' ${WRKSRC}/Makefile.am
	${FIND} ${WRKSRC} -name Makefile.am | \
		${XARGS} ${REINPLACE_CMD} \
		-e 's|^pdf_DATA|#pdf_DATA|';

pre-install-PHP-on:
	${MKDIR} "${STAGEDIR}/${PREFIX}/share/php"

post-install: install-ldconfig-file
	cd ${WRKSRC} && \
		${INSTALL_DATA} ${FIX_INCLUDE} ${STAGEDIR}${PREFIX}/include/graphviz/

.include <bsd.port.post.mk>
