#!/usr/bin/make -f

# add DEB_* variables to the environment
include /usr/share/dpkg/architecture.mk
include /usr/share/dpkg/pkg-info.mk
include /usr/share/dpkg/vendor.mk

# determine whether this is a stable or development build
VERSION=$(shell echo $(DEB_SOURCE) | sed s/wine//g)
ifeq (x$(VERSION), x)
DEBSUFFIX=-stable
else
DEBSUFFIX=$(VERSION)
endif
export DEBSUFFIX

# installation paths
MANDIR=usr/share/man
BINDIR=usr/lib/wine$(VERSION)
DATDIR=usr/share/wine$(VERSION)
INCDIR=usr/include/wine$(VERSION)
LIBDIR=usr/lib/$(DEB_HOST_MULTIARCH)/wine$(VERSION)

# extra information to add to the version string
export VENDOR=$(DEB_VENDOR) $(DEB_VERSION)

# enable verbose build log
export DH_VERBOSE=1

# indicate that binary targets do not require root
export DEB_RULES_REQUIRES_ROOT=no

# enable hardening buildflags (fortify is not yet supported upstream and mingw does not yet support stackprotector)
export DEB_BUILD_MAINT_OPTIONS=hardening=+all,-fortify,-stackprotector

# ignore array-bounds and packed-non-aligned warnings for now
export DEB_CFLAGS_MAINT_APPEND+=-Wno-array-bounds -Wno-packed-not-aligned

# ignore all defined but unused function warnings
export DEB_CFLAGS_MAINT_APPEND+=-Wno-unused-function

# configure options
CONFLAGS=--with-gnutls \
         --without-hal \
         --without-oss \
         --without-sane \
         --without-netapi \
         --disable-tests \
         --enable-werror \
         --enable-maintainer-mode \
         --libdir=/$(LIBDIR) \
         --bindir=/$(BINDIR) \
         --mandir=/$(MANDIR) \
         --includedir=/$(INCDIR) \
         --datarootdir=/$(DATDIR) \
         ZLIB_PE_LIBS=z \
         $(shell dpkg-buildflags --export=cmdline) \

# enable wine64 on 64-bit architectures
ifeq ($(DEB_HOST_ARCH_BITS), 64)
CONFLAGS+=--enable-win64
# set "-Wno-format" (many format strings are not yet updated for 64-bit)
export DEB_CFLAGS_MAINT_APPEND+=-Wno-format
export DEB_BUILD_MAINT_OPTIONS=hardening=+all,-fortify,-stackprotector,-format
endif

# build with mingw on intel architectures
ifneq (,$(filter $(DEB_HOST_ARCH),i386 amd64))
CONFLAGS+=--with-mingw
endif

# on armel build for armv6t2
ifeq ($(DEB_HOST_ARCH), armel)
CONFLAGS+=--with-float-abi=soft
export DEB_CFLAGS_MAINT_APPEND+=-march=armv6t2 -Wno-array-parameter
endif

# on armhf build with hard float ABI
ifeq ($(DEB_HOST_ARCH), armhf)
CONFLAGS+=--with-float-abi=hard
export DEB_CFLAGS_MAINT_APPEND+=-Wno-array-parameter
endif

# on arm64 build using clang and ignore compiler warnings
ifeq ($(DEB_HOST_ARCH), arm64)
export CC=clang
export CXX=clang++
export DEB_CFLAGS_MAINT_APPEND+=-Wno-error
endif

# use date of the latest changelog update as the build date
export WIDL_TIME_OVERRIDE=$(SOURCE_DATE_EPOCH)

# additional files to generate
INSTALLS=$(shell ls debian/*VERSION* | sed s/VERSION/$(VERSION)/) \
         debian/bug-control \

debian/control: debian/control.in
	sed "s/VERSION/$(VERSION)/g;s/DEBSUFFIX/$(DEBSUFFIX)/g" < $< > $@

debian/wine$(VERSION)%: debian/wineVERSION%
	sed "s/VERSION/$(VERSION)/g;s/DEBSUFFIX/$(DEBSUFFIX)/g" < $< > $@

debian/wine32$(VERSION)%: debian/wine32VERSION%
	sed "s/VERSION/$(VERSION)/g;s/DEBSUFFIX/$(DEBSUFFIX)/g" < $< > $@

debian/wine64$(VERSION)%: debian/wine64VERSION%
	sed "s/VERSION/$(VERSION)/g;s/DEBSUFFIX/$(DEBSUFFIX)/g" < $< > $@

debian/libwine$(VERSION)%: debian/libwineVERSION%
	sed "s/VERSION/$(VERSION)/g;s/DEB_HOST_MULTIARCH/$(DEB_HOST_MULTIARCH)/g;s/DEB_HOST_GNU_CPU/$(DEB_HOST_GNU_CPU)/g" < $< > $@

debian/bug-control: debian/bug-control.in
	sed s/VERSION/$(VERSION)/g < $< > $@

%:
	dh $@

override_dh_auto_configure:
	# output compiler information
	$(CC) --version
	# automatically generated files
	./debian/scripts/generate server/trace.generated make_requests
	./debian/scripts/generate server/request.generated make_requests
	./tools/make_unicode
	./tools/make_requests
	cd dlls/dsound && ./make_fir
	cd dlls/opengl32 && ./make_opengl
	cd dlls/winevulkan && ./make_vulkan -x /usr/share/vulkan/registry/vk.xml
	# autotools files
	ln -sf /usr/share/misc/config.sub tools
	ln -sf /usr/share/misc/config.guess tools
	# image files used to generate icons for parts of wine
	ln -sf ../../dlls/user32/resources/oic_hand.svg dlls/display.drv16/oic_hand.svg
	ln -sf ../../dlls/user32/resources/oic_bang.svg dlls/comctl32/idi_tt_warn_sm.svg
	ln -sf ../../dlls/user32/resources/oic_note.svg dlls/comctl32/idi_tt_info_sm.svg
	ln -sf ../../dlls/user32/resources/oic_hand.svg dlls/comctl32/idi_tt_error_sm.svg
	ln -sf ../../dlls/shell32/resources/move.svg dlls/comctl32/idi_dragarrow.svg
	ln -sf ../../dlls/shell32/resources/image.svg programs/regedit/bin.svg
	ln -sf ../../dlls/shell32/resources/folder.svg programs/regedit/folder.svg
	ln -sf ../../dlls/shell32/resources/document.svg programs/regedit/string.svg
	ln -sf ../../dlls/shell32/resources/mycomputer.svg programs/regedit/computer.svg
	ln -sf ../../dlls/shell32/resources/folder_open.svg programs/regedit/folderopen.svg
	ln -sf ../../dlls/shell32/resources/window.svg programs/taskmgr/window.svg
	ln -sf ../../dlls/shell32/resources/window.svg programs/taskmgr/windowsm.svg
	ln -sf ../../dlls/shell32/resources/drive.svg dlls/comdlg32/hdisk.svg
	ln -sf ../../dlls/shell32/resources/folder.svg dlls/comdlg32/folder.svg
	ln -sf ../../dlls/shell32/resources/network.svg dlls/comdlg32/network.svg
	ln -sf ../../dlls/shell32/resources/folder_open.svg dlls/comdlg32/folder2.svg
	ln -sf ../../dlls/shell32/resources/disk_drive.svg dlls/comdlg32/floppy.svg
	ln -sf ../../dlls/shell32/resources/optical_drive.svg dlls/comdlg32/cdrom.svg
ifneq (,$(filter $(DEB_HOST_ARCH),i386 amd64))
	# ensure system zlib files are used for i386 and amd64
	rm -rf libs/zlib
endif
	# execute wine's configure script
	./configure $(CONFLAGS)

override_dh_auto_build-indep:
	# only build fonts for the architecture-independent packages
	make -C tools/sfnt2fon
	make -C fonts

override_dh_auto_build-arch:
	# build wine's headers upfront to avoid incompatible mingw versions
	make -C include
	dh_auto_build

override_dh_auto_test:
	# disabled, there are currently too many failing tests

override_dh_auto_install-indep: $(INSTALLS)
	mkdir -p debian/tmp
	cp ANNOUNCE debian/tmp/NEWS
	cp programs/winedbg/README debian/tmp/README.winedbg
	sed "s|DEBSUFFIX|$(DEBSUFFIX)|g" debian/scripts/wineapploader.in > debian/tmp/wineapploader
	chmod 755 debian/tmp/wineapploader
	sed "s|BINDIR|$(BINDIR)|g;s|VERSION|$(VERSION)|g" debian/scripts/wine.in > debian/tmp/wine$(DEBSUFFIX)
	make $(shell find . ! -path "./.pc/*" -name *\\.man\\.in | sed s/\\.in//)
	for file in $$(find . ! -path "./debian/*" -name \*.man); do \
	    rename=$$(basename $$file | sed "s/\\./$(DEBSUFFIX)./;s/UTF-8\\.//"); \
	    mv $$file debian/tmp/$$rename || true; \
	    done
	# files to exclude from the architecture-independent packages
	rm -f debian/tmp/usr/lib/*/wineserver
	rm -f debian/tmp/notepad*.man debian/tmp/winemine*.man
	rm -rf debian/tmp/usr/share/wine$(VERSION)/wine/nls
	# extract hicolor icon from logo.svg
	sed '/image\/png/d;s|width="611"|width="209"|' programs/winecfg/logo.svg > debian/tmp/wine$(DEBSUFFIX).svg

override_dh_auto_install-arch: $(INSTALLS)
	mkdir -p debian/tmp
	cp ANNOUNCE debian/tmp/NEWS
	cp tools/winedump/README debian/tmp/README.winedump
	mv server/wineserver debian/tmp/wineserver$(DEB_HOST_ARCH_BITS)
	sed "s|BINDIR|$(BINDIR)|g" debian/scripts/winegcc.in > debian/tmp/winegcc$(DEBSUFFIX)
	sed "s|BINDIR|$(BINDIR)|g;s|VERSION|$(VERSION)|g" debian/scripts/wineserver.in > debian/tmp/wineserver
	chmod 755 debian/tmp/wineserver
ifeq ($(DEB_HOST_ARCH), i386)
	echo >> debian/libwine$(VERSION).install
	echo "# 16-bit windows PE files" >> debian/libwine$(VERSION).install
	echo "debian/tmp/usr/lib/*/*/*/*.vxd" >> debian/libwine$(VERSION).install
	echo "debian/tmp/usr/lib/*/*/*/*.dll16" >> debian/libwine$(VERSION).install
	echo "debian/tmp/usr/lib/*/*/*/*.drv16" >> debian/libwine$(VERSION).install
	echo "debian/tmp/usr/lib/*/*/*/*.exe16" >> debian/libwine$(VERSION).install
	echo "debian/tmp/usr/lib/*/*/*/*.mod16" >> debian/libwine$(VERSION).install
endif
ifeq (,$(filter $(DEB_HOST_ARCH),i386 amd64))
	rm -f debian/libwine$(VERSION).prerm debian/libwine$(VERSION).postinst
endif
	dh_installdirs
	dh_auto_install
	for file in $$(find . ! -path "./debian/*" -name \*.man); do \
	    rename=$$(basename $$file | sed "s/\\./$(DEBSUFFIX)./;s/UTF-8\\.//"); \
	    mv $$file debian/tmp/$$rename || true; \
	    done
ifeq ($(DEB_HOST_ARCH_BITS), 64)
	cp debian/tmp/wine$(DEBSUFFIX).man debian/tmp/wine64$(DEBSUFFIX).man
endif
	# copy wine-preloader
	test -f debian/tmp/$(BINDIR)/wine-preloader && \
	    mv debian/tmp/$(BINDIR)/wine-preloader debian/tmp/$(BINDIR)/wine-preloader.static || \
	    cp debian/scripts/wine-preloader.static debian/tmp/$(BINDIR)
	# files to exclude from the architecture-dependent packages
	rm -rf debian/tmp/usr/share/man
	rm -f debian/tmp/usr/lib/*/wineserver
	rm -f debian/tmp/usr/lib/*/*/libwine.so
	rm -f debian/tmp/usr/share/*/fonts/*.fon
	rm -f debian/tmp/usr/share/*/fonts/*.ttf
	rm -f debian/tmp/notepad*.man debian/tmp/winemine*.man

override_dh_shlibdeps:
	mkdir -p debian/tmp
	./debian/scripts/config2elf debian/tmp/elf.recommends
	./debian/scripts/config2elf debian/tmp/elf.depends "libfontconfig|libfreetype|libncurses"
	dpkg-shlibdeps --warnings=1 \
	    -pdlopen \
	    -dDepends -edebian/tmp/elf.depends \
	    -dRecommends -edebian/tmp/elf.recommends \
	    -Tdebian/libwine$(VERSION).substvars 2>/dev/null
	dh_shlibdeps

override_dh_makeshlibs:
	# avoid unnecessary calls to ldconfig
	dh_makeshlibs -n

override_dh_bugfiles:
	dh_bugfiles -A

override_dh_missing:
	dh_missing -X elf.depends -X elf.recommends -X wine.desktop

override_dh_clean:
	dh_clean -- $(INSTALLS)
	make -f debian/rules debian/control

override_dh_auto_clean:
	make -f debian/rules debian/control
ifeq (,$(filter $(DEB_HOST_ARCH),i386 amd64))
	# remove zlib patch on non x86 architectures
	QUILT_PATCHES=debian/patches quilt pop -af || true
	QUILT_PATCHES=debian/patches quilt delete system/zlib.patch || true
endif
	QUILT_PATCHES=debian/patches quilt push -af || true
	dh_auto_clean
