PORTNAME=	publisher
DISTVERSIONPREFIX=	v
DISTVERSION=	5.6.0
CATEGORIES=	print

MAINTAINER=	misterd@renderdata.pro
COMMENT=	Non-interactive layout engine and typesetting system ${${FLAVOR}_COMMENT}
WWW=		https://www.speedata.de/

LICENSE=	AGPLv3
LICENSE_FILE=	${WRKSRC}/COPYING

# Go does not support -buildmode=c-shared on freebsd/arm64 (only on
# freebsd/amd64). See internal/platform/supported.go in the Go source.
# When Go gains arm64 support, the application could also be refactored
# upstream to avoid c-shared entirely.
ONLY_FOR_ARCHS=		amd64
ONLY_FOR_ARCHS_REASON=	requires Go -buildmode=c-shared, not supported on this architecture

RUN_DEPENDS=	luahbtex:print/tex-luatex

# Flavors: default (community) and pro
FLAVORS=	default pro
FLAVOR?=	${FLAVORS:[1]}

pro_PKGNAMESUFFIX=	-pro
default_COMMENT=	(community)
pro_COMMENT=		(pro)

USES=		go:modules,no_targets lua:53,build,run
USE_GITHUB=	yes
GH_ACCOUNT=	speedata
GH_TUPLE=	\
		Masterminds:semver:v1.5.0:masterminds_semver/src/go/vendor/github.com/Masterminds/semver \
		PuerkitoBio:goquery:v1.9.1:puerkitobio_goquery/src/go/vendor/github.com/PuerkitoBio/goquery \
		alecthomas:chroma:v2.13.0:alecthomas_chroma_v2/src/go/vendor/github.com/alecthomas/chroma/v2 \
		andybalholm:cascadia:v1.3.2:andybalholm_cascadia/src/go/vendor/github.com/andybalholm/cascadia \
		dlclark:regexp2:v1.11.0:dlclark_regexp2/src/go/vendor/github.com/dlclark/regexp2 \
		fsnotify:fsnotify:v1.7.0:fsnotify_fsnotify/src/go/vendor/github.com/fsnotify/fsnotify \
		gammazero:deque:v0.2.1:gammazero_deque/src/go/vendor/github.com/gammazero/deque \
		gammazero:workerpool:v1.1.3:gammazero_workerpool/src/go/vendor/github.com/gammazero/workerpool \
		golang:image:v0.39.0:golang_image/src/go/vendor/golang.org/x/image \
		golang:net:v0.53.0:golang_net/src/go/vendor/golang.org/x/net \
		golang:sys:v0.43.0:golang_sys/src/go/vendor/golang.org/x/sys \
		golang:text:v0.36.0:golang_text/src/go/vendor/golang.org/x/text \
		google:btree:v1.1.2:google_btree/src/go/vendor/github.com/google/btree \
		gorilla:mux:v1.8.1:gorilla_mux/src/go/vendor/github.com/gorilla/mux \
		gregjones:httpcache:901d90724c79:gregjones_httpcache/src/go/vendor/github.com/gregjones/httpcache \
		inconshreveable:mousetrap:v1.1.0:inconshreveable_mousetrap/src/go/vendor/github.com/inconshreveable/mousetrap \
		peterbourgon:diskv:v2.0.1:peterbourgon_diskv/src/go/vendor/github.com/peterbourgon/diskv \
		speedata:bild:dd063a632b14:speedata_bild/src/go/vendor/github.com/speedata/bild \
		speedata:config:3a3f44982ec4:speedata_config/src/go/vendor/github.com/speedata/config \
		speedata:css:68d469dc62c4:speedata_css_scanner/src/go/vendor/github.com/speedata/css \
		speedata:go-lua:v0.1.8:speedata_go_lua/src/go/vendor/github.com/speedata/go-lua \
		speedata:goxlsx:v1.0.2:speedata_goxlsx/src/go/vendor/github.com/speedata/goxlsx \
		speedata:hotfolder:5f743a840a92:speedata_hotfolder/src/go/vendor/github.com/speedata/hotfolder \
		speedata:optionparser:v1.2.1:speedata_optionparser/src/go/vendor/github.com/speedata/optionparser \
		yuin:goldmark-highlighting:37449abec8cc:yuin_goldmark_highlighting_v2/src/go/vendor/github.com/yuin/goldmark-highlighting/v2 \
		yuin:goldmark:v1.7.1:yuin_goldmark/src/go/vendor/github.com/yuin/goldmark

USE_LDCONFIG=	${SP_LIBDIR}

# JAR location for JAVA_TOOLS option (matches what textproc/saxon-he etc. install).
# Not using USES=java so we set this ourselves.
JAVAJARDIR=	${LOCALBASE}/share/java/classes

# Paths compiled into sp binary at build time (final install paths, no STAGEDIR)
SP_LIBDIR=	${PREFIX}/lib/speedata-publisher
SP_SHAREDIR=	${PREFIX}/share/speedata-publisher
SP_SWDIR=	${SP_SHAREDIR}/sw

# pro flavor: pass -X main.pro=yes at link time
.if ${FLAVOR} == pro
SP_LDFLAGS_PRO=	-X main.pro=yes
.else
SP_LDFLAGS_PRO=
.endif

# ldflags for sp binary: compile install paths and version into the binary.
# Set before bsd.port.mk includes go.mk so go.mk's default -ldflags=-s is skipped.
GO_BUILDFLAGS+=	-ldflags="-X main.dest=custom \
		-X main.version=${DISTVERSION} \
		-X main.libdir=${SP_LIBDIR} \
		-X main.srcdir=${SP_SWDIR} \
		${SP_LDFLAGS_PRO} \
		${STRIP}"

# Append Lua include path to CGO_CFLAGS so GO_ENV picks it up
# (don't override CGO_CFLAGS inline; GO_ENV already sets it).
CGO_CFLAGS+=	-I${LUA_INCDIR}

CONFLICTS_INSTALL=	publisher-devel

EXTRACT_AFTER_ARGS=	--exclude lib \
			--no-same-owner --no-same-permissions

# Optional Java helper tools (Saxon for XSLT, Jing for RNG validation,
# Trang for schema conversion). Default ON; turn OFF to manage JARs
# manually (see pkg-help).
OPTIONS_DEFINE=		JAVA_TOOLS
OPTIONS_DEFAULT=	JAVA_TOOLS
OPTIONS_SUB=		yes
JAVA_TOOLS_DESC=	XSLT/RNG support via Saxon, Jing, Trang
JAVA_TOOLS_RUN_DEPENDS=	saxon-he>0:textproc/saxon-he \
			jing>0:textproc/jing \
			trang>0:textproc/trang

# Pre-generated vendor/modules.txt (see files/modules.txt).
# Required because Go 1.21+ needs modules.txt in vendor/, and GH_TUPLE
# extraction does not produce it. Generated on host with: go mod vendor
post-extract:
	${CP} ${FILESDIR}/modules.txt ${WRKSRC}/src/go/vendor/modules.txt

do-build:
	# libsplib.so -- Go shared library (c-shared mode, CGO uses Lua headers via CGO_CFLAGS)
	# Does not use GO_BUILDFLAGS because that contains sp-specific ldflags.
	(cd ${WRKSRC}/src/go; \
	    ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${GO_ENV} \
	    GOMAXPROCS=${MAKE_JOBS_NUMBER} GOPROXY=off \
	    ${GO_CMD} build \
	    -buildmode=c-shared \
	    -mod=vendor \
	    -v -trimpath \
	    -buildvcs=false \
	    -ldflags=${STRIP} \
	    -o ${WRKDIR}/libsplib.so \
	    speedatapublisher/splib)

	# luaglue.so -- C glue library
	(cd ${WRKSRC}/src/c; \
	    ${CC} ${CFLAGS} ${CPPFLAGS} -I${LUA_INCDIR} ${LDFLAGS} \
	    -fPIC -shared \
	    -Wl,-soname,luaglue.so \
	    -o ${WRKDIR}/luaglue.so \
	    luaglue.c)

	# sp binary -- dest=custom compiles paths in at link time (via GO_BUILDFLAGS)
	(cd ${WRKSRC}/src/go; \
	    ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${GO_ENV} \
	    GOMAXPROCS=${MAKE_JOBS_NUMBER} GOPROXY=off \
	    ${GO_CMD} build ${GO_BUILDFLAGS} \
	    -o ${WRKDIR}/sp \
	    speedatapublisher/sp/sp)

do-install:
	# sp binary. 5.6.0+ has fallback logic in getExecutablePath() via the
	# backported patch: sp searches for sdluatex first, then luahbtex.
	# FreeBSD only ships luahbtex, so no symlink is needed.
	${INSTALL_PROGRAM} ${WRKDIR}/sp ${STAGEDIR}${PREFIX}/bin

	# Shared libraries -> ${PREFIX}/lib/speedata-publisher/
	${MKDIR} ${STAGEDIR}${SP_LIBDIR}
	${INSTALL_LIB} ${WRKDIR}/libsplib.so ${WRKDIR}/luaglue.so \
		${STAGEDIR}${SP_LIBDIR}

	# Schema files
	${MKDIR} ${STAGEDIR}${SP_SHAREDIR}/schema
	${INSTALL_DATA} \
		${WRKSRC}/schema/catalog-schema-*.xml \
		${WRKSRC}/schema/layoutschema-*.* \
		${STAGEDIR}${SP_SHAREDIR}/schema

	# Runtime resource files (sw/)
	(cd ${WRKSRC}/src && \
		${COPYTREE_SHARE} "colorprofiles hyphenation lua metapost tex" \
		${STAGEDIR}${SP_SWDIR})
	(cd ${WRKSRC} && ${COPYTREE_SHARE} "fonts img" ${STAGEDIR}${SP_SWDIR})

# JAVA_TOOLS option: install a sample config that points sp at the FreeBSD
# JAR location. Requires Publisher 5.5.24+. No symlinks, no version pin.
post-install-JAVA_TOOLS-on:
	${MKDIR} ${STAGEDIR}${PREFIX}/etc/speedata
	${ECHO_CMD} "jardir = ${JAVAJARDIR}" > \
	    ${STAGEDIR}${PREFIX}/etc/speedata/publisher.cfg.sample

.include <bsd.port.mk>
