#!/usr/bin/make -f

DEB_PKG_DIR = $(abspath $(dir $(filter %rules, $(MAKEFILE_LIST))))
export DEB_PKG_VERSION = $(shell dpkg-parsechangelog -l$(DEB_PKG_DIR)/changelog -S Version)

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

ifneq (,$(wildcard src/Makefile.am))
DEB_PKG_LT_VERSION = $(shell sed -n -e '/^LIBTACHYON_LT_VERSION/s/LIBTACHYON_LT_VERSION[\t ]*=[\t ]*\([0-9]*:[0-9]*:[0-9]*\)[\t ]*$$/\1/p' src/Makefile.am)
else
DEB_PKG_LT_VERSION = 0
endif

DEB_VIRT_LIBTACHYON_LISTOF_VARIANT = serial mt-openmp mt-thr openmpi-openmp openmpi-thr openmpi mpich-openmp mpich-thr mpich
DEB_VIRT_LIBTACHYON_VARIANT_LISTOF_DHFILE = .symbols .install -dev.install
DEB_VIRT_LIBTACHYON_FLAVOUR_LISTOF_DHFILE = \
	$(DEB_VIRT_LIBTACHYON_VARIANT_LISTOF_DHFILE) .lintian-overrides .postinst .prerm -dev.postinst -dev.prerm
DEB_VIRT_TACHYON_LISTOF_VARIANT = nox ogl
DEB_VIRT_TACHYON_LISTOF_DHFILE = .install .manpages .postinst .prerm

# deduced variables
DEB_PKG_LT_CURRENT  := $(word 1, $(subst :, $(EMPTY), $(DEB_PKG_LT_VERSION)))
DEB_PKG_LT_REVISION := $(word 2, $(subst :, $(EMPTY), $(DEB_PKG_LT_VERSION)))
DEB_PKG_LT_AGE      := $(word 3, $(subst :, $(EMPTY), $(DEB_PKG_LT_VERSION)))
DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR = \
	$(sort $(foreach var, $(DEB_VIRT_LIBTACHYON_LISTOF_VARIANT), $(firstword $(subst -, $(EMPTY), $(var)))))
#

ifneq (,$(wildcard /usr/share/mpi-default-dev/debian_defaults))
include /usr/share/mpi-default-dev/debian_defaults
DEB_ARCH_DEFAULT_MPI_IMPL = $(ARCH_DEFAULT_MPI_IMPL)
DEB_ARCH_REVLISTOF_OPENMPI ?= $(strip $(OPENMPI_AVAILABLE_ARCHITECTURES))
else
DEB_ARCH_DEFAULT_MPI_IMPL = mpich
DEB_ARCH_REVLISTOF_OPENMPI ?= any
endif
DEB_ARCH_REVLISTOF_MPICH ?= any


## inspired from mpfr material
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
	CFLAGS += -O0
else ifeq ($(DEB_HOST_ARCH),alpha)
	CFLAGS += -mieee
else ifeq ($(DEB_HOST_ARCH),sha4)
	CFLAGS += -mieee
else
	CFLAGS := $(subst -O2,-O3,$(CFLAGS))
endif

CC_mt = gcc
CC_openmpi = mpicc.openmpi
CC_mpich = mpicc.mpich

default:
	@uscan --no-conf --dehs --report || true

%:
	dh $@  --with autoreconf --parallel

override_dh_auto_configure:
	$(foreach lf, $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR), \
		dh_auto_configure -B _build/$(lf) -- --srcdir=../.. --with-libflavour=$(lf) CFLAGS="$(CFLAGS)" CC=$(CC_$(lf)) ;\
		)

override_dh_auto_build-arch:
	$(foreach lf, $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR), dh_auto_build -a -B _build/$(lf) ;)

override_dh_auto_build-indep:
	$(MAKE) -C docs all

override_dh_auto_test-indep:
	true

override_dh_prep-arch:
	$(foreach lf, $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR), \
		$(foreach dhf, $(DEB_VIRT_LIBTACHYON_FLAVOUR_LISTOF_DHFILE), \
			sed \
					-e "s|@MULTIARCH@|$(DEB_HOST_MULTIARCH)|g" \
					-e "s|@LT_CURRENT@|$(DEB_PKG_LT_CURRENT)|g;s|@LT_REVISION@|$(DEB_PKG_LT_REVISION)|g;s|@LT_AGE@|$(DEB_PKG_LT_AGE)|g" \
					-e "s|@LIBFLAVOUR@|$(lf)|g" \
					-e "s|@LISTOF_LIBVARIANT@|$(filter $(lf)%, $(DEB_VIRT_LIBTACHYON_LISTOF_VARIANT))|g" \
					-e "s|@LISTOF_LIBVARIANTSONAME@|$(addsuffix $(DEB_PKG_LT_CURRENT), $(addprefix libtachyon-, $(filter $(lf)%, $(DEB_VIRT_LIBTACHYON_LISTOF_VARIANT))))|g" \
					-e "/##CaseTableOfLibraryPriorities##/r debian/templates/libtachyon-LIBFLAVOUR-casetableof_priority.rin" \
					-e "/##CaseTableOfLibraryPriorities##/d" \
				debian/templates/libtachyon-LIBFLAVOUR$(dhf).in > debian/libtachyon-$(lf)-$(DEB_PKG_LT_CURRENT)$(dhf) ;\
			) \
		)
	$(foreach lf, $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR), \
		$(foreach lv, $(filter $(lf)%, $(DEB_VIRT_LIBTACHYON_LISTOF_VARIANT)), \
			$(foreach dhf, $(DEB_VIRT_LIBTACHYON_VARIANT_LISTOF_DHFILE), \
				sed \
						-e "s|@MULTIARCH@|$(DEB_HOST_MULTIARCH)|g" \
						-e "s|@LT_CURRENT@|$(DEB_PKG_LT_CURRENT)|g;s|@LT_REVISION@|$(DEB_PKG_LT_REVISION)|g;s|@LT_AGE@|$(DEB_PKG_LT_AGE)|g" \
						-e "s|@LIBFLAVOUR@|$(lf)|g" \
						-e "s|@LIBVARIANT@|$(lv)|g" \
					debian/templates/libtachyon-LIBVARIANT$(dhf).in >> debian/libtachyon-$(lf)-$(DEB_PKG_LT_CURRENT)$(dhf) ;\
				) \
			) \
		)
	$(foreach vt, $(DEB_VIRT_TACHYON_LISTOF_VARIANT), \
		$(foreach dhf, $(DEB_VIRT_TACHYON_LISTOF_DHFILE), \
			sed -e "s|@VARIANT@|$(vt)|g" \
				debian/templates/tachyon-bin-VARIANT$(dhf).in > debian/tachyon-bin-$(vt)$(dhf) ;\
			) \
		)
	dh_prep -a

DEB_ADHOC_SCENES_ACTION_SH := debian/adhoc/scenes/action.sh
override_dh_prep-indep:
	sed -e "s+@DEB_VIRT_TACHYON_LISTOF_VARIANT@+$(subst $(EMPTY),\|,$(strip $(DEB_VIRT_TACHYON_LISTOF_VARIANT)))+" \
		$(DEB_ADHOC_SCENES_ACTION_SH).in > $(DEB_ADHOC_SCENES_ACTION_SH)
	chmod --reference $(DEB_ADHOC_SCENES_ACTION_SH).in $(DEB_ADHOC_SCENES_ACTION_SH)
	dh_prep -i

override_dh_auto_install-arch:
	$(foreach lf, $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR), dh_auto_install -a -B _build/$(lf) ;)

DEB_AUTO_INSTALL_MAKEFLAGS = TOPSRCDIR=$(CURDIR) DESTDIR=$(CURDIR)/debian/tmp
override_dh_auto_install-indep:
	$(MAKE) -C _build/$(lastword $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR))/src install-data-am $(DEB_AUTO_INSTALL_MAKEFLAGS)
	$(MAKE) -C docs install $(DEB_AUTO_INSTALL_MAKEFLAGS)
	$(MAKE) -C pkgextra/volpack/data install $(DEB_AUTO_INSTALL_MAKEFLAGS)
	$(MAKE) -C pkgextra/virtual-reality/graphics install $(DEB_AUTO_INSTALL_MAKEFLAGS)

override_dh_compress-indep:
	dh_compress -X.pdf -Xexamples

override_dh_shlibdeps-arch:
	dh_shlibdeps -a -l$(CURDIR)/debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH) -- --ignore-missing-info

DEB_VARNAME_LIBTACHYON_MPI_DEFAULT_DEV := default:libtachyon-mpi-dev
override_dh_gencontrol:
	dh_gencontrol -- -V$(DEB_VARNAME_LIBTACHYON_MPI_DEFAULT_DEV)=libtachyon-$(DEB_ARCH_DEFAULT_MPI_IMPL)-$(DEB_PKG_LT_CURRENT)-dev

override_dh_auto_clean-arch:
	dh_auto_clean -a
	rm -rf _build
	rm -f config_tachyon.h.in
	rm -f $(foreach vt, $(DEB_VIRT_TACHYON_LISTOF_VARIANT), $(foreach dhf, $(DEB_VIRT_TACHYON_LISTOF_DHFILE), debian/tachyon-bin-$(vt)$(dhf) ))
	rm -f $(foreach lf, $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR), $(foreach dhf, $(DEB_VIRT_LIBTACHYON_FLAVOUR_LISTOF_DHFILE), debian/libtachyon-$(lf)-$(DEB_PKG_LT_CURRENT)$(dhf) ))

override_dh_auto_clean-indep:
	dh_auto_clean -i
	rm -f $(DEB_ADHOC_SCENES_ACTION_SH)
	$(MAKE) -C docs clean
	$(MAKE) -C docs distclean || true
	$(MAKE) -C pkgextra/volpack/data distclean || true
	$(MAKE) -C pkgextra/virtual-reality/graphics distclean || true

override_dh_strip-arch:
	$(foreach vt, $(DEB_VIRT_TACHYON_LISTOF_VARIANT), dh_strip --package=tachyon-bin-$(vt) ;)
	$(foreach lf, $(DEB_VIRT_LIBTACHYON_LISTOF_FLAVOUR), \
		dh_strip --package=libtachyon-$(lf)-$(DEB_PKG_LT_CURRENT) --dbg-package=libtachyon-$(lf)-$(DEB_PKG_LT_CURRENT)-dbg ;\
		)

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

update-debian-control: debian/templates/control.in debian/rules debian/templates/control-description-mainpart.rin
	sed \
			-e "s|@LT_CURRENT@|$(DEB_PKG_LT_CURRENT)|g" \
			-e "s|@LIBTACHYON_MPI_DEFAULT_DEV@|$(DEB_VARNAME_LIBTACHYON_MPI_DEFAULT_DEV)|g" \
			-e "s|@ARCH_REVLISTOF_OPENMPI@|$(DEB_ARCH_REVLISTOF_OPENMPI)|g" \
			-e "s|@ARCH_REVLISTOF_MPICH@|$(DEB_ARCH_REVLISTOF_MPICH)|g" \
			-e "s|@SYNOPSIS_LIBRARY@|Parallel/Multiprocessor Ray Tracing Library|g" \
			-e   "s|@SYNOPSIS_TOOLS@|Parallel/Multiprocessor Standalone Ray Tracer|g" \
			-e  "s|@SYNOPSIS_MANUAL@|Parallel/Multiprocessor Ray Tracing System|g" \
			-e "/##DescriptionMainPart##/r $(lastword $^)" \
			-e "/##DescriptionMainPart##/d" \
		$< > debian/control

EMPTY :=
EMPTY +=
