COMMENT =	LibreWolf web browser
ONLY_FOR_ARCHS =	amd64 aarch64 riscv64

# A series of warnings follow, for the wily port maintainer.

# This port was initially implemented by copying www/mozilla-firefox,
# making only the most surgical changes; maintain accordingly.

# LibreWolf uses mozconfig, so CONFIGURE_ARGS has no effect.
# Consequently, we provide a patched version, tracking upstream
# changes but with OpenBSD-appropriate modifications. This is
# handled via pre-configure. This port syncs with www/mozilla-firefox
# configuration, versioning and patching where indicated, thereby
# vicariously tracking the LibreWolf upstream.

# While updating, please ensure that you adapt any changes, where
# indicated, from: www/mozilla, www/mozilla-firefox and upstream's
# mozconfig. Please know also, that www/firefox-i18n is unused in
# this port, partly because LibreWolf hardcodes use of en-US upstream,
# irrespective of the system language (for anti-fingerprinting).

# If upstream adds a -x revision number, it becomes .x in OpenBSD,
# e.g. 149.0.2-2 (upstream) becomes 149.0.2.2 (OpenBSD), to avoid
#      issues with ports, and it makes REVISION handling cleaner.
MOZILLA_DIST_VERSION =	149.0.2-2
MOZILLA_VERSION =	${MOZILLA_DIST_VERSION:C/-([0-9]+)$/pl\1/}

MOZILLA_PROJECT =	librewolf
MOZILLA_CODENAME =	browser
MAINTAINER =		Leah Rowe <leah@libreboot.org>

HOMEPAGE =	https://librewolf.net/
SO_VERSION =	161.0
# NOTE: Must bump minor version if any shlib's are removed from the
# components dir to avoid pkg_add -r issues.
MOZILLA_LIBS =	mozavcodec mozavutil mozgtk mozinference mozwayland xul clearkey gkcodecs lgpllibs mozsqlite3

CATEGORIES =	www

SITES =		https://codeberg.org/api/packages/librewolf/generic/librewolf-source/${MOZILLA_DIST_VERSION}/
EXTRACT_SUFX =	.tar.gz
DIST_SUBDIR =	librewolf

# mozilla public license
PERMIT_PACKAGE=	Yes

# lots of logic in mozilla.port.mk
MODULES =	www/mozilla lang/python

MODPY_RUNDEP =	No

COMPILER =	ports-clang

# 63 requires node because why not #1483595
BUILD_DEPENDS +=	lang/node
# 63 requires cbindgen #1478813
BUILD_DEPENDS +=	devel/cbindgen>=0.23.0
# wasi
BUILD_DEPENDS +=	lang/wasi-sdk/compiler-rt \
			lang/wasi-sdk/libcxx \
			lang/wasi-libc
# mach uses pkg_resources
BUILD_DEPENDS +=	devel/py-setuptools

# audio/video support
RUN_DEPENDS =		graphics/ffmpeg

# uses pledge()
WANTLIB += Xrandr Xtst

CONFIGURE_STYLE =	simple
CONFIGURE_SCRIPT =	${MODPY_BIN} ${WRKSRC}/configure.py
MAKE_ENV +=		BUILD_VERBOSE_LOG="1" CARGOFLAGS="-j${MAKE_JOBS}"
.if ${MACHINE_ARCH} == aarch64
# retguard leads to segfault at startup on arm64, cf #1973016
CONFIGURE_ENV +=	CPPFLAGS="-fno-ret-protector -Wno-backend-plugin"
.else
CONFIGURE_ENV +=	CPPFLAGS=-Wno-backend-plugin
.endif
NCPU !!=		sysctl -n hw.ncpuonline
.if ${NCPU} > 4
CONFIGURE_ENV +=	LDFLAGS="-Wl,--threads=5 --ld-path=${WRKDIR}/bin/ld"
.else
CONFIGURE_ENV +=	LDFLAGS="-Wl,--threads=${MAKE_JOBS} --ld-path=${WRKDIR}/bin/ld"
.endif

MOZILLA_USE_DBUS =	Yes
MOZILLA_USE_SYSTEM_AV1 =Yes
MOZILLA_USE_SYSTEM_ZLIB=Yes

# XXX badly formed debug ?
DWZ = :
DEBUG_PACKAGES =	${BUILD_PACKAGES}

# not built on riscv64
COMMENT_FFVPX ?=
.if ${MACHINE_ARCH} == riscv64
COMMENT_FFVPX =		@comment # needs a trailing space
.endif
SUBST_VARS +=		COMMENT_FFVPX

TEST_IS_INTERACTIVE =	x11
# needs /etc/firefox for pledge/unveil configs
TEST_DEPENDS =		${BUILD_PKGPATH}
# those env vars allows to reuse the virtualenv created by the build instead of creating another one
TEST_ENV +=		PATH=/bin:/usr/bin MOZ_OBJDIR=${WRKBUILD} MOZ_AUTOMATION=1 HOME=${WRKSRC}
pre-test:
	@if grep -q ${WRKOBJDIR} /etc/${MOZILLA_PROJECT}/unveil.content; then \
		return 0 ; \
	else \
		echo 'WARNING: ${WRKOBJDIR} r should be added to /etc/${MOZILLA_PROJECT}/unveil.content'; \
		return 1 ; \
	fi

do-test:
	cd ${WRKSRC} && \
		${SETENV} ${TEST_ENV} ${WRKSRC}/.mozbuild/srcdirs/${MOZILLA_PROJECT}-*/_virtualenvs/build/bin/python ./mach xpcshell-test --sequential --keep-going ; \

pre-configure:
	cp ${FILESDIR}/mozconfig-openbsd ${WRKSRC}/mozconfig
	sed -i -e "s,%%MOZILLA_PROJECT%%,${MOZILLA_PROJECT},g" ${WRKSRC}/mozconfig
	sed -i -e "s,%%PREFIX%%,${PREFIX},g" ${WRKSRC}/mozconfig
	sed -i -e "s,%%LOCALBASE%%,${LOCALBASE},g" ${WRKSRC}/mozconfig
.if defined(DEBUG)
	# www/mozilla sets DEBUG_CONFIGURE_ARGS, but these
	# have no effect either, due to use of mozconfig
	echo "ac_add_options --enable-debug" \
		>> ${WRKSRC}/mozconfig
	echo "ac_add_options --enable-debug-symbols" \
		>> ${WRKSRC}/mozconfig
	echo "ac_add_options --disable-install-strip" \
		>> ${WRKSRC}/mozconfig
.else
	# these three option greatly reduce binary sizes
	echo "ac_add_options --disable-debug" \
		>> ${WRKSRC}/mozconfig
	echo "ac_add_options --disable-debug-symbols" \
		>> ${WRKSRC}/mozconfig
	echo "ac_add_options --enable-install-strip" \
		>> ${WRKSRC}/mozconfig
.endif
.if ${MACHINE_ARCH} != riscv64
	# LTO eats too much RAM on riscv64
	echo "ac_add_options --enable-lto=thin" >> ${WRKSRC}/mozconfig
.endif
.if !defined(MOZILLA_USE_BUNDLED_NSS)
	echo "ac_add_options --with-system-nss" >> ${WRKSRC}/mozconfig
.endif
.if !defined(MOZILLA_USE_BUNDLED_NSPR)
	echo "ac_add_options --with-system-nspr" >> ${WRKSRC}/mozconfig
.endif
.if !defined(MOZILLA_USE_BUNDLED_ICU)
	echo "ac_add_options --with-system-icu" >> ${WRKSRC}/mozconfig
.endif
.if !defined(MOZILLA_USE_BUNDLED_FFI)
	echo "ac_add_options --with-system-ffi" >> ${WRKSRC}/mozconfig
.endif
.if defined(MOZILLA_USE_SYSTEM_AV1)
	echo "ac_add_options --with-system-av1" >> ${WRKSRC}/mozconfig
.endif
.if defined(MOZILLA_USE_SYSTEM_ZLIB)
	echo "ac_add_options --with-system-zlib" >> ${WRKSRC}/mozconfig
.endif
.if !defined(MOZILLA_USE_DBUS)
	echo "ac_add_options --disable-dbus" >> ${WRKSRC}/mozconfig
.else
	echo "ac_add_options --enable-dbus" >> ${WRKSRC}/mozconfig
.endif
.if defined(MOZILLA_PROFDATA_TASKID)
.if ${MACHINE_ARCH:Mamd64}
	echo "ac_add_options --enable-profile-use" \
		>> ${WRKSRC}/mozconfig
	echo "ac_add_options --with-pgo-profile-path=${WRKDIR}/merged.profdata" \
		>> ${WRKSRC}/mozconfig
.endif
.endif
# from browser/config/mozconfig
.if ${MOZILLA_CODENAME:Mcomm*}
	echo "ac_add_options --enable-application=${MOZILLA_CODENAME}" \
		>> ${WRKSRC}/mozconfig
.else
#1801738
	echo "ac_add_options --enable-project=${MOZILLA_CODENAME}" \
		>> ${WRKSRC}/mozconfig
.endif

post-install:
	${INSTALL_DATA_DIR} ${PREFIX}/man/man1
	${SUBST_MAN} ${FILESDIR}/${MOZILLA_PROJECT}.1 \
		${PREFIX}/man/man1/${MOZILLA_PROJECT}.1

	# preferences (OpenBSD defaults + sandboxing)
	${INSTALL_DATA_DIR} \
		${PREFIX}/lib/${MOZILLA_PROJECT}/browser/defaults/preferences
	${SUBST_DATA} ${FILESDIR}/all-openbsd.js \
		${PREFIX}/lib/${MOZILLA_PROJECT}/browser/defaults/preferences/all-openbsd.js

.for f in pledge unveil
.for t in content gpu main rdd socket utility
	${INSTALL_DATA} ${FILESDIR}/${f}.${t} \
		${PREFIX}/lib/${MOZILLA_PROJECT}/browser/defaults/preferences/
.endfor
.endfor

	# distribution metadata
	${INSTALL_DATA_DIR} ${PREFIX}/lib/${MOZILLA_PROJECT}/distribution
	echo "[Global]\nid=OpenBSD\nversion=${OSREV}\nabout=Packaged by ${MAINTAINER}\n" > \
		${PREFIX}/lib/${MOZILLA_PROJECT}/distribution/distribution.ini

	# librewolf runtime config (tweaks, policy and so on)
	${INSTALL_DATA_DIR} \
		${PREFIX}/lib/${MOZILLA_PROJECT}
	${INSTALL_DATA} ${WRKDIST}/lw/${MOZILLA_PROJECT}.cfg \
		${PREFIX}/lib/${MOZILLA_PROJECT}/

	${INSTALL_DATA_DIR} \
		${PREFIX}/lib/${MOZILLA_PROJECT}/distribution
	${INSTALL_DATA} ${WRKDIST}/lw/policies.json \
		${PREFIX}/lib/${MOZILLA_PROJECT}/distribution/
	${INSTALL_DATA_DIR} \
		${PREFIX}/lib/${MOZILLA_PROJECT}/defaults/pref

	${INSTALL_DATA} ${FILESDIR}/autoconfig.js \
		${PREFIX}/lib/${MOZILLA_PROJECT}/defaults/pref/

	${INSTALL_DATA_DIR} ${PREFIX}/share/applications
	${INSTALL_DATA} ${FILESDIR}/${MOZILLA_PROJECT}.desktop \
		${PREFIX}/share/applications/${MOZILLA_PROJECT}.desktop

.for s in 16 32 48 64 128
	${INSTALL_DATA_DIR} ${PREFIX}/share/icons/hicolor/${s}x${s}/apps
	${INSTALL_DATA} \
		${WRKSRC}/browser/branding/${MOZILLA_PROJECT}/default${s}.png \
		${PREFIX}/share/icons/hicolor/${s}x${s}/apps/org.${MOZILLA_PROJECT}.png
.endfor
	${INSTALL_DATA_DIR} ${PREFIX}/share/icons/hicolor/scalable/apps
	${INSTALL_DATA} \
		${WRKSRC}/browser/branding/${MOZILLA_PROJECT}/content/about-logo.svg \
		${PREFIX}/share/icons/hicolor/scalable/apps/org.${MOZILLA_PROJECT}.svg
# librewolf didn't include 22x22/24x24/256x256, needed on some DEs
.for s in 22 24 256
	${INSTALL_DATA_DIR} ${PREFIX}/share/icons/hicolor/${s}x${s}/apps
	${INSTALL_DATA} \
		${FILESDIR}/${s}.png \
		${PREFIX}/share/icons/hicolor/${s}x${s}/apps/org.${MOZILLA_PROJECT}.png
.endfor

	${INSTALL_DATA_DIR} ${PREFIX}/share/fonts
	mv ${PREFIX}/lib/${MOZILLA_PROJECT}/fonts \
		${PREFIX}/share/fonts/${MOZILLA_PROJECT}

	# compatibility symlink (non-ICCCM WMs)
	ln -f ${PREFIX}/lib/${MOZILLA_PROJECT}/browser/chrome/icons/default/default48.png \
		${PREFIX}/lib/${MOZILLA_PROJECT}/browser/chrome/icons/default/default.png

.include <bsd.port.mk>
