#!/usr/bin/make -f

DEB_SOURCE_PACKAGE := $(strip $(shell egrep '^Source: ' debian/control | cut -f 2 -d ':'))
DEB_VERSION := $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ')
DEB_NOEPOCH_VERSION := $(shell echo $(DEB_VERSION) | cut -d: -f2-)
DEB_UPSTREAM_VERSION := $(shell echo $(DEB_NOEPOCH_VERSION) | sed 's/-[^-]*$$//')
DEB_STRIPPED_UPSTREAM_VERSION = $(shell echo $(DEB_UPSTREAM_VERSION) | sed -e 's/\+dfsg.*$$//p')

FENICS_RELEASE_VERSION=$(DEB_STRIPPED_UPSTREAM_VERSION)
FENICS_MAJOR_VERSION=$(shell echo $(FENICS_RELEASE_VERSION) | sed "s/^\([^.]*\)\..*$$/\1/")
FENICS_MINOR_VERSION=$(shell echo $(FENICS_RELEASE_VERSION) | sed "s/^\([^.]*\)\.\([^.]*\)\..*$$/\2/")
FENICS_VERSION=$(FENICS_MAJOR_VERSION).$(FENICS_MINOR_VERSION)
FENICS_NEXT_VERSION=$(FENICS_MAJOR_VERSION).$(shell echo $$(( $(FENICS_MINOR_VERSION) + 1 )) )

# Allow test programs that uses OpenMPI to run
export OMPI_MCA_plm_rsh_agent=/bin/false

DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
DEB_BUILD_MULTIARCH ?= $(shell dpkg-architecture -qDEB_BUILD_MULTIARCH)

# Disable MPI on lam architectures
include /usr/share/mpi-default-dev/debian_defaults
ifeq ($(findstring $(DEB_BUILD_ARCH),$(OPENMPI_ARCHITECTURES)),)
ENABLE_MPI=OFF
else
ENABLE_MPI=ON
endif

BUILDDIR = $(CURDIR)/debian/build
DOLFIN_HOME = $(CURDIR)/$(DEB_SRCDIR)
USCAN_DESTDIR := $(CURDIR)
PY2VERS := $(shell pyversions --requested debian/control | tac -s' ')
PY3VERS := $(shell py3versions --requested debian/control | tac -s' ')
PYVERS = $(PY3VERS) $(PY2VERS)

# extract PETSc version from petsc-dev
PETSC_DEB_VERSION=$(shell dpkg -s petsc-dev | awk '/Version:/ {print $2}')
# extract the current PETSc version
PETSC_UPSTREAM_VERSION=$(shell pkg-config --modversion PETSc)
# "Major" version is the first number in the upstream version (major.minor.release)
PETSC_MAJOR_VERSION=$(shell echo $(PETSC_UPSTREAM_VERSION) | sed "s/^\([^.]*\)\..*$$/\1/")
# "Minor" version is the second number in the upstream version (major.minor.release)
PETSC_MINOR_VERSION=$(shell echo $(PETSC_UPSTREAM_VERSION) | sed "s/^\([^.]*\)\.\([^.]*\)\..*$$/\2/")
PETSC_VERSION=$(PETSC_MAJOR_VERSION).$(PETSC_MINOR_VERSION)
PETSC_VERSION_NEXT=$(shell echo $(PETSC_MAJOR_VERSION).$$(($(PETSC_MINOR_VERSION)+1)))

SLEPC_UPSTREAM_VERSION=$(shell pkg-config --modversion SLEPc)

PETSC_DIR=/usr/lib/petscdir/$(PETSC_VERSION)-real
# SLEPc version must match PETSc
SLEPSC_DIR=/usr/lib/slepcdir/$(PETSC_VERSION)-real

CMAKE_OPTS := \
	-D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo \
	-D BUILD_SHARED_LIBS:BOOL=ON \
	-D CMAKE_SKIP_RPATH:BOOL=ON \
	-D CMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=OFF \
	-D DOLFIN_ENABLE_TRILINOS:BOOL=OFF \
	-D DOLFIN_ENABLE_HDF5:BOOL=ON \
	-D HDF5_C_COMPILER_EXECUTABLE:FILEPATH=/usr/bin/h5pcc \
	-D DOLFIN_ENABLE_QT:BOOL=OFF \
	-D DOLFIN_ENABLE_PARMETIS:BOOL=OFF \
	-D DOLFIN_ENABLE_PASTIX:BOOL=OFF \
	-D DOLFIN_ENABLE_SCOTCH:BOOL=ON \
	-D DOLFIN_ENABLE_PETSC4PY:BOOL=ON \
	-D DOLFIN_ENABLE_SLEPC4PY:BOOL=ON \
	-D DOLFIN_ENABLE_SPHINX:BOOL=OFF \
	-D DOLFIN_ENABLE_DOCS:BOOL=OFF \
	-D DOLFIN_ENABLE_UNIT_TESTS:BOOL=OFF \
	-D SWIG_EXECUTABLE:FILEPATH=/usr/bin/swig \
	-D DOLFIN_ENABLE_MPI:BOOL=$(ENABLE_MPI) \
	-D PETSC_DIR:PATH=$(PETSC_DIR) \
	-D SLEPC_DIR:PATH=$(SLEPSC_DIR) \
	-D DOLFIN_LIB_DIR:PATH=lib/$(DEB_BUILD_MULTIARCH) \
	-D DOLFIN_PKGCONFIG_DIR:PATH=lib/$(DEB_BUILD_MULTIARCH)/pkgconfig \
	-D CMAKE_CXX_FLAGS:STRING="-fpermissive" \
	$(DOLFIN_HOME)

%:
	dh $@ --buildsystem=cmake --with python2,python3

override_dh_compress:
	dh_compress -X.py -X.cpp -X.h -X.pdf -X.ufl

override_dh_auto_clean:
	for v in $(PYVERS); do \
	    dh_auto_clean --builddirectory=$(BUILDDIR)-$$v; \
	done

override_dh_auto_configure:
	for v in $(PYVERS); do \
	    if [ "$$v" = "python2.7" ]; then \
	        dh_auto_configure --builddirectory=$(BUILDDIR)-$$v -- \
	           -D PYTHON_EXECUTABLE:FILEPATH=/usr/bin/$$v \
	           -D DOLFIN_USE_PYTHON3:BOOL=OFF \
	           -- $(CMAKE_OPTS) ;\
	    else \
	        dh_auto_configure --builddirectory=$(BUILDDIR)-$$v -- \
	           -D PYTHON_EXECUTABLE:FILEPATH=/usr/bin/$$v \
	           -D DOLFIN_USE_PYTHON3:BOOL=ON \
	           -- $(CMAKE_OPTS) ;\
	    fi; \
	done

override_dh_auto_build:
	for v in $(PYVERS); do \
	   $$v cmake/scripts/generate-swig-interface.py; \
	   dh_auto_build --builddirectory=$(BUILDDIR)-$$v; \
	done

override_dh_auto_install:
	for v in $(PYVERS); do \
	   $$v cmake/scripts/generate-swig-interface.py; \
	   dh_auto_install --builddirectory=$(BUILDDIR)-$$v; \
	done
	dh_numpy
	dh_numpy3
	sed -i "s/-D_FORTIFY_SOURCE=2//g" $(CURDIR)/debian/tmp/usr/lib/$(DEB_BUILD_MULTIARCH)/pkgconfig/dolfin.pc
	sed -i "s|-DNDEBUG||g" $(CURDIR)/debian/tmp/usr/lib/$(DEB_BUILD_MULTIARCH)/pkgconfig/dolfin.pc

override_dh_auto_test:
	for v in $(PYVERS); do \
	   dh_auto_test --builddirectory=$(BUILDDIR)-$$v; \
	done

# set petsc:Depends to something like "libpetsc3.7.5-dev, libslepc3.7.3-dev, python-petsc4py (>= 3.7), python-petsc4py (<<3.8), python-slepc4py (>= 3.7), python-slepc4py (<<3.8)"
PETSC_DEV_DEPENDS="libpetsc$(PETSC_UPSTREAM_VERSION)-dev, libslepc$(SLEPC_UPSTREAM_VERSION)-dev"
# slepc4py version must match petsc4py (using the PETSc minor version, not the patch release)
PETSC4PY_DEPENDS=python-petsc4py (>= $(PETSC_VERSION)), python-petsc4py (<< $(PETSC_VERSION_NEXT)), python-slepc4py (>= $(PETSC_VERSION)), python-slepc4py (<< $(PETSC_VERSION_NEXT))
PETSC4PY_DEPENDS_PY3=python3-petsc4py (>= $(PETSC_VERSION)), python3-petsc4py (<< $(PETSC_VERSION_NEXT)), python3-slepc4py (>= $(PETSC_VERSION)), python3-slepc4py (<< $(PETSC_VERSION_NEXT))
PETSC4PY_DEPENDS_ALT=python-petsc4py (>= $(PETSC_VERSION)) | python3-petsc4py (>= $(PETSC_VERSION)), python-petsc4py (<< $(PETSC_VERSION_NEXT)) | python3-petsc4py (<< $(PETSC_VERSION_NEXT)), python-slepc4py (>= $(PETSC_VERSION)) | python3-slepc4py (>= $(PETSC_VERSION)), python-slepc4py (<< $(PETSC_VERSION_NEXT)) | python3-slepc4py (<< $(PETSC_VERSION_NEXT))
override_dh_gencontrol:
	# We have a tight dependency on swig - #675207
	set -e; \
	swig_version=$$(dpkg-query -W swig3.0 | cut -f 2 | cut -d- -f 1); \
	next_swig_version="$${swig_version%.*}.$$(($${swig_version##*.} + 1))"; \
	echo "swig:Depends=swig3.0 (>= $$swig_version), swig3.0 (<< $$next_swig_version~)" >> debian/python-dolfin.substvars
	echo "python-petsc4py:Depends=$(PETSC4PY_DEPENDS)" >> debian/python-dolfin.substvars
	echo "python3-petsc4py:Depends=$(PETSC4PY_DEPENDS_PY3)" >> debian/python3-dolfin.substvars
	echo "python-petsc4py-alt:Depends=$(PETSC4PY_DEPENDS_ALT)" >> debian/libdolfin-dev.substvars
	dh_gencontrol -- -Vpetsc:Depends=$(PETSC_DEV_DEPENDS) -Vfenics:Upstream-Version=$(FENICS_VERSION) -Vfenics:Next-Upstream-Version=$(FENICS_NEXT_VERSION)~

override_dh_strip:
	dh_strip --package=libdolfin$(FENICS_VERSION) --dbgsym-migration='libdolfin2017.2-dbg (<< 2017.2.0.post0-1~)' -Xpython
	dh_strip --package=python-dolfin --dbgsym-migration='python-dolfin-dbg (<< 2017.2.0.post0-1~)' -Xpython3
	dh_strip --package=python3-dolfin --dbgsym-migration='python3-dolfin-dbg (<< 2017.2.0.post0-1~)' -Xpython2

override_dh_installman:
	dh_installman


.PHONY: get-orig-source override_dh_strip
get-orig-source:
	uscan --force-download --verbose --destdir $(USCAN_DESTDIR)
