#!/usr/bin/make -f

DISABLE_UPDATE_UPLOADERS = 1
include /usr/share/gnome-pkg-tools/1/rules/uploaders.mk
include /usr/share/dpkg/default.mk
include /usr/share/dpkg/pkg-info.mk

built_binaries := $(shell dh_listpackages)
all_binaries := $(shell sed -ne 's/^Package: *//p' < debian/control)

# Ensure the build aborts when there are still references to undefined symbols
# currently fails at least in the im-multipress im module
#LDFLAGS += -Wl,-z,defs

# Make the linker work a bit harder so dynamic loading can be done faster
LDFLAGS += -Wl,-O1

APIVER := 4
SONAME := 1

LIBDIR := usr/lib/$(DEB_HOST_MULTIARCH)

# earliest version that this release has backwards binary compatibility for
GTK_BINARY_VERSION := 4.0.0

# Gtk binary version virtual Provide
GTK_BINVER_DEP := gtk$(APIVER)-binver-$(GTK_BINARY_VERSION)

# relative base directory for configuration
CONFDIR := etc/gtk-4.0

# relative base directory for all types of modules
MODULES_BASE_PATH := $(LIBDIR)/gtk-4.0/$(GTK_BINARY_VERSION)

# package names
SHARED_PKG := libgtk-$(APIVER)-$(SONAME)
COMMON_PKG := libgtk-$(APIVER)-common
DEV_PKG := libgtk-$(APIVER)-dev
UDEB_PKG := $(SHARED_PKG)-udeb
DOC_PKG := libgtk-$(APIVER)-doc
BIN_PKG := libgtk-$(APIVER)-bin
EXAMPLES_PKG := gtk-$(APIVER)-examples
TESTS_PKG := gtk-$(APIVER)-tests

# files larger than 4k in size will be compressed by dh_compress
# so append a .gz suffix to avoid dangling symlinks
NEWS := NEWS$(shell find -maxdepth 1 -size +4k -name NEWS -exec echo ".gz" \;)
README.md := README.md$(shell find -maxdepth 1 -size +4k -name README.md -exec echo ".gz" \;)

# macro computing the list of 'debian/<pkg>.*" files which have a
# corresponding ".in" file; pass the list of packages in $(1)
dh_subst_files = $(patsubst %.in,%,$(wildcard $(addprefix debian/, $(addsuffix *.in, $(1)))))

debian/%: debian/%.in
	dh_testdir
	sed \
		-e "s#@SONAME@#$(SONAME)#g" \
		-e "s#@APIVER@#$(APIVER)#g" \
		-e "s#@VERSION@#$(DEB_VERSION_UPSTREAM)#g" \
		-e "s#@GTK_BINVER_DEP@#$(GTK_BINVER_DEP)#g" \
		-e "s#@SHARED_PKG@#$(SHARED_PKG)#g" \
		-e "s#@COMMON_PKG@#$(COMMON_PKG)#g" \
		-e "s#@DEV_PKG@#$(DEV_PKG)#g" \
		-e "s#@UDEB_PKG@#$(UDEB_PKG)#g" \
		-e "s#@DOC_PKG@#$(DOC_PKG)#g" \
		-e "s#@BIN_PKG@#$(BIN_PKG)#g" \
		-e "s#@EXAMPLES_PKG@#$(EXAMPLES_PKG)#g" \
		-e "s#@TESTS_PKG@#$(TESTS_PKG)#g" \
		-e "s#@GNOME_TEAM@#$(UPLOADERS)#g" \
		-e "s#@GTK_BINARY_VERSION@#$(GTK_BINARY_VERSION)#g" \
		-e "s#@LIBDIR@#$(LIBDIR)#g" \
		-e 's#@CONFDIR@#$(CONFDIR)#g' \
		-e "s#@MODULES_BASE_PATH@#$(MODULES_BASE_PATH)#g" \
		-e "s#@NEWS@#$(NEWS)#g" \
		-e "s#@README.md@#$(README.md)#g" \
		$@.in > $@

configure_flags_common = \
	--libdir=/$(LIBDIR) \
	-Dsassc=enabled \
	${NULL}

configure_flags_deb = \
	-Dbroadway-backend=true \
	-Dcloudproviders=disabled \
	-Dintrospection=enabled \
	-Dman-pages=true \
	-Dmedia=none \
	-Dprint-backends=all \
	-Dx11-backend=true \
	-Dxinerama=enabled \
	${NULL}

ifeq (,$(filter stage1,$(DEB_BUILD_PROFILES)))
configure_flags_deb += -Dcolord=enabled
else
configure_flags_deb += -Dcolord=disabled
endif

ifeq (linux,$(DEB_HOST_ARCH_OS))
configure_flags_deb += -Dvulkan=enabled
configure_flags_deb += -Dwayland-backend=true
else
configure_flags_deb += -Dvulkan=disabled
configure_flags_deb += -Dwayland-backend=false
endif

ifeq ($(filter %-doc,$(built_binaries)),)
configure_flags_deb += -Dgtk_doc=false
else
configure_flags_deb += -Dgtk_doc=true
endif

ifeq ($(filter %-examples,$(built_binaries)),)
configure_flags_deb += -Dbuild-examples=false
configure_flags_deb += -Ddemos=false
else
configure_flags_deb += -Dbuild-examples=true
configure_flags_deb += -Ddemos=true
endif

ifeq ($(filter %-tests,$(built_binaries)),)
configure_flags_deb += -Dinstall-tests=false
else
configure_flags_deb += -Dinstall-tests=true
endif

configure_flags_udeb = \
	-Dbroadway-backend=false \
	-Dbuild-examples=false \
	-Dcloudproviders=disabled \
	-Ddemos=false \
	-Dinstall-tests=false \
	-Dwayland-backend=false \
	-Dx11-backend=true \
	-Dxinerama=disabled \
	-Dintrospection=disabled \
	-Dprint-backends=none \
	-Dcolord=disabled \
	-Dmedia=none

%:
	dh $@ --with gir --buildsystem=meson

override_dh_clean: debian/control
	# gross kludge to force control generation with the %.in target
	touch debian/control.in
	rm -f $(call dh_subst_files,$(all_binaries))
	rm -rf debian/build debian/install
	dh_clean

# Add dependencies to generate files from the debian/*.in ones
override_dh_auto_build: $(call dh_subst_files,$(all_binaries))

override_dh_auto_configure: debian/control
	dh_auto_configure \
		--builddirectory=debian/build/deb \
		-- \
		$(configure_flags_common) \
		$(configure_flags_deb) \
		$(NULL)
ifneq ($(filter %-udeb,$(built_binaries)),)
	dh_auto_configure \
		--builddirectory=debian/build/udeb \
		-- \
		$(configure_flags_common) \
		$(configure_flags_udeb) \
		$(NULL)
endif

override_dh_auto_build:
	dh_auto_build --builddirectory=debian/build/deb
ifneq ($(filter %-doc,$(built_binaries)),)
	# Explicitly build the documentation: otherwise it's done as a
	# side-effect of the install step, which doesn't respect the
	# dependencies that generate Docbook files from markdown.
	# https://github.com/mesonbuild/meson/issues/1844
	# https://github.com/mesonbuild/meson/issues/5793
	dh_auto_build --builddirectory=debian/build/deb -- gdk4-doc gsk4-doc gtk4-doc
endif
ifneq ($(filter %-udeb,$(built_binaries)),)
	dh_auto_build --builddirectory=debian/build/udeb
endif

test_timeout_multiplier = 1

ifneq ($(filter arm hppa mips% sparc%,$(DEB_HOST_ARCH_CPU)),)
$(info Slow architecture detected, increasing test timeout)
test_timeout_multiplier = 10
endif

ifneq ($(filter m68k riscv64 sh4,$(DEB_HOST_ARCH_CPU)),)
$(info Architecture with qemu buildds detected, increasing test timeout a lot)
test_timeout_multiplier = 20
endif

fuzzy_reftests = \
	border-image-url \
	label-attribute-preference \
	label-wrap-justify \
	pseudoclass-on-box \
	quit-mnemonic \
	$(NULL)

xfail_reftests = \
	label-sizing \
	sizegroups-evolution-identity-page \
	$(NULL)

# TODO: Known failures without a bug filed:
# mips(64)el: gtk:gsk+gsk-compare+gsk-opengl+gsk-compare-opengl / opengl blend-normal
#             gtk:gsk+gsk-compare+gsk-opengl+gsk-compare-opengl / opengl blend-difference
#             gtk:gsk+gsk-compare+gsk-broadway+gsk-compare-broadway / broadway blend-normal
#             gtk:gsk+gsk-compare+gsk-broadway+gsk-compare-broadway / broadway blend-difference
# s390x: many (endianness?)
override_dh_auto_test:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	rm -f debian/tests-failed
	set -e; for reftest in $(fuzzy_reftests); do \
		cp debian/close-enough.keyfile \
			testsuite/reftests/$$reftest.keyfile; \
	done
	# So that gsettings can find the (uninstalled) gtk schemas
	mkdir -p debian/build/glib-2.0/schemas/
	cp gtk/org.gtk.* debian/build/glib-2.0/schemas/
	glib-compile-schemas debian/build/glib-2.0/schemas/
	# Remove LD_PRELOAD so we don't run with fakeroot, which makes dbus-related tests fail
	env \
		-u LD_PRELOAD \
		GIO_MODULE_DIR=/nonexistent \
		GIO_USE_VFS=local \
		GIO_USE_VOLUME_MONITOR=unix \
	dbus-run-session -- \
	xvfb-run -a -s "-screen 0 1024x768x24" \
	debian/tests/run-with-locales \
		--generate de_DE.UTF-8 \
		--generate en_GB.UTF-8 \
		--generate en_US.UTF-8 \
		--generate sv_SE \
		-- \
	dh_auto_test \
		--no-parallel \
		--builddirectory=debian/build/deb \
		-- \
		--setup=x11 \
		--timeout-multiplier $(test_timeout_multiplier) \
	|| touch debian/tests-failed
	tail -v -n +0 debian/build/deb/meson-logs/testlog-x11.txt
	# Don't base64-encode the image results for tests that upstream
	# expect to fail
	set -e; for reftest in $(xfail_reftests); do \
		rm -f debian/build/deb/testsuite/reftests/output/x11/$$reftest.diff.png; \
	done
	# Put the rest in the log as base64 since we don't have an
	# equivalent of AUTOPKGTEST_ARTIFACTS for buildds
	debian/log-reftests.py
	# Avoid incremental builds with -nc leaking settings into the next build
	set -e; for reftest in $(fuzzy_reftests); do \
		rm -f testsuite/reftests/$$reftest.keyfile; \
	done
	if test -e debian/tests-failed; then exit 1; fi
endif

override_dh_auto_install:
	dh_auto_install --builddirectory=debian/build/deb --destdir=debian/install/deb
ifneq ($(filter %-udeb,$(built_binaries)),)
	dh_auto_install --builddirectory=debian/build/udeb --destdir=debian/install/udeb
endif

override_dh_install:
	rm -frv debian/install/deb/etc/emacs/site-start.d/*gtk-doc-tools.el
	rm -frv debian/install/deb/usr/bin/gtkdoc*
	rm -frv debian/install/deb/usr/share/aclocal/gtk-doc.m4
	rm -frv debian/install/deb/usr/share/cmake/GtkDoc
	rm -frv debian/install/deb/usr/share/emacs/site-lisp/gtk-doc-tools
	rm -frv debian/install/deb/usr/share/gtk-doc/data
	rm -frv debian/install/deb/usr/share/gtk-doc/python
	rm -frv debian/install/deb/usr/share/man/man1/gtkdoc*
	rm -frv debian/install/deb/usr/share/pkgconfig/gtk-doc.pc
	rm -frv debian/install/deb/usr/share/sgml/gtk-doc
	:
	rm -fv debian/install/udeb/usr/bin/gtk4-update-icon-cache
	rm -frv debian/install/udeb/usr/share/gtk-4.0/valgrind
	rm -frv debian/install/udeb/usr/share/metainfo
	:
	dh_install -p$(UDEB_PKG) --sourcedir=debian/install/udeb
	dh_install --remaining-packages --sourcedir=debian/install/deb

override_dh_missing:
ifneq ($(filter %-udeb,$(built_binaries)),)
	dh_missing --sourcedir=debian/install/udeb --list-missing -X.la
endif
	dh_missing --sourcedir=debian/install/deb --fail-missing -X.la

override_dh_installdocs:
	dh_installdocs -p$(COMMON_PKG) AUTHORS README.md NEWS
	dh_installdocs -p$(DOC_PKG) AUTHORS -X.in
	dh_installdocs --remaining-packages

override_dh_makeshlibs:
	dh_makeshlibs -p$(SHARED_PKG) -V --add-udeb=$(UDEB_PKG) -X$(MODULES_BASE_PATH) -- -c4
	dh_makeshlibs --remaining-packages -X$(MODULES_BASE_PATH)
