PORTNAME=	hyprland
DISTVERSIONPREFIX=	v
DISTVERSION=	0.46.2
PORTREVISION=	3
CATEGORIES=	x11-wm wayland

MAINTAINER=	jbeich@FreeBSD.org
COMMENT=	Dynamic tiling Wayland compositor that doesn't sacrifice on its looks #'
WWW=		https://hyprland.org/

LICENSE=	BSD3CLAUSE
LICENSE_FILE=	${WRKSRC}/LICENSE

BUILD_DEPENDS=	evdev-proto>0:devel/evdev-proto \
		hyprwayland-scanner>=0.3.10:devel/hyprwayland-scanner \
		wayland-protocols>=1.35:graphics/wayland-protocols
LIB_DEPENDS=	libhyprlang.so:devel/hyprlang \
		libhyprutils.so:devel/hyprutils \
		libre2.so:devel/re2 \
		libtomlplusplus.so:devel/tomlplusplus \
		libhyprgraphics.so:graphics/hyprgraphics \
		libdrm.so:graphics/libdrm \
		libwayland-server.so:graphics/wayland \
		libuuid.so:misc/e2fsprogs-libuuid \
		libaquamarine.so:x11-toolkits/aquamarine \
		libhyprcursor.so:x11/hyprcursor \
		libinput.so:x11/libinput \
		libxkbcommon.so:x11/libxkbcommon

USES=		cmake compiler:c++11-lib gl gnome pkgconfig xorg
USE_GITHUB=	yes
USE_GL=		egl gbm opengl
USE_GNOME=	cairo pango
USE_XORG=	pixman xcursor
GH_ACCOUNT=	hyprwm
GH_PROJECT=	Hyprland
GH_TUPLE=	hyprwm:hyprland-protocols:v0.4.0:hyprland_protocols/subprojects/hyprland-protocols \
		canihavesomecoffee:udis86:1.7.2-186-g5336633:udis86/subprojects/udis86
CMAKE_OFF=	CMAKE_CXX_SCAN_FOR_MODULES # avoid devel/llvm*
CMAKE_ON=	NO_SYSTEMD
LDFLAGS+=	-Wl,--as-needed # GL, pango deps

# Generated by "make update-hash" for commit_pins in hyprpm.toml
GH_HASH=	0bd541f2fd902dbfa04c3ea2ccf679395e316887

# XXX Drop after FreeBSD 13.4 EOL around 2026-01-31
# https://cgit.freebsd.org/src/commit/?id=af93fea71038
.if !exists(/usr/include/sys/timerfd.h)
LIB_DEPENDS+=	libepoll-shim.so:devel/libepoll-shim
.endif

OPTIONS_DEFINE=	X11
OPTIONS_DEFAULT=X11

X11_USE=		XORG=xcb
X11_LIB_DEPENDS=	libxcb-errors.so:x11/xcb-util-errors \
			libxcb-icccm.so:x11/xcb-util-wm
X11_CMAKE_BOOL_OFF=	NO_XWAYLAND

post-patch:
# Extract (snapshot) version from the port instead of CMakeLists.txt
	@${REINPLACE_CMD} -i .nogit \
		-e '/^HASH/s/=.*/=${GH_HASH}/' \
		-e '/^BRANCH/s/=.*/=main/' \
		-e '/^MESSAGE/s/=.*/="?"/' \
		-e "/^DATE/s/=.*/=\"$$(date -ur $$(${AWK} \
			'/TIMESTAMP/ { print $$3 }' ${DISTINFO_FILE}))\"/" \
		-e '/^DIRTY/s/=.*/=portbld/' \
		-e '/^TAG/s/=.*/=${DISTVERSIONFULL}/' \
		-e '/^COMMITS/s/=.*/="?"/' \
		${WRKSRC}/scripts/generateVersion.sh
# Respect consolekit2 as XDG_RUNTIME_DIR fallback
	@${REINPLACE_CMD} 's,/run/user,/var&,' \
		${WRKSRC}/hyprctl/main.cpp \
		${WRKSRC}/src/Compositor.cpp
# Respect PREFIX for wallpapers
	@${REINPLACE_CMD} 's,/usr/share,${DATADIR:H},' \
		${WRKSRC}/src/render/OpenGL.cpp
# XXX Replace linprocfs(4) with sysctl(3)
	@${REINPLACE_CMD} -e 's,/proc,${LINUXBASE}&,g' \
		${WRKSRC}/src/desktop/Window.cpp \
		${WRKSRC}/src/plugins/HookSystem.cpp

post-install:
# Plugin API installs all headers (no private vs. public)
	@(cd ${STAGEDIR}${PREFIX} && ${FIND} include/${PORTNAME} ! -type d) >>${TMPPLIST}

update-hash:
# https://docs.github.com/en/rest/commits/commits#get-a-commit
# Pretend to be curl(1) for pretty-printed JSON to help parse with sed(1)
	@${REINPLACE_CMD} -i '' -e "/^GH_HASH=/s/=.*/=	$$(\
		${SETENV} HTTP_USER_AGENT=curl ${FETCH_CMD} -qo- \
			https://api.github.com/repos/${GH_ACCOUNT}/${GH_PROJECT}/commits/${GH_TAGNAME} | \
			${SED} -n '/sha/ { s/.*\"\([0-9a-f]\{40\}\).*/\1/p; q; }' \
		)/" \
		${.CURDIR}/Makefile

.include <bsd.port.mk>

# XXX Work around !target(makesum)
makesum:	update-hash
