#!/usr/bin/make -f

export DH_VERBOSE=1

DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk

DESTDIR:=`pwd`/debian/tmp/
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
LIBDIR:=/usr/lib/$(DEB_HOST_MULTIARCH)
AUTOGENERATED:= libopenmpi3.links libopenmpi-dev.links libopenmpi-dev.postinst \
  libopenmpi-dev.prerm openmpi-bin.preinst libopenmpi-dev.preinst

### Arch-specific stuff
# No ibverbs support available on kFreeBSD, Hurd
NO_VERBS_ARCH:= hurd-i386 kfreebsd-amd64 kfreebsd-i386 s390x 
FABRIC_ARCH:= amd64 i386 
PSM_ARCH:= amd64 i386
PSM2_ARCH:= amd64
BUILTIN_ATOMICS_ARCH:= s390x riscv64
NO_CMA_ARCH:= s390x mipsel hppa alpha armhf armel m68k sparc64
NO_JAVA_ARCH:= hppa hurd-i386 ia64 riscv64
NO_TEST_ARCH:= hppa hurd-i386
GCC7_ARCH:= ia64

FORTRAN:=$(shell basename $(shell readlink /etc/alternatives/f95))
FC ?= $(FORTRAN)
# Drop '-g' flag with flang. Known failure with 2018122 version
ifneq ($(filter flang,$(FC)),)
FCFLAGS=$(shell dpkg-buildflags --get FCLAGS |  sed -e 's/-g //')
endif

ifeq (sparc,$(DEB_HOST_GNU_CPU))
	CFLAGS += -mcpu=v9
endif

# Use -O3 recommended by upstream
CFLAGS += -O3
CXXFLAGS += -O3
FCFLAGS += -O3

ifeq ($(filter $(NO_VERBS_ARCH),$(DEB_HOST_ARCH)),)
	VERBS := --with-verbs
endif	
# Use gcc-7 on ia64; ICE on gcc 8.*
ifneq ($(filter $(GCC7_ARCH),$(DEB_HOST_ARCH)),)
export CC=gcc-7
endif
ifneq ($(filter $(BUILTIN_ATOMICS_ARCH),$(DEB_HOST_ARCH)),)
	ENABLE_BUILTIN_ATOMICS:= --enable-builtin-atomics
endif
ifneq ($(filter $(FABRIC_ARCH),$(DEB_HOST_ARCH)),)
	FABRIC := --with-libfabric
endif
ifneq ($(filter $(PSM_ARCH),$(DEB_HOST_ARCH)),)
	PSM:= --with-psm
endif
ifneq ($(filter $(PSM2_ARCH),$(DEB_HOST_ARCH)),)
	PSM:= --with-psm2
endif
ifeq ($(filter $(NO_JAVA_ARCH),$(DEB_HOST_ARCH)),)
ifeq ($(filter stage1,$(DEB_BUILD_PROFILES)),)
	JAVA := --with-jdk-dir=/usr/lib/jvm/default-java --enable-mpi-java
endif
endif
ifneq (,$(findstring $(DEB_HOST_ARCH),$(NO_TEST_ARCH)))
	DO_TEST := false
	BTL_TESTS := 
else
	DO_TEST := true
	BTL_TESTS:= --enable-opal-btl-usnic-unit-tests
endif
ifneq ($(filter $(NO_CMA_ARCH),$(DEB_HOST_ARCH)),)
	CMA:= --without-cma
endif

# Flags for the static build: see bug #502232
#STATIC_CONFIG_PARAMS = --enable-static
STATIC_CONFIG_PARAMS =  


%:
	dh $@ --no-parallel --with=fortran_mod

override_dh_auto_clean:
	dh_clean
	find . -name .libs -exec rm -rf {} \; || true
	find . -name .dirstamp -delete
	find . -type l -delete
	find . -name '*.o' -delete
	rm -f $(patsubst %, debian/%, ${AUTOGENERATED})

override_dh_update_autotools_config:
	(cd config && autom4te --language=m4sh opal_get_version.m4sh -o opal_get_version.sh)
	./autogen.pl --force

override_dh_auto_configure:
	for f in ${AUTOGENERATED} ; do \
                sed -e 's%@TRIPLET@%${DEB_HOST_MULTIARCH}%g' < debian/$$f.in  > debian/$$f ; \
                done
	dh_auto_configure -- \
		--disable-silent-rules \
		--disable-wrapper-runpath \
		--with-package-string="Debian OpenMPI" \
		$(VERBS) $(FABRIC) $(PSM) $(PSM2) $(CMA) \
		$(ENABLE_BUILTIN_ATOMICS) \
		$(JAVA) \
		$(STATIC_CONFIG_PARAMS) \
		$(BTL_TESTS) \
                --with-libevent=external \
                --with-pmix=${LIBDIR}/pmix \
		--disable-silent-rules \
		--enable-mpi-cxx \
		--with-hwloc=/usr  \
		--with-libltdl \
		--with-devel-headers \
		--with-slurm \
		--with-sge \
		--without-tm \
		--sysconfdir=/etc/openmpi 		\
		--libdir=\$${prefix}/lib/${DEB_HOST_MULTIARCH}/openmpi/lib	\
		--includedir=\$${prefix}/lib/${DEB_HOST_MULTIARCH}/openmpi/include 

# Extra debugging for non-deterministic FTBFS on some archs
override_dh_auto_build:
	dh_auto_build || ( \
		cat config.log ; \
		cat libtool ; \
		find . -name '*.la' -exec cat {} \; \
		)

override_dh_install:
	# Strip rpath info from all executables and libraries.
	find debian/tmp/ -type f -perm -+x -a ! -name '*.la' -a ! -name '*.mod' -exec chrpath -d '{}' \;
# Rename the compiler and startup wrappers.
	for f in mpic++ mpicc mpiCC mpicxx mpiexec mpif77 mpif90 mpirun mpifort ; do \
		if test -f debian/tmp/usr/bin/$${f}; then \
			mv debian/tmp/usr/bin/$${f} debian/tmp/usr/bin/$${f}.openmpi ; \
		fi; \
	done
# Strip rpath from pc,wrapper files
	for f in ompi-c.pc  ompi-cxx.pc  ompi-f77.pc  ompi-f90.pc  ompi-fort.pc  ompi.pc  opal.pc  orte.pc ; do  \
		sed -e 's/-Wl,-rpath -Wl,$${libdir}//' < $(DESTDIR)/$(LIBDIR)/openmpi/lib/pkgconfig/$${f} > debian/tmp.x ; \
		mv debian/tmp.x $(DESTDIR)/$(LIBDIR)/openmpi/lib/pkgconfig/$${f} ; \
		done
	find . -name '*wrapper-data.txt' | while read f; do \
		sed -e 's/-Wl,-rpath -Wl,@{libdir}//' < $$f > debian/tmp.x ; \
		mv debian/tmp.x $$f ; done
# Rename the compiler wrapper man pages.
	for f in mpic++ mpicc mpicxx mpiexec mpif77 mpif90 mpirun mpifort ; do \
		if test -f debian/tmp/usr/share/man/man1/$${f}.1; then \
			mv debian/tmp/usr/share/man/man1/$${f}.1 debian/tmp/usr/share/man/man1/$${f}.openmpi.1 ; \
		fi; \
		if test -f debian/tmp/usr/share/man/man1/$${f}.3; then \
			mv debian/tmp/usr/share/man/man3/$${f}.3 debian/tmp/usr/share/man/man1/$${f}.openmpi.3 ; \
		fi; \
	done
	cd debian/tmp/usr/share/man/man3; \
	for f in *.3; do \
		mv $$f $$(echo $$f|sed -e "s|\.3|.openmpi.3|g"); \
	done; \
# Rename orte-bootproxy.sh to orte-bootproxy
	if test -f debian/tmp/usr/bin/orte-bootproxy.sh; then \
		mv debian/tmp/usr/bin/orte-bootproxy.sh debian/tmp/usr/bin/orte-bootproxy; \
	fi
# Remove dangling symlink(s)
	rm -f debian/tmp/usr/share/man/man1/mpiCC.1
	rm -f debian/tmp/usr/share/man/man1/orteCC.1
# Remove COPYRIGHT file of ptmalloc2. It's reproduced in debian/copyright.
	rm -f -r debian/tmp/usr/share/openmpi/doc/
# Remove pmi2, pmix now in separate package
	rm -rf debian/tmp/usr/lib/*/openmpi/include/pmi*
# Remove buggy ${pkgincludedir} refs from pkg-config files. #837062
	find . -name '*.pc' | while read f ; do \
		cat $${f} | sed -e 's%-I$${pkgincludedir}[a-zA-Z0-9/]* %%g' > x ; \
		 mv x $${f}; done
# sanitize build paths for bit-reproducibility
	if test ./debian/tmp/${LIBDIR}/openmpi/include/openmpi/opal_config.h ; then \
		sed -e 's%${CURDIR}%/build/openmpi%g' < ./debian/tmp/${LIBDIR}/openmpi/include/openmpi/opal_config.h \
			> debian/tmp/x ; \
		mv debian/tmp/x ./debian/tmp/${LIBDIR}/openmpi/include/openmpi/opal_config.h ; \
	fi
# Continue as usual
	dh_install
# oshmem, shmem only built on Linux so do by hand or it may fail ...
	mkdir -p debian/libopenmpi3/${LIBDIR}/openmpi/lib 
	if test -f debian/tmp/usr/bin/oshmem_info ; then \
		mkdir -p debian/openmpi-bin/usr/share/man/man1 ; \
		cp -a debian/tmp/usr/bin/oshrun  debian/openmpi-bin//usr/bin/ ; \
		cp -a debian/tmp/usr/bin/oshmem_info  debian/openmpi-bin//usr/bin/ ; \
		cp -a debian/tmp/usr/bin/oshcc	 debian/libopenmpi-dev/usr/bin   ; \
		cp -a debian/tmp/usr/bin/oshfort   debian/libopenmpi-dev/usr/bin   ; \
		cp -a debian/tmp/${LIBDIR}/openmpi/lib/liboshmem.so.40.10.1 debian/libopenmpi3/${LIBDIR}/openmpi/lib ; \
		cp -a debian/tmp/usr/share/man/man1/oshcc.1 debian/libopenmpi-dev/usr/share/man/man1 ; \
		cp -a debian/tmp/usr/share/man/man1/oshfort.1 debian/libopenmpi-dev/usr/share/man/man1 ; \
		cp -a debian/tmp/usr/share/man/man1/oshrun.1 debian/openmpi-bin/usr/share/man/man1 ; \
		cp -a debian/tmp/usr/share/man/man1/oshmem_info.1 debian/openmpi-bin/usr/share/man/man1 ; \
		dh_link -p libopenmpi-dev	${LIBDIR}/liboshmem.so.40  ${LIBDIR}/liboshmem.so ; \
		dh_link -p libopenmpi3 ${LIBDIR}/openmpi/lib/liboshmem.so.40.10.1  ${LIBDIR}/liboshmem.so.40 ; \
	fi
	if test -f debian/tmp/${LIBDIR}/openmpi/lib/libmpi_java.so.40.10.0 ; then \
		cp -a debian/tmp/${LIBDIR}/openmpi/lib/libmpi_java.so.40.10.0 \
			debian/libopenmpi3/${LIBDIR}/openmpi/lib/libmpi_java.so.40.10.0 ; \
		dh_link -p libopenmpi3 ${LIBDIR}/libmpi_java.so.40.10.0  ${LIBDIR}/libmpi_java.so.40 ; \
		dh_link -p libopenmpi3 ${LIBDIR}/openmpi/lib/libmpi_java.so.40.10.0 ${LIBDIR}/libmpi_java.so.40.10.0 ; \
		dh_link -p libopenmpi-dev ${LIBDIR}/libmpi_java.so.40	${LIBDIR}/libmpi_java.so ; \
	fi
	if test -f debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_monitoring.so.50.0.0 ; then  \
		cp -a debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_monitoring.so.50.0.0 \
			debian/libopenmpi3/${LIBDIR}/openmpi/lib/libmca_common_monitoring.so.50.0.0 ; \
		dh_link -p libopenmpi3   ${LIBDIR}/libmca_common_monitoring.so.50.0.0  ${LIBDIR}/libmca_common_monitoring.so.50 ; \
		dh_link -p libopenmpi3 ${LIBDIR}/openmpi/lib/libmca_common_monitoring.so.50.0.0 ${LIBDIR}/libmca_common_monitoring.so.50.0.0 ; \
		dh_link -p libopenmpi-dev ${LIBDIR}/libmca_common_monitoring.so.50	${LIBDIR}/libmca_common_monitoring.so ; \
	fi
	if test -f debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_ofi.so.40.10.0 ; then  \
		cp -a debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_ofi.so.40.10.0 \
			debian/libopenmpi3/${LIBDIR}/openmpi/lib/libmca_common_ofi.so.40.10.0 ; \
		dh_link -p libopenmpi3   ${LIBDIR}/libmca_common_ofi.so.40.10.0  ${LIBDIR}/libmca_common_ofi.so.40 ; \
		dh_link -p libopenmpi3 ${LIBDIR}/openmpi/lib/libmca_common_ofi.so.40.10.0 ${LIBDIR}/libmca_common_ofi.so.40.10.0 ; \
		dh_link -p libopenmpi-dev ${LIBDIR}/libmca_common_ofi.so.40	${LIBDIR}/libmca_common_ofi.so ; \
	fi
	if test -f debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_ompio.so.41.9.0 ; then  \
		cp -a debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_ompio.so.41.9.0 \
			debian/libopenmpi3/${LIBDIR}/openmpi/lib/libmca_common_ompio.so.41.9.0 ; \
		dh_link -p libopenmpi3   ${LIBDIR}/libmca_common_ompio.so.41.9.0  ${LIBDIR}/libmca_common_ompio.so.41 ; \
		dh_link -p libopenmpi3 ${LIBDIR}/openmpi/lib/libmca_common_ompio.so.41.9.0 ${LIBDIR}/libmca_common_ompio.so.41.9.0 ; \
		dh_link -p libopenmpi-dev ${LIBDIR}/libmca_common_ompio.so.41	${LIBDIR}/libmca_common_ompio.so ; \
	fi
	if test -f debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_verbs.so.40.10.0 ; then \
		cp -a debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_verbs.so.40.10.0 \
			debian/libopenmpi3/${LIBDIR}/openmpi/lib/libmca_common_verbs.so.40.10.0 ; \
		dh_link -p libopenmpi3   ${LIBDIR}/libmca_common_verbs.so.40.10.0  ${LIBDIR}/libmca_common_verbs.so.40 ; \
		dh_link -p libopenmpi3 ${LIBDIR}/openmpi/lib/libmca_common_verbs.so.40.10.0 ${LIBDIR}/libmca_common_verbs.so.40.10.0 ; \
		dh_link -p libopenmpi-dev ${LIBDIR}/libmca_common_verbs.so.40	${LIBDIR}/libmca_common_verbs.so ; \
	fi
	if test -f debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_libfabric.so.40.10.0 ; then \
		cp -a debian/tmp/${LIBDIR}/openmpi/lib/libmca_common_libfabric.so.40.10.0 \
			debian/libopenmpi3/${LIBDIR}/openmpi/lib/libmca_common_libfabric.so.40.i10.0 ; \
		dh_link -p libopenmpi3   ${LIBDIR}/libmca_common_libfabric.so.40.10.0  ${LIBDIR}/libmca_common_libfabric.so.40 ; \
		dh_link -p libopenmpi3 ${LIBDIR}/openmpi/lib/libmca_common_libfabric.so.40.10.0 ${LIBDIR}/libmca_common_libfabric.so.40.10.0 ; \
		dh_link -p libopenmpi-dev   ${LIBDIR}/libmca_common_libfabric.so.40.10.0  ${LIBDIR}/libmca_common_libfabric.so ; \
	fi
	if test -f debian/tmp/usr/bin/shmemrun ; then \
		cp -a debian/tmp/usr/bin/shmemrun debian/openmpi-bin/usr/bin/shmemrun ;\
		cp -a debian/tmp/usr/share/man/man1/shmemrun.1 debian/openmpi-bin/usr/share/man/man1 ; \
		cp -a debian/tmp/usr/bin/shmemcc debian/openmpi-bin/usr/bin/shmemcc ; \
		cp -a debian/tmp/usr/bin/shmemfort debian/openmpi-bin/usr/bin/shmemfort ; \
		cp -a debian/tmp/usr/share/man/man1/shmemcc.1 debian/openmpi-bin/usr/share/man/man1 ; \
		cp -a debian/tmp/usr/share/man/man1/shmemfort.1 debian/openmpi-bin/usr/share/man/man1 ; \
	fi

override_dh_fixperms-arch:
	chmod 0644 debian/libopenmpi*/${LIBDIR}/openmpi/lib/*.mod
	rm -f debian/libopenmpi-dev/usr/lib/*/openmpi/lib/ompi_monitoring_prof.so
	# TODO: whats causing this?
	rm -f debian/libopenmpi-dev/usr/bin
	dh_fixperms

override_dh_auto_test:
	$(DO_TEST) && dh_auto_test || echo "Tests disabled on ${NO_TEST_ARCH} systems for the moment"	

override_dh_installdocs:
	dh_installdocs --all NEWS README

override_dh_shlibdeps:
	dh_shlibdeps -l$(CURDIR)/debian/tmp/${LIBDIR}/openmpi/lib -- --ignore-missing-info
