#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

export DH_OPTIONS=${EXTRA_DH_OPTIONS}

py3_dbusmoddir = $(shell python3 -c 'import dbus.mainloop; print(dbus.mainloop.__path__[0])')
py_dbusmoddir = $(shell python -c 'import dbus.mainloop; print(dbus.mainloop.__path__[0])')

debian_version = $(word 2,$(shell dpkg-parsechangelog | grep ^Version:))
upstream_dfsg_version = $(firstword $(subst -, ,$(debian_version)))
upstream_version = $(subst ~,,$(firstword $(subst +, ,$(debian_version))))

CFLAGS=
CPPFLAGS=
CXXFLAGS=
LDFLAGS=
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
	CFLAGS += -O0 -g
	CXXFLAGS += -O0
else
	CFLAGS += $(shell dpkg-buildflags --get CFLAGS)
	CPPFLAGS += $(shell dpkg-buildflags --get CPPFLAGS)
	CXXFLAGS += $(shell dpkg-buildflags --get CXXFLAGS)
	LDFLAGS += $(shell dpkg-buildflags --get LDFLAGS)
endif

LDFLAGS += -Wl,-O1 -Wl,--as-needed

SPLIT=10

PYTHON3S := $(shell  py3versions -vr)
DEFAULT_PYTHON := $(shell py3versions -vd)
PYTHON := 2.7
ALLPYTHONS := $(PYTHON3S) $(PYTHON)

export QT_SELECT=qt5

# LIBS_* is unset to avoid linking to too many libraries
# STRIP is unset to let stripping be handled by dh_strip
SHARED_CONFIGURE_OPTIONS=--confirm-license --verbose \
	-q /usr/bin/qmake -c -j $(SPLIT) \
	LIBDIR_QT=/usr/lib STRIP="" MOC=/usr/bin/moc \
	LIBS_OPENGL="" LIBS_X11="" LIBS_THREAD="" \
	QMAKE_CFLAGS+="${CFLAGS} ${CPPFLAGS}" \
	QMAKE_CXXFLAGS+="${CXXFLAGS} ${CPPFLAGS}" \
	QMAKE_LFLAGS+="${LDFLAGS}"


.PRECIOUS: build-%/configure-stamp dbg-build-%/configure-stamp

configure: $(ALLPYTHONS:%=build-%/configure-stamp) $(ALLPYTHONS:%=dbg-build-%/configure-stamp)

build-%/configure-stamp:
	dh_testdir
	mkdir -p build-$*
	cd build-$* && python$* ../configure.py $(SHARED_CONFIGURE_OPTIONS) \
			-m $(shell python$*-config --configdir) \
			-d /usr/lib/python$*/dist-packages \
			--sip-incdir /usr/include/python$*$(if $(filter 3.%, $*),m,) \
			--dbus /usr/include/dbus-1.0 \
			$(if $(filter $(DEFAULT_PYTHON),$*),,--no-designer-plugin --no-qml-plugin --no-tools)
	sed -i '/strip/d' build-$*/*/Makefile
	touch $@

dbg-build-%/configure-stamp:
	dh_testdir
	mkdir -p dbg-build-$*
	cd dbg-build-$* && python$*-dbg ../configure.py $(SHARED_CONFIGURE_OPTIONS) \
			-m $(shell python$*-dbg-config --configdir) \
			-l /usr/include/python$*$(if $(filter 3.%, $*),dm,_d) \
			-d /usr/lib/python$*/dist-packages \
			--sip-incdir /usr/include/python$*$(if $(filter 3.%, $*),dm,_d) \
			--debug --no-designer-plugin --no-qml-plugin --no-tools
	sed -i '/strip/d' dbg-build-$*/*/Makefile
	sed -i 's/-isystem/-I/' dbg-build-$*/*/Makefile
	touch $@


build: build-arch build-indep
build-arch: $(ALLPYTHONS:%=build-%/build-stamp) $(ALLPYTHONS:%=dbg-build-%/build-stamp)
build-indep: build-$(DEFAULT_PYTHON)/build-stamp

build-%/build-stamp: build-%/configure-stamp
	dh_testdir
	dh_auto_build --parallel -B build-$*
	touch $@

dbg-build-%/build-stamp: dbg-build-%/configure-stamp
	dh_testdir
	dh_auto_build --parallel -B dbg-build-$*
	touch $@

install-indep: build-indep
	dh_testdir
	dh_testroot
	dh_prep -i
	dh_installdirs -i
	dh_install -i --fail-missing
	dh_installexamples -Xactiveqt -i
	# Use python3 shebangs and regenerate resource files
	cd $(CURDIR)/debian/pyqt5-examples/usr/share/doc/pyqt5-examples/examples/; \
		cp /usr/share/javascript/jquery/jquery.min.js webkit/fancybrowser/; \
		find . -name '*.py' -exec sed -i 's/\/env python/\/python3/g' {} +; \
		find . -name '*.qrc' | sed 's/\.qrc//g' | xargs -I {} \
		$(CURDIR)/build-$(DEFAULT_PYTHON)/pyrcc/pyrcc5 {}.qrc -o {}_rc.py
	# Symlink duplicate files in examples. Based on Andrew Starr-Bochicchio's
	# code in ubuntu-packaging-guide.
	cd $(CURDIR)/debian/pyqt5-examples && \
	fdupes -r1nq usr/share/doc/pyqt5-examples/examples | while read s; do \
		set -- $$(echo $$s | tr ' ' '\n' | sort); \
		f=$$1; shift; for d; do \
			echo "symlinking identical file $$d to $$f"; \
			rm $$d; ln -s /$$f $$d; \
		done; \
	done
	dh_link -i

install-arch: build-arch
	dh_testdir
	dh_testroot
	dh_prep -a
	dh_installdirs -a
	# This is needed to enforce that the install-arch-% rules are
	# not run in parallel. Both rules install into the same directory,
	# and therefore might try to access the same files at the same time.
	# Therefore, instead of depending on the install-arch-% rules,
	# we invoke them explicitly.
	for p in $(ALLPYTHONS) ; do \
		$(MAKE) -f debian/rules install-arch-$$p;\
	done

	dh_install -a --fail-missing

	find debian/python*-dbg ! -type d \
		! \( -name '*.so' -o -name '*config_*d*.py' \) | xargs rm -f

	for i in $$(find debian/python-*-dbg -name '*.so'); do \
		b=$$(basename $$i .so); \
		mv $$i $$(dirname $$i)/$${b}_d.so; \
		done

d3_qt5_dbg = debian/python3-pyqt5-dbg

install-arch-3.%:
	$(MAKE) -C build-3.$* install INSTALL_ROOT=$(CURDIR)/debian/tmp DESTDIR=$(CURDIR)/debian/tmp
	$(MAKE) -C dbg-build-3.$* install INSTALL_ROOT=$(CURDIR)/$(d3_qt5_dbg) DESTDIR=$(CURDIR)/$(d3_qt5_dbg)
	rm -rf $(CURDIR)/debian/tmp/usr/share/sip

	mkdir -p $(CURDIR)/debian/python3-dbus.mainloop.pyqt5/usr/lib/python3.$*/dist-packages/dbus/mainloop; \
	mv $(CURDIR)/debian/tmp$(py3_dbusmoddir)/pyqt5.so \
	   $(CURDIR)/debian/python3-dbus.mainloop.pyqt5/usr/lib/python3.$*/dist-packages/dbus/mainloop; \

	mkdir -p $(CURDIR)/debian/python3-dbus.mainloop.pyqt5-dbg/usr/lib/python3.$*/dist-packages/dbus/mainloop; \
	mv $(CURDIR)/debian/python3-pyqt5-dbg$(py3_dbusmoddir)/pyqt5.so \
	   $(CURDIR)/debian/python3-dbus.mainloop.pyqt5-dbg/usr/lib/python3.$*/dist-packages/dbus/mainloop; \

	# Don't initiate the uic/widget-plugins
	touch $(CURDIR)/debian/tmp/usr/lib/python3.$*/dist-packages/PyQt5/uic/widget-plugins/.noinit
	for module in opengl sql webkit websockets xmlpatterns svg multimedia quick serialport sensors x11extras positioning; do \
		mkdir -p debian/python3-pyqt5.qt$$module-dbg/usr/lib/python3.$*/dist-packages/PyQt5; \
	done
	mkdir -p debian/python3-pyqt5.enginio-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/Enginio.so \
		debian/python3-pyqt5.enginio-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/*OpenGL*.so \
		debian/python3-pyqt5.qtopengl-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtSql.so \
		debian/python3-pyqt5.qtsql-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtWebKit*.so \
		debian/python3-pyqt5.qtwebkit-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtWebSockets.so \
		debian/python3-pyqt5.qtwebsockets-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtXmlPatterns.so \
		debian/python3-pyqt5.qtxmlpatterns-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtSvg.so \
		debian/python3-pyqt5.qtsvg-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtMultimedia*.so \
		debian/python3-pyqt5.qtmultimedia-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtQml.so \
	   $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtQuick*.so \
		debian/python3-pyqt5.qtquick-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtSerialPort.so \
		debian/python3-pyqt5.qtserialport-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtSensors.so \
		debian/python3-pyqt5.qtsensors-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtX11Extras.so \
		debian/python3-pyqt5.qtx11extras-dbg/usr/lib/python3.$*/dist-packages/PyQt5
	mv $(d3_qt5_dbg)/usr/lib/python3.$*/dist-packages/PyQt5/QtPositioning.so \
		debian/python3-pyqt5.qtpositioning-dbg/usr/lib/python3.$*/dist-packages/PyQt5

d_qt5_dbg = debian/python-pyqt5-dbg

install-arch-2.%:
	$(MAKE) -C build-2.$* install INSTALL_ROOT=$(CURDIR)/debian/tmp DESTDIR=$(CURDIR)/debian/tmp
	$(MAKE) -C dbg-build-2.$* install INSTALL_ROOT=$(CURDIR)/$(d_qt5_dbg) DESTDIR=$(CURDIR)/$(d_qt5_dbg)
	rm -rf $(CURDIR)/debian/tmp/usr/share/sip

	mkdir -p $(CURDIR)/debian/python-dbus.mainloop.pyqt5/usr/lib/python2.$*/dist-packages/dbus/mainloop; \
	mv $(CURDIR)/debian/tmp$(py_dbusmoddir)/pyqt5.so \
	   $(CURDIR)/debian/python-dbus.mainloop.pyqt5/usr/lib/python2.$*/dist-packages/dbus/mainloop; \

	mkdir -p $(CURDIR)/debian/python-dbus.mainloop.pyqt5-dbg/usr/lib/python2.$*/dist-packages/dbus/mainloop; \
	mv $(CURDIR)/debian/python-pyqt5-dbg$(py_dbusmoddir)/pyqt5.so \
	   $(CURDIR)/debian/python-dbus.mainloop.pyqt5-dbg/usr/lib/python2.$*/dist-packages/dbus/mainloop; \

	# Don't initiate the uic/widget-plugins
	touch $(CURDIR)/debian/tmp/usr/lib/python2.$*/dist-packages/PyQt5/uic/widget-plugins/.noinit
	for module in opengl sql webkit websockets xmlpatterns svg multimedia quick serialport sensors x11extras positioning; do \
		mkdir -p debian/python-pyqt5.qt$$module-dbg/usr/lib/python2.$*/dist-packages/PyQt5; \
	done
	mkdir -p debian/python-pyqt5.enginio-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/Enginio.so \
		debian/python-pyqt5.enginio-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/*OpenGL*.so \
		debian/python-pyqt5.qtopengl-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtSql.so \
		debian/python-pyqt5.qtsql-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtWebKit*.so \
		debian/python-pyqt5.qtwebkit-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtWebSockets.so \
		debian/python-pyqt5.qtwebsockets-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtXmlPatterns.so \
		debian/python-pyqt5.qtxmlpatterns-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtSvg.so \
		debian/python-pyqt5.qtsvg-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtMultimedia*.so \
		debian/python-pyqt5.qtmultimedia-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtQml.so \
	   $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtQuick*.so \
		debian/python-pyqt5.qtquick-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtSerialPort.so \
		debian/python-pyqt5.qtserialport-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtSensors.so \
		debian/python-pyqt5.qtsensors-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtX11Extras.so \
		debian/python-pyqt5.qtx11extras-dbg/usr/lib/python2.$*/dist-packages/PyQt5
	mv $(d_qt5_dbg)/usr/lib/python2.$*/dist-packages/PyQt5/QtPositioning.so \
		debian/python-pyqt5.qtpositioning-dbg/usr/lib/python2.$*/dist-packages/PyQt5
clean:
	dh_testdir
	dh_testroot
	rm -rf $(ALLPYTHONS:%=build-%) $(ALLPYTHONS:%=dbg-build-%)
	find . -type d -name __pycache__ | xargs rm -rf
	cd sip; rm -rf Qt opengl_types.sip pyqt-gpl.sip5
	rm -f examples/quick/tutorials/extending/chapter6-plugins/Charts/qmldir
	dh_clean

# Must not depend on anything. This is to be called by
# binary-arch/binary-indep
# in another 'make' thread.
binary-common:
	dh_testdir
	dh_testroot
	dh_installman
	dh_installchangelogs NEWS
	dh_installdocs
ifeq (,$(findstring -a, $(DH_OPTIONS)))
	sphinx-build $(CURDIR)/doc/sphinx \
	$(CURDIR)/debian/pyqt5-doc/usr/share/doc/pyqt5-doc/html
	dh_sphinxdoc
endif
	dh_sip
	dh_sip3
ifeq (,$(findstring -i, $(DH_OPTIONS)))
	DH_OPTIONS= dh_strip -ppyqt5-dev-tools
	set -e; \
	for p in python3-pyqt5 python3-pyqt5.enginio \
	  python3-pyqt5.qtopengl python3-pyqt5.qtsql \
	  python3-pyqt5.qtwebkit python3-pyqt5.qtwebsockets \
	  python3-pyqt5.qtmultimedia \
	  python3-pyqt5.qtsvg python3-pyqt5.qtxmlpatterns \
	  python3-pyqt5.qtquick python3-pyqt5.qtserialport \
	  python3-pyqt5.qtsensors python3-pyqt5.qtx11extras \
	  python3-pyqt5.qtpositioning python3-dbus.mainloop.pyqt5 \
	  python-pyqt5 python-pyqt5.enginio \
	  python-pyqt5.qtopengl python-pyqt5.qtsql \
	  python-pyqt5.qtwebkit python-pyqt5.qtwebsockets \
	  python-pyqt5.qtmultimedia \
	  python-pyqt5.qtsvg python-pyqt5.qtxmlpatterns \
	  python-pyqt5.qtquick python-pyqt5.qtserialport \
	  python-pyqt5.qtsensors python-pyqt5.qtx11extras \
	  python-pyqt5.qtpositioning python-dbus.mainloop.pyqt5; do \
		DH_OPTIONS= dh_strip -p$$p --dbg-package=$$p-dbg; \
		rm -rf debian/$$p-dbg/usr/share/doc/$$p-dbg; \
		mkdir -p debian/$$p-dbg/usr/share/doc; \
		ln -s $$p debian/$$p-dbg/usr/share/doc/$$p-dbg; \
	done
endif
	dh_python2 --no-dbg-cleaning -N pyqt5-dev-tools -N pyqt5-examples
	rm -rf $(CURDIR)/debian/python-pyqt5/usr/lib/python2.7/dist-packages/PyQt5/uic/port_v3
	rm -rf $(CURDIR)/debian/python-pyqt5-dbg/usr/bin
	rm -rf $(CURDIR)/debian/python-pyqt5-dbg/usr/share/sip
	rm -rf $(CURDIR)/debian/python-pyqt5-dbg/usr/lib/python2.7/dist-packages/PyQt5/uic
	rm -rf $(CURDIR)/debian/python-pyqt5-dbg/usr/lib/python2.7/dist-packages/dbus
	dh_python3 --no-dbg-cleaning -N pyqt5-dev-tools -N pyqt5-examples
	rm -rf $(CURDIR)/debian/python3-pyqt5/usr/lib/python3/dist-packages/PyQt5/uic/port_v2
	rm -rf $(CURDIR)/debian/python3-pyqt5-dbg/usr/bin
	rm -rf $(CURDIR)/debian/python3-pyqt5-dbg/usr/share/sip
	rm -rf $(CURDIR)/debian/python3-pyqt5-dbg/usr/lib/python3/dist-packages/PyQt5/uic
	rm -rf $(CURDIR)/debian/python3-pyqt5-dbg/usr/lib/python3/dist-packages/dbus
	rm -rf $(CURDIR)/debian/pyqt5-examples/usr/share/doc/pyqt5-examples/examples/webkit/googlechat
	rm -rf $(CURDIR)/debian/pyqt5-examples/usr/share/doc/pyqt5-examples/examples/designer/plugins/python/__pycache__
	rm -rf $(CURDIR)/debian/pyqt5-examples/usr/share/doc/pyqt5-examples/examples/designer/plugins/widgets/__pycache__
	dh_fixperms
	dh_compress -X/examples
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb -- -Z xz

# Build architecture independant packages using the common target.
binary-indep: install-indep
	$(MAKE) -f debian/rules DH_OPTIONS="-i ${EXTRA_DH_OPTIONS}" binary-common

# Build architecture dependant packages using the common target.
binary-arch: install-arch
	$(MAKE) -f debian/rules DH_OPTIONS="-a ${EXTRA_DH_OPTIONS}" binary-common


binary: binary-arch binary-indep

get-orig-source:
	uscan --verbose --download-current-version

.PHONY: build-indep build-arch build clean binary-indep binary-arch binary configure get-orig-source
