#!/usr/bin/make -f

# define default MPI (ARCH_DEFAULT_MPI_IMPL)
include /usr/share/mpi-default-dev/debian_defaults
include /usr/share/dpkg/architecture.mk

DEB_VERSION := $(shell dpkg-parsechangelog -S Version)
DEB_NOEPOCH_VERSION := $(shell echo $(DEB_VERSION) | cut -d: -f2-)
DEB_UPSTREAM_VERSION := $(shell echo $(DEB_NOEPOCH_VERSION) | sed 's/-[^-]*$$//')

ADIOS2_UPSTREAM_VERSION=$(DEB_UPSTREAM_VERSION)
ADIOS2_MAJOR_VERSION=$(shell echo $(ADIOS2_UPSTREAM_VERSION) | cut -d . -f 1)
ADIOS2_MINOR_VERSION=$(shell echo $(ADIOS2_UPSTREAM_VERSION) | cut -d . -f 2)

export ADIOS2_SOVERSION=$(ADIOS2_MAJOR_VERSION).$(ADIOS2_MINOR_VERSION)

PYVERS := $(shell py3versions -vs)
PYVERS_LIST := $(shell echo $(PYVERS) | tr " " ";")

get-orig-source:
	wget -O ../adios2_$(DEBIAN_VERSION).orig.tar.gz --no-clobber https://github.com/ornladios/ADIOS2/archive/$(GIT_VERSION).tar.gz
	mkdir tmp
	tar -C tmp --strip-components=1 -xf ../adios2_$(DEBIAN_VERSION).orig.tar.gz
	cd tmp && rm -r \
	  thirdparty/atl \
	  thirdparty/dill \
	  thirdparty/enet \
	  thirdparty/EVPath \
	  thirdparty/ffs \
	  thirdparty/GTest \
	  thirdparty/mingw-w64 \
	  thirdparty/nlohmann_json \
	  thirdparty/pugixml \
	  thirdparty/pybind11 \
	  thirdparty/yaml-cpp
	tar --owner=root --group=root --transform="s/^tmp/adios2_$(DEBIAN_VERSION)+dfsg1/" -cJf ../adios2_$(DEBIAN_VERSION)+dfsg1.orig.tar.xz tmp
	rm -r tmp

flavors := serial mpi

%:
	dh $@ --buildsystem=cmake+ninja

configure_flags_common := \
  -DADIOS2_USE_EXTERNAL_DEPENDENCIES:BOOL=ON \
  -DADIOS2_USE_EXTERNAL_ENET:BOOL=ON \
  -DADIOS2_USE_BZip2:BOOL=ON \
  -DADIOS2_USE_Blosc:BOOL=ON \
  -DADIOS2_USE_Fortran:BOOL=ON \
  -DADIOS2_USE_HDF5:BOOL=ON \
  -DADIOS2_USE_PNG:BOOL=ON \
  -DADIOS2_USE_SST:BOOL=ON \
  -DADIOS2_USE_ZeroMQ:BOOL=ON \
  -DADIOS2_USE_Python:BOOL=ON \
  -DADIOS2_Python_Version="$(PYVERS_LIST)" \
  -DEVPATH_TRANSPORT_MODULES=ON \
  -DCMAKE_SKIP_INSTALL_RPATH:BOOL=ON

ifeq ($(DEB_HOST_ARCH_ENDIAN),big)
    configure_flags_common += -DADIOS2_USE_Endian_Reverse=ON
    EXTRA_CTEST_FLAGS += -E Install.CMake.EncryptionOperator
endif

configure_flags_serial := $(configure_flags_common) \
  -DCMAKE_INSTALL_CMAKEDIR:STRING=lib/$(DEB_HOST_GNU_TYPE)/cmake/adios2/serial \
  -DADIOS2_LIBRARY_FLAVOR:STRING=serial \
  -DADIOS2_LIBRARY_SUFFIX:STRING=_serial \
  -DADIOS2_EXECUTABLE_SUFFIX:STRING=.serial \
  -DADIOS2_USE_MPI:BOOL=OFF \
  -DHDF5_C_COMPILER_EXECUTABLE:FILEPATH=/usr/bin/h5cc

configure_flags_mpi_common := $(configure_flags_common) \
  -DADIOS2_USE_MPI:BOOL=ON \
  -DADIOS2_USE_SSC:BOOL=ON

configure_flags_mpi := $(configure_flags_mpi_common) \
  -DCMAKE_INSTALL_CMAKEDIR:STRING=lib/$(DEB_HOST_GNU_TYPE)/cmake/adios2/mpi \
  -DADIOS2_LIBRARY_FLAVOR:STRING=mpi \
  -DADIOS2_LIBRARY_SUFFIX:STRING=_mpi \
  -DADIOS2_EXECUTABLE_SUFFIX:STRING=.mpi \
  -DMPI_C_COMPILER:FILEPATH=/usr/bin/mpicc.$(ARCH_DEFAULT_MPI_IMPL) \
  -DMPI_CXX_COMPILER:FILEPATH=/usr/bin/mpic++.$(ARCH_DEFAULT_MPI_IMPL) \
  -DMPI_Fortran_COMPILER:FILEPATH=/usr/bin/mpifort.$(ARCH_DEFAULT_MPI_IMPL) \
  -DHDF5_C_COMPILER_EXECUTABLE:FILEPATH=/usr/bin/h5pcc.$(ARCH_DEFAULT_MPI_IMPL)

override_dh_auto_clean:
	dh_clean $(foreach flavor,$(flavors),build-$(flavor)/ install-$(flavor)/)

start_%: flavor = $(patsubst start_%,%,$@)
start_%:
	dh_ctest_start --ctest-testing-dir=build-$(flavor) --builddirectory=build-$(flavor) --ctest-build-suffix=-$(flavor)

override_dh_ctest_start: $(foreach flavor,$(flavors),start_$(flavor))

update_%: flavor = $(patsubst update_%,%,$@)
update_%:
	dh_ctest_update --ctest-testing-dir=build-$(flavor) --builddirectory=build-$(flavor) --ctest-build-suffix=-$(flavor)

override_dh_ctest_update: $(foreach flavor,$(flavors),update_$(flavor))

configure_%: flavor = $(patsubst configure_%,%,$@)
configure_%:
	dh_ctest_configure -O--ctest-testing-dir=build-$(flavor) --builddirectory=build-$(flavor) -O--ctest-build-suffix=-$(flavor) -O--buildsystem=cmake+ninja -- $(configure_flags_$(flavor))

override_dh_ctest_configure: $(foreach flavor,$(flavors),configure_$(flavor))

build_%: flavor = $(patsubst build_%,%,$@)
build_%:
	dh_ctest_build -O--ctest-testing-dir=build-$(flavor) --builddirectory=build-$(flavor) -O--ctest-build-suffix=-$(flavor) -O--buildsystem=cmake+ninja

override_dh_ctest_build: $(foreach flavor,$(flavors),build_$(flavor))

test_%: flavor = $(patsubst test_%,%,$@)
test_%:
	dh_ctest_test --ctest-testing-dir=build-$(flavor) --builddirectory=build-$(flavor) --ctest-build-suffix=-$(flavor) -- -R '^Install\.' $(EXTRA_CTEST_FLAGS)

override_dh_ctest_test: $(foreach flavor,$(flavors),test_$(flavor))

submit_%: flavor = $(patsubst submit_%,%,$@)
submit_%:
	dh_ctest_submit --ctest-testing-dir=build-$(flavor) --builddirectory=build-$(flavor) --ctest-build-suffix=-$(flavor)

override_dh_ctest_submit: $(foreach flavor,$(flavors),submit_$(flavor))

install_%: flavor = $(patsubst install_%,%,$@)
install_%:
	EXTRA_CMAKE_ARGS="-DCMAKE_PREFIX_PATH=$(CMAKE_PREFIX_PATH);$(CURDIR)/install-$(flavor)/usr/lib/$(DEB_HOST_GNU_TYPE)/cmake/adios2/$(flavor)" dh_auto_install --buildsystem=cmake+ninja --builddirectory=build-$(flavor) --destdir=install-$(flavor)
	dh_install --sourcedir=install-$(flavor) --package libadios2-$(flavor)-core-dev usr/bin/adios2-config.$(flavor)

override_dh_auto_install: $(foreach flavor,$(flavors),install_$(flavor))

cmake_install_%: flavor = $(patsubst cmake_install_%,%,$@)
cmake_install_%: cmdbase = dh_cmake_install --builddirectory=build-$(flavor) --sourcedir=install-$(flavor)
cmake_install_%:
	$(cmdbase) --package adios2-$(flavor)-bin                             --component adios2_tools-runtime
	$(cmdbase) --package libadios2-$(flavor)-core-$(ADIOS2_SOVERSION)     --component adios2_core-libraries
	rm -r debian/libadios2-$(flavor)-core-*/usr/lib/*/adios2/$(flavor)
	dh_install --package libadios2-$(flavor)-plugins  --sourcedir=install-$(flavor)  usr/lib/$(DEB_HOST_GNU_TYPE)/adios2/$(flavor)/  usr/lib/$(DEB_HOST_GNU_TYPE)/adios2/
	$(cmdbase) --package libadios2-$(flavor)-core-dev                     --component adios2_core-development
	$(cmdbase) --package libadios2-$(flavor)-c-$(ADIOS2_SOVERSION)        --component adios2_c-libraries
	$(cmdbase) --package libadios2-$(flavor)-c-dev                        --component adios2_c-development
	$(cmdbase) --package libadios2-$(flavor)-c++11-$(ADIOS2_SOVERSION)    --component adios2_cxx11-libraries
	$(cmdbase) --package libadios2-$(flavor)-c++11-dev                    --component adios2_cxx11-development
	$(cmdbase) --package libadios2-$(flavor)-fortran-$(ADIOS2_SOVERSION)  --component adios2_fortran-libraries
	$(cmdbase) --package libadios2-$(flavor)-fortran-dev                  --component adios2_fortran-development

cmake_install_serial_extra: cmdbase = dh_cmake_install --builddirectory=build-serial --sourcedir=install-serial
cmake_install_serial_extra:
	$(cmdbase) --package python3-adios2           --component adios2_python-python
	rm -f debian/python3-adios2/usr/lib/python3/dist-packages/adios2/bindings/adios2_bindings_serial*.so
	for pyver in $(PYVERS); do \
	  $(cmdbase) --package python3-adios2-serial  --component adios2_python-python$$pyver; \
	done

cmake_install_mpi_extra: cmdbase = dh_cmake_install --builddirectory=build-mpi --sourcedir=install-mpi
cmake_install_mpi_extra:
	$(cmdbase) --package python3-adios2           --component adios2_python-python
	rm -f debian/python3-adios2/usr/lib/python3/dist-packages/adios2/bindings/adios2_bindings_mpi*.so
	for pyver in $(PYVERS); do \
	  $(cmdbase) --package python3-adios2-mpi       --component adios2_python-python$$pyver; \
	done
	$(cmdbase) --package adios2-data              --component adios2_tools-data

override_dh_cmake_install: cmdbase = dh_cmake_install --builddirectory=build-serial --sourcedir=install-serial
override_dh_cmake_install: $(foreach flavor,$(flavors),cmake_install_$(flavor) cmake_install_$(flavor)_extra)
	$(cmdbase) --package adios2-scripts                  --component adios2_scripts-runtime
	dh_install --sourcedir=debian/adios2 --package libadios2-common-core-dev \
	  adios2-config.cmake usr/lib/$(DEB_HOST_GNU_TYPE)/cmake/adios2
	dh_install --sourcedir=install-serial --package libadios2-common-core-dev \
	  usr/lib/$(DEB_HOST_GNU_TYPE)/cmake/adios2/serial/adios2-config-version.cmake usr/lib/$(DEB_HOST_GNU_TYPE)/cmake/adios2

execute_after_dh_install:
	for dev_serial_package in libadios2-serial-core-dev libadios2-serial-c-dev libadios2-serial-c++11-dev; do \
	  dev_common_package=`echo $${dev_serial_package} | sed "s/serial/common/"`; \
	  if [ -d debian/$${dev_serial_package}/usr/include ]; then \
	    for file_inc_serial in `find debian/$${dev_serial_package}/usr/include -type f ! -name ADIOSConfig.h`; do \
	      file_inc_mpi=`echo $$file_inc_serial | sed "s/adios2-serial/adios2-mpi/"`; \
	      if diff $$file_inc_serial $$file_inc_mpi >/dev/null ; then \
	        file_inc=`echo $$file_inc_serial | sed "s|debian/$${dev_serial_package}/||"`; \
	        mkdir -p debian/$${dev_common_package}; \
	        dh_install -p $${dev_common_package} --sourcedir=debian/$${dev_serial_package} $$file_inc; \
	        rm $$file_inc_serial $$file_inc_mpi; \
	      fi; \
	    done; \
	    dev_mpi_package=`echo $${dev_serial_package} | sed "s/serial/mpi/"`; \
	    find debian/$${dev_serial_package}/usr/include -type d -empty -delete; \
	    find debian/$${dev_mpi_package}/usr/include -type d -empty -delete; \
	  fi; \
	done

execute_before_dh_fixperms-arch:
	for flavor in serial mpi; do \
	  sed "s|^#\!/bin/bash$$|#\!/bin/bash\nDEB_HOST_MULTIARCH=\$$(dpkg-architecture -qDEB_HOST_MULTIARCH)|; \
	       s|$(DEB_HOST_MULTIARCH)|\$${DEB_HOST_MULTIARCH}|g;" \
	      -i debian/libadios2-$${flavor}-core-dev/usr/bin/adios2-config.$${flavor}; \
	done

override_dh_missing-arch:
	dh_missing --sourcedir=install-serial
	# common scripts installed to adios2-scripts are taken from the serial build
	dh_missing --sourcedir=install-mpi \
	    -Xusr/bin/adios2_campaign_manager \
	    -Xusr/bin/adios2_deactivate_bp \
	    -Xusr/bin/adios2_json_pp \
	    -Xusr/bin/bp4dbg \
	    -Xusr/bin/bp5dbg \
	    -Xusr/lib/python3/dist-packages/adios2/bp4dbg \
	    -Xusr/lib/python3/dist-packages/adios2/bp5dbg

execute_after_dh_installdocs:
	for p in libadios2-serial-core-dev libadios2-mpi-core-dev python3-adios2; do \
	    dh_installdocs -p $$p debian/README.Debian; \
	done
