#!/usr/bin/make -f

built_binaries := $(shell dh_listpackages)

include /usr/share/dpkg/architecture.mk

# The name of the build-*.txt profile to choose
WINE_BUILD_NAME = win$(DEB_HOST_ARCH_BITS)

# The directory in which we will build
WINE_BUILD_DIR   = build-$(WINE_BUILD_NAME)

%:
	dh $@

# fails with: unrecognized option '-z'
export DEB_BUILD_MAINT_OPTIONS := hardening=-relro

# Use amd64 build flags when building the package on 64 bit architectures, i386
# otherwise
ifeq ($(DEB_HOST_ARCH_BITS),64)
	WINE_CFLAGS = $(shell dpkg-architecture -aamd64 -f -c dpkg-buildflags --get CFLAGS)
	WINE_CXXFLAGS = $(shell dpkg-architecture -aamd64 -f -c dpkg-buildflags --get CXXFLAGS)
else
	WINE_CFLAGS = $(shell dpkg-architecture -ai386 -f -c dpkg-buildflags --get CFLAGS)
	WINE_CXXFLAGS = $(shell dpkg-architecture -ai386 -f -c dpkg-buildflags --get CXXFLAGS)
endif

LDFLAGS += -flto -Wl,--build-id

# Meson flags
# TODO: why do dll files end-up in the bindir directory???
WINE_MESON_FLAGS = --buildtype=plain \
			   --cross-file=build-$(WINE_BUILD_NAME).txt \
			   --prefix=/usr \
			   --bindir=lib/dxvk/wine$(DEB_HOST_ARCH_BITS) \
			   --libdir=lib/dxvk/wine$(DEB_HOST_ARCH_BITS) \
               $(WINE_BUILD_DIR)

NATIVE_MESON_FLAGS = \
	-Dnative_glfw=disabled \
	-Dnative_sdl2=enabled \
	-Dnative_sdl3=enabled \
	$(NULL)

execute_after_dh_auto_clean:
	rm -fr $(WINE_BUILD_DIR)

override_dh_auto_configure:
	echo "blhc: ignore-line-regexp: C\+\+ linker for the build machine: .*"

	# DXVK >= 2.0 now links to SPIRV headers using submodules
	# add temporary symlinks to use packaged headers instead
	mkdir -p include/spirv/include
	ln -fns /usr/include/spirv include/spirv/include/spirv
	# Assert that the headers have the expected layout
	test -f include/spirv/include/spirv/unified1/spirv.hpp

	# src:vulkan-loader is currently too old, we use the vendored copy
	# Assert that the headers have the expected layout
	test -f include/vulkan/include/vk_video/vulkan_video_codecs_common.h
	test -f include/vulkan/include/vulkan/vulkan.h

	# DXVK 2.1 now embeds libdisplay-info
	# TODO: use libdisplay-info-src instead when no need for the fork
	#ln -s /usr/src/libdisplay-info-src subprojects/libdisplay-info
	test -f subprojects/libdisplay-info/displayid.c

	test -f subprojects/dxbc-spirv/dxbc/dxbc_interface.h
	# dxbc-spirv needs SPIRV-Headers, too
	mkdir -p subprojects/dxbc-spirv/submodules/spirv_headers/include
	ln -fns /usr/include/spirv subprojects/dxbc-spirv/submodules/spirv_headers/include/spirv
	test -f subprojects/dxbc-spirv/submodules/spirv_headers/include/spirv/unified1/spirv.hpp

	# DXVK Native requires a subset of MinGW DirectX headers
	test -f include/native/directx/d3d.h

	dh_auto_configure -- $(NATIVE_MESON_FLAGS)

ifneq ($(filter dxvk-wine%,$(built_binaries)),)
	echo "WINE_MESON_FLAGS: $(WINE_MESON_FLAGS)"
	CFLAGS="$(WINE_CFLAGS)" CXXFLAGS="$(WINE_CXXFLAGS)" meson setup $(WINE_MESON_FLAGS)
endif

LOCAL_HEADERS = \
	-I$(CURDIR)/include/native \
	-I$(CURDIR)/include/native/directx \
	-I$(CURDIR)/include/native/windows \
	$(NULL)

execute_after_dh_auto_build:
ifneq ($(filter amd64 arm64 i386,$(DEB_HOST_ARCH)),)
	make -C debian/tests/native \
		DXVK_D3D9_CFLAGS="$(LOCAL_HEADERS)" \
		DXVK_D3D9_LIBS="$(CURDIR)/obj-$(DEB_HOST_GNU_TYPE)/src/d3d9/libdxvk_d3d9.so" \
		DXVK_D3D11_CFLAGS="$(LOCAL_HEADERS)" \
		DXVK_D3D11_LIBS="$(CURDIR)/obj-$(DEB_HOST_GNU_TYPE)/src/d3d11/libdxvk_d3d11.so" \
		$(NULL)
endif
ifneq ($(filter dxvk-wine%,$(built_binaries)),)
	dh_auto_build --buildsystem=ninja --builddirectory=$(WINE_BUILD_DIR)
endif

execute_after_dh_auto_install:
	find debian/tmp/usr/include \( -name "*.txt" -o -name "*.md" \) -delete
	# Create the directory unconditionally, it will stay empty on
	# architectures not supported by vkd3d
	install -d debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/installed-tests/dxvk-native
ifneq ($(filter amd64 arm64 i386,$(DEB_HOST_ARCH)),)
	make -C debian/tests/native install \
		tests_dir=/usr/lib/$(DEB_HOST_MULTIARCH)/installed-tests/dxvk-native \
		DESTDIR=$(CURDIR)/debian/tmp
endif
ifneq ($(filter dxvk-wine%,$(built_binaries)),)
	dh_auto_install --buildsystem=ninja --builddirectory=$(WINE_BUILD_DIR)
	# we could change the install script but then the previous installations would be broken
	rename 's/\.dll$$/.dll.so/' debian/tmp/usr/lib/dxvk/wine$(DEB_HOST_ARCH_BITS)/*.dll
endif

override_dh_strip:
ifneq ($(filter dxvk-wine%,$(built_binaries)),)
	# strip debug info out of ddls and store it in a separate debug file
	# (dh_strip for windows)
	./debian/strip_debug.sh dxvk-wine$(DEB_HOST_ARCH_BITS)
endif
	# call dh_strip to create the doc directory
	dh_strip

override_dh_shlibdeps:
	dh_shlibdeps -- -l/usr/lib/$(DEB_HOST_MULTIARCH)/wine

execute_after_dh_clean:
ifneq ($(filter amd64 arm64 i386,$(DEB_HOST_ARCH)),)
	make -C debian/tests/native clean
endif
	rm -rf subprojects/dxbc-spirv/submodules
	rm -rf include/spirv
