#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1

# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/*
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/default.mk

# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all

# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed

# Overriding this with "contrib" attempts to link with parmetis (unimplemented).
DEBIAN_DIST=main

DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)

# On Alpha, override this with debian/rules PETSC_ARCH=linux_alpha_dec binary
# to build PETSc libs with the Compaq compilers, though that requires at least:
# libots, cpml-ev(5|6), cxml-ev(5|6), cfal and ccc.
# Note that only arch-dependent .debs are generated when you do this.
PETSC_ARCH=$(DEB_HOST_MULTIARCH)

# This defines the MPI implementation to use.  The easiest way to override this
# default is to specify while building, e.g. debian/rules PETSC_MPI=lam binary.
# Again, only arch-dependent .debs are generated when you do this.
# Note that as of PETSc 2.3.0 this only specifies the name of the PETSc
# packages, the implementation is chosen by BuildSystem according to what's
# available at build time.
include /usr/share/mpi-default-dev/debian_defaults
PETSC_MPI=$(ARCH_DEFAULT_MPI_IMPL)
PETSC_MPI_DIR=/usr/lib/$(PETSC_MPI)

# facilitate build-time testing (invoking OpenMPI) when building in a chroot (pbuilder or sbuild)
export OMPI_MCA_plm_rsh_agent=/bin/false

PETSC_HDF5_FLAGS=$(shell if [ -e /usr/lib/libhdf5.so ]; then echo "--with-hdf5=1 --with-hdf5-dir=/usr"; fi)

PETSC_BUILD_DIR=$(PETSC_ARCH)-real
PETSC_DEBUG_BUILD_DIR=$(PETSC_ARCH)-real-debug
PETSC_COMPLEX_BUILD_DIR=$(PETSC_ARCH)-complex
PETSC_COMPLEX_DEBUG_BUILD_DIR=$(PETSC_ARCH)-complex-debug

# PETSC_VERSION is used for the package names, library sonames, and
# /usr/lib/petscdir subdirectory names.
PETSC_VERSION=3.6.2$(PETSC_EXT)
# use only major.minor as general soname (rather than major.minor.patch.build)
PETSC_SONAME_VERSION=$(shell echo $(PETSC_VERSION) | awk 'BEGIN { FS="."}; {print $$1"."$$2 }')

# PETSC_NAME is the install dir under /usr/lib and the base for package names
PETSC_SONAME=petsc$(PETSC_SONAME_VERSION)
PETSC_NAME=petsc$(PETSC_VERSION)
PETSC_COMPLEX_SONAME=petsc-complex-$(PETSC_SONAME_VERSION)
PETSC_COMPLEX_NAME=petsc-complex-$(PETSC_VERSION)

# debian binary package names
PETSC_DEV_PACKAGE=$(PETSC_NAME)-dev
PETSC_VERSIONED_DEV_PACKAGE=lib$(PETSC_NAME)-dev
PETSC_VERSIONED_PACKAGE=lib$(PETSC_SONAME)
PETSC_DEBUG_PACKAGE=lib$(PETSC_NAME)-dbg
PETSC_DOC_PACKAGE=$(PETSC_NAME)-doc
PETSC_COMPLEX_VERSIONED_DEV_PACKAGE=lib$(PETSC_COMPLEX_NAME)-dev
PETSC_COMPLEX_VERSIONED_PACKAGE=lib$(PETSC_COMPLEX_SONAME)
PETSC_COMPLEX_DEBUG_PACKAGE=lib$(PETSC_COMPLEX_NAME)-dbg

# install into /usr/lib/petscdir rather than /usr/lib/petsc 
# to allow /usr/lib/petsc to be configured by alternatives
PETSC_DIR_PREFIX=/usr/lib/petscdir/$(PETSC_VERSION)/$(PETSC_ARCH)-real
PETSC_DIR_DEBUG_PREFIX=/usr/lib/petscdir/$(PETSC_VERSION)/$(PETSC_ARCH)-real-debug
PETSC_COMPLEX_DIR_PREFIX=/usr/lib/petscdir/$(PETSC_VERSION)/$(PETSC_ARCH)-complex
PETSC_COMPLEX_DEBUG_DIR_PREFIX=/usr/lib/petscdir/$(PETSC_VERSION)/$(PETSC_ARCH)-complex-debug

PACKAGE_INSTALL_BASEDIR=debian/tmp/$(PETSC_NAME)-real
PACKAGE_INSTALL_DIR=$(PACKAGE_INSTALL_BASEDIR)/$(PETSC_DIR_PREFIX)
PACKAGE_DEBUG_INSTALL_BASEDIR=debian/tmp/$(PETSC_NAME)-real-debug
PACKAGE_DEBUG_INSTALL_DIR=$(PACKAGE_DEBUG_INSTALL_BASEDIR)/$(PETSC_DIR_DEBUG_PREFIX)
PACKAGE_COMPLEX_INSTALL_BASEDIR=debian/tmp/$(PETSC_NAME)-complex
PACKAGE_COMPLEX_INSTALL_DIR=$(PACKAGE_COMPLEX_INSTALL_BASEDIR)/$(PETSC_COMPLEX_DIR_PREFIX)
PACKAGE_COMPLEX_DEBUG_INSTALL_BASEDIR=debian/tmp/$(PETSC_NAME)-complex-debug
PACKAGE_COMPLEX_DEBUG_INSTALL_DIR=$(PACKAGE_COMPLEX_DEBUG_INSTALL_BASEDIR)/$(PETSC_COMPLEX_DEBUG_DIR_PREFIX)

CONFIGURATION_OPTIONS=--with-shared-libraries \
	  --useThreads 0 \
	  --with-fortran-interfaces=1 \
	  --with-mpi-dir=$(PETSC_MPI_DIR) \
	  --with-blas-lib=-lblas --with-lapack-lib=-llapack \
	  --with-blacs=1 --with-blacs-lib="-lblacsCinit-$(PETSC_MPI) -lblacs-$(PETSC_MPI)" \
	  --with-scalapack=1 --with-scalapack-lib=-lscalapack-$(PETSC_MPI) \
	  --with-mumps=1 --with-mumps-include=[] --with-mumps-lib="-ldmumps -lzmumps -lsmumps -lcmumps -lmumps_common -lpord" \
	  --with-suitesparse=1 --with-suitesparse-include=/usr/include/suitesparse --with-suitesparse-lib="-lumfpack -lamd -lcholmod -lklu" \
	  --with-spooles=1 --with-spooles-include=/usr/include/spooles --with-spooles-lib=-lspooles \
	  --with-ptscotch=1 --with-ptscotch-include=/usr/include/scotch --with-ptscotch-lib="-lptesmumps -lptscotch -lptscotcherr" \
	  --with-fftw=1 --with-fftw-include=[] --with-fftw-lib="-lfftw3 -lfftw3_mpi" \
	  --with-superlu=1 --with-superlu-include=/usr/include/superlu --with-superlu-lib=-lsuperlu \
	  $(PETSC_HDF5_FLAGS) --CXX_LINKER_FLAGS="-Wl,--no-as-needed"


# main packaging script based on dh7 syntax
%:
	dh $@ --with python2


override_dh_auto_clean:
	if [ -d $(PETSC_DEBUG_BUILD_DIR) ]; then \
	  dh_auto_clean -p$(PETSC_DEBUG_PACKAGE) -- \
	    PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_DEBUG_BUILD_DIR); \
	fi
	if [ -d $(PETSC_BUILD_DIR) ]; then \
	dh_auto_clean -p$(PETSC_VERSIONED_DEV_PACKAGE) -- \
	  PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_BUILD_DIR); \
	fi
	if [ -d $(PETSC_COMPLEX_BUILD_DIR) ]; then \
	dh_auto_clean -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE) -- \
	  PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_BUILD_DIR); \
	fi
	if [ -d $(PETSC_COMPLEX_DEBUG_BUILD_DIR) ]; then \
	dh_auto_clean -p$(PETSC_COMPLEX_DEBUG_PACKAGE) -- \
	  PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_DEBUG_BUILD_DIR); \
	fi


override_dh_auto_configure:
	dh_auto_configure -p$(PETSC_DEBUG_PACKAGE) --  \
          --with-debugging=1  \
          --shared-library-extension=_real \
          --with-hypre=1 --with-hypre-dir=/usr --with-clanguage=C++ --with-c-support \
          $(CONFIGURATION_OPTIONS)  \
          --prefix=$(PETSC_DIR_DEBUG_PREFIX)  \
          PETSC_DIR=$(CURDIR) --PETSC_ARCH=$(PETSC_DEBUG_BUILD_DIR) \
            CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" \
            FCFLAGS="$(FCFLAGS)"  FFLAGS="$(FFLAGS)"  \
            CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" MAKEFLAGS="$(MAKEFLAGS)"
	dh_auto_configure -p$(PETSC_VERSIONED_DEV_PACKAGE) --  \
          --with-debugging=0  \
          --shared-library-extension=_real \
          --with-hypre=1 --with-hypre-dir=/usr --with-clanguage=C++ --with-c-support \
          $(CONFIGURATION_OPTIONS)  \
          --prefix=$(PETSC_DIR_PREFIX)  \
          PETSC_DIR=$(CURDIR) --PETSC_ARCH=$(PETSC_BUILD_DIR) \
            CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" \
            FCFLAGS="$(FCFLAGS)"  FFLAGS="$(FFLAGS)"  \
            CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" MAKEFLAGS="$(MAKEFLAGS)"
	dh_auto_configure -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE) --  \
          --with-debugging=0  \
          --with-scalar-type=complex --shared-library-extension=_complex \
          $(CONFIGURATION_OPTIONS)  \
          --prefix=$(PETSC_COMPLEX_DIR_PREFIX)  \
          PETSC_DIR=$(CURDIR) --PETSC_ARCH=$(PETSC_COMPLEX_BUILD_DIR) \
            CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" \
            FCFLAGS="$(FCFLAGS)"  FFLAGS="$(FFLAGS)"  \
            CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" MAKEFLAGS="$(MAKEFLAGS)"
	dh_auto_configure -p$(PETSC_COMPLEX_DEBUG_PACKAGE) --  \
          --with-debugging=1  \
          --with-scalar-type=complex --shared-library-extension=_complex \
          $(CONFIGURATION_OPTIONS)  \
          --prefix=$(PETSC_COMPLEX_DEBUG_DIR_PREFIX)  \
          PETSC_DIR=$(CURDIR) --PETSC_ARCH=$(PETSC_COMPLEX_DEBUG_BUILD_DIR) \
            CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" \
            FCFLAGS="$(FCFLAGS)"  FFLAGS="$(FFLAGS)"  \
            CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" MAKEFLAGS="$(MAKEFLAGS)"


override_dh_auto_build:
	dh_auto_build -p$(PETSC_DEBUG_PACKAGE) --  \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_DEBUG_BUILD_DIR)
	dh_auto_build -p$(PETSC_VERSIONED_DEV_PACKAGE)  --  \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_BUILD_DIR)
	dh_auto_build -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE)  --  \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_BUILD_DIR)
	dh_auto_build -p$(PETSC_COMPLEX_DEBUG_PACKAGE)  --  \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_DEBUG_BUILD_DIR)


override_dh_auto_test:
	dh_auto_test -p$(PETSC_DEBUG_PACKAGE) -- \
	  PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_DEBUG_BUILD_DIR) \
	  LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CURDIR)/$(PETSC_DEBUG_BUILD_DIR)/lib
	dh_auto_test -p$(PETSC_VERSIONED_DEV_PACKAGE) -- \
	  PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_BUILD_DIR) \
	  LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CURDIR)/$(PETSC_BUILD_DIR)/lib
	dh_auto_test -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE) -- \
	  PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_BUILD_DIR) \
	  LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CURDIR)/$(PETSC_COMPLEX_BUILD_DIR)/lib
	dh_auto_test -p$(PETSC_COMPLEX_DEBUG_PACKAGE) -- \
	  PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_DEBUG_BUILD_DIR) \
	  LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$(CURDIR)/$(PETSC_COMPLEX_DEBUG_BUILD_DIR)/lib


override_dh_auto_install:
	dh_auto_install -p$(PETSC_DEBUG_PACKAGE) --destdir=$(PACKAGE_DEBUG_INSTALL_DIR) --  \
          DESTDIR=$(PACKAGE_DEBUG_INSTALL_DIR)  \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_DEBUG_BUILD_DIR)
	dh_auto_install -p$(PETSC_VERSIONED_DEV_PACKAGE) --destdir=$(PACKAGE_INSTALL_DIR) --  \
          DESTDIR=$(PACKAGE_INSTALL_DIR) \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_BUILD_DIR)
	dh_auto_install -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE) --destdir=$(PACKAGE_COMPLEX_INSTALL_DIR) --  \
          DESTDIR=$(PACKAGE_COMPLEX_INSTALL_DIR) \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_BUILD_DIR)
	dh_auto_install -p$(PETSC_COMPLEX_DEBUG_PACKAGE) --destdir=$(PACKAGE_COMPLEX_DEBUG_INSTALL_DIR) --  \
          DESTDIR=$(PACKAGE_COMPLEX_DEBUG_INSTALL_DIR) \
          PETSC_DIR=$(CURDIR) PETSC_ARCH=$(PETSC_COMPLEX_DEBUG_BUILD_DIR)


override_dh_install:
	dh_install -p$(PETSC_VERSIONED_PACKAGE) --sourcedir $(PACKAGE_INSTALL_BASEDIR) --exclude=*html  $(PETSC_DIR_PREFIX)/lib/libpetsc_real.so.$(PETSC_VERSION)  usr/lib/$(DEB_HOST_MULTIARCH)
	dh_install -p$(PETSC_VERSIONED_DEV_PACKAGE) --sourcedir $(PACKAGE_INSTALL_BASEDIR) --autodest --exclude=*html --exclude=libpetsc_real.so.$(PETSC_VERSION)  usr
	dh_link -p$(PETSC_VERSIONED_DEV_PACKAGE)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_real.so.$(PETSC_VERSION)  $(PETSC_DIR_PREFIX)/lib/libpetsc_real.so.$(PETSC_VERSION)
	dh_link -p$(PETSC_VERSIONED_PACKAGE)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_real.so.$(PETSC_VERSION)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_real.so.$(PETSC_SONAME_VERSION)
	dh_link -p$(PETSC_VERSIONED_DEV_PACKAGE)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_real.so.$(PETSC_VERSION)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_real.so
	
	dh_install -p$(PETSC_DEBUG_PACKAGE) --sourcedir $(PACKAGE_DEBUG_INSTALL_BASEDIR) --autodest --exclude=*html  usr
	
	dh_install -p$(PETSC_COMPLEX_VERSIONED_PACKAGE) --sourcedir $(PACKAGE_COMPLEX_INSTALL_BASEDIR) --exclude=*html  $(PETSC_COMPLEX_DIR_PREFIX)/lib/libpetsc_complex.so.$(PETSC_VERSION)  usr/lib/$(DEB_HOST_MULTIARCH)
	dh_install -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE) --sourcedir $(PACKAGE_COMPLEX_INSTALL_BASEDIR) --autodest --exclude=*html --exclude=libpetsc_complex.so.$(PETSC_VERSION)  usr
	dh_link -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_complex.so.$(PETSC_VERSION)  $(PETSC_COMPLEX_DIR_PREFIX)/lib/libpetsc_complex.so.$(PETSC_VERSION)
	dh_link -p$(PETSC_COMPLEX_VERSIONED_PACKAGE)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_complex.so.$(PETSC_VERSION)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_complex.so.$(PETSC_SONAME_VERSION)
	dh_link -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_complex.so.$(PETSC_VERSION)  usr/lib/$(DEB_HOST_MULTIARCH)/libpetsc_complex.so
	
	dh_install -p$(PETSC_COMPLEX_DEBUG_PACKAGE) --sourcedir $(PACKAGE_COMPLEX_DEBUG_INSTALL_BASEDIR) --autodest --exclude=*html  usr


override_dh_installdocs:
	dh_installdocs
	dh_install -p$(PETSC_DOC_PACKAGE) --sourcedir $(PACKAGE_DEBUG_INSTALL_BASEDIR) --autodest $(PETSC_DIR_DEBUG_PREFIX)/include/*html
	dh_install -p$(PETSC_DOC_PACKAGE) --sourcedir $(PACKAGE_DEBUG_INSTALL_BASEDIR) --autodest $(PETSC_DIR_DEBUG_PREFIX)/include/petsc/*/*html


# dh_installchangelogs can't handle a directory of changelog files, so skip them here
override_dh_installchangelogs:
	dh_installchangelogs --exclude=docs/changes

override_dh_python2:
	dh_python2
	dh_python2 -p$(PETSC_VERSIONED_DEV_PACKAGE) $(PETSC_DIR_PREFIX)/bin
	dh_python2 -p$(PETSC_DEBUG_PACKAGE) $(PETSC_DIR_DEBUG_PREFIX)/bin
	dh_python2 -p$(PETSC_COMPLEX_VERSIONED_DEV_PACKAGE) $(PETSC_COMPLEX_DIR_PREFIX)/bin
	dh_python2 -p$(PETSC_COMPLEX_DEBUG_PACKAGE) $(PETSC_COMPLEX_DEBUG_DIR_PREFIX)/bin

override_dh_installdeb:
	dh_installdeb
	for pkg in $$(dh_listpackages -a); do \
	  sed -i -e 's/__PETSC_VERSION__/$(PETSC_VERSION)/; s/__DEB_HOST_MULTIARCH__/$(DEB_HOST_MULTIARCH)/' debian/$$pkg/DEBIAN/*; \
	done


override_dh_strip:
	dh_strip --dbg-package=$(PETSC_DEBUG_PACKAGE)
	dh_strip --dbg-package=$(PETSC_COMPLEX_DEBUG_PACKAGE)


DEB_SOURCE_PACKAGE = petsc
DEB_UPSTREAM_VERSION = $(shell dpkg-parsechangelog | sed -ne 's/^Version: \(.*\)-.*/\1/p')
DEB_STRIPPED_UPSTREAM_VERSION = $(shell echo $(DEB_UPSTREAM_VERSION) | sed -n -e 's/\.dfsg.*$$//p')
USCAN_DESTDIR := $(CURDIR)

get-orig-source:
	uscan --no-conf --download-current-version --repack --compression xz
