#!/usr/bin/make -f
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
export PYTHON=/usr/bin/python3  # for the upstream build system

# Select target architecture
CONFIG_amd64      = x86_64
CONFIG_armhf      = generic
CONFIG_arm64      = cortexa57
CONFIG_ppc64el    = generic
CONFIG            = $(word 1, $(CONFIG_$(DEB_HOST_ARCH)) generic)

# SOVERSION
SOVER := 2

ifneq (,$(filter $(DEB_HOST_ARCH), amd64 kfreebsd-amd64 arm64 mips64el ppc64el s390x ppc64 riscv64 sparc64))
FLAVORS := $(SOVER)-openmp $(SOVER)-pthread $(SOVER)-serial 64-$(SOVER)-openmp 64-$(SOVER)-pthread 64-$(SOVER)-serial
else
FLAVORS := $(SOVER)-openmp $(SOVER)-pthread $(SOVER)-serial
endif

FLAGS := \
	--enable-verbose-make \
	--prefix=/usr \
	--enable-cblas \
	--enable-static \
	--enable-shared \
	--libdir=/usr/lib/$(DEB_HOST_MULTIARCH)

SRCS := $(filter-out debian $(FLAVORS), $(wildcard ./*))


%:
	dh $@ -Smakefile

create_symlinks:
	# BLIS/BLAS
	# armhf: upstream's armv7a kernel assumes NEON. Using generic kernels currently.
	# ln -sr libblis$(SOVER)-symbols.armhf libblis$(SOVER)-$$j.symbols.$$i
	set -e; cd debian; for j in openmp pthread serial; do \
		ln -sr libblis$(SOVER)-XXX.symbols.generic libblis$(SOVER)-$$j.symbols ;\
		for i in amd64 arm64; do  \
			ln -sr libblis$(SOVER)-XXX.symbols.$$i libblis$(SOVER)-$$j.symbols.$$i ;\
		done;\
		for i in i386 x32; do \
			ln -sr libblis$(SOVER)-XXX.symbols.i386 libblis$(SOVER)-$$j.symbols.$$i ;\
		done;\
	done;
	# BLIS64/BLAS64
	set -e; cd debian; for j in openmp pthread serial; do \
		ln -sr libblis64-$(SOVER)-symbols.generic libblis64-$(SOVER)-$$j.symbols ;\
		for i in amd64 arm64; do \
			ln -sr libblis64-$(SOVER)-symbols.$$i libblis64-$(SOVER)-$$j.symbols.$$i ;\
		done;\
	done;

config_%:
	# Generate maintainer scripts from templates
	set -e; cd debian; if test -z "$$(echo $* | grep 64)"; then \
		cp libblis2-XXX.postinst     libblis$*.postinst; \
		cp libblis2-XXX.prerm        libblis$*.prerm; \
		cp libblis-XXX-dev.postinst  libblis$(subst $(SOVER),,$*)-dev.postinst; \
		cp libblis-XXX-dev.prerm     libblis$(subst $(SOVER),,$*)-dev.prerm; \
		for SCRIPT in libblis$*.postinst libblis$*.prerm \
			libblis$(subst $(SOVER),,$*)-dev.postinst \
			libblis$(subst $(SOVER),,$*)-dev.prerm; do \
			sed -i -e "s/@DEB_HOST_MULTIARCH@/$(DEB_HOST_MULTIARCH)/g" \
				-e "s/@SUBDIR@/blis$(subst $(SOVER),,$*)/g" \
				-e "s/@SOVER@/$(SOVER)/g" \
				$$SCRIPT; \
			if test -n "$$(echo $* | grep openmp)"; then \
				sed -i -e "s/@BLIS_PRI@/38/g" $$SCRIPT; \
			elif test -n "$$(echo $* | grep pthread)"; then \
				sed -i -e "s/@BLIS_PRI@/37/g" $$SCRIPT; \
			else \
				sed -i -e "s/@BLIS_PRI@/36/g" $$SCRIPT; \
			fi; \
		done; \
	else \
		cp libblis64-2-XXX.postinst     libblis$*.postinst; \
		cp libblis64-2-XXX.prerm        libblis$*.prerm; \
		cp libblis64-XXX-dev.postinst   libblis$(subst $(SOVER)-,,$*)-dev.postinst; \
		cp libblis64-XXX-dev.prerm      libblis$(subst $(SOVER)-,,$*)-dev.prerm; \
		for SCRIPT in libblis$*.postinst libblis$*.prerm \
			libblis$(subst $(SOVER)-,,$*)-dev.postinst \
			libblis$(subst $(SOVER)-,,$*)-dev.prerm; do \
			sed -i -e "s/@DEB_HOST_MULTIARCH@/$(DEB_HOST_MULTIARCH)/g" \
				-e "s/@SUBDIR@/blis$(subst $(SOVER)-,,$*)/g" \
				-e "s/@SOVER@/$(SOVER)/g" \
				$$SCRIPT; \
			if test -n "$$(echo $* | grep openmp)"; then \
				sed -i -e "s/@BLIS_PRI@/38/g" $$SCRIPT; \
			elif test -n "$$(echo $* | grep pthread)"; then \
				sed -i -e "s/@BLIS_PRI@/37/g" $$SCRIPT; \
			else \
				sed -i -e "s/@BLIS_PRI@/36/g" $$SCRIPT; \
			fi; \
		done; \
	fi;
	# Run upstream configure script in duplicated source root directories
	mkdir $*
	cp -r $(SRCS) $*/
	set -e; cd $*; if test -z "$$(echo $* | grep 64)"; then \
		if test -z "$$(echo $* | grep serial)"; then \
			./configure $(FLAGS) -t $(subst $(SOVER)-,,$*) $(CONFIG); \
		else \
			./configure $(FLAGS) --disable-threading $(CONFIG); \
		fi; \
		echo "$*/usr/lib/*/libblis.so.* usr/lib/$(DEB_HOST_MULTIARCH)/" > \
			debian/libblis$*.install; \
	else \
		if test -z "$$(echo $* | grep serial)"; then \
			./configure $(FLAGS) -b 64 -i 64 -t $(subst 64-$(SOVER)-,,$*) $(CONFIG); \
		else \
			./configure $(FLAGS) -b 64 -i 64 --disable-threading $(CONFIG); \
		fi; \
		echo "$*/usr/lib/*/libblis64.so.* usr/lib/$(DEB_HOST_MULTIARCH)/" > \
			debian/libblis$*.install; \
	fi;

override_dh_auto_configure: $(addprefix config_, $(FLAVORS)) create_symlinks
	:

build_%:
	set -e; if test -n "$$(echo $* | grep 64)"; then \
		dh_auto_build -B$* -- DEB_LIBBLAS=libblas64.so.3 LIBBLIS=libblis64 ; \
	else \
		dh_auto_build -B$* -- DEB_LIBBLAS=libblas.so.3; \
	fi;

override_dh_auto_build: $(addprefix build_, $(FLAVORS))
	:

test_%:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	set -e; if test -n "$$(echo $* | grep 64)"; then \
		$(MAKE) -C$* check LIBBLIS=libblis64; \
	else \
		$(MAKE) -C$* check; \
	fi;
endif

override_dh_auto_test: $(addprefix test_, $(FLAVORS))
	:

install_%:
	# Don't use the debian/tmp directory
	-$(RM) -rf debian/tmp/*
	# In case we forgot to compile something
	-set -e; if test -n "$$(echo $* | grep 64)"; then \
		dh_auto_install -B$* -- LIBBLIS=libblis64; \
	else \
		dh_auto_install -B$*; \
	fi;
	# Don't use the debian/tmp directory
	-$(RM) -rf debian/tmp/*

	# Install things manually
	set -e; if test -z "$$(echo $* | grep 64)"; then \
		install -Dm0644 $*/lib/*/libblis.so     debian/libblis$*/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER),,$*)/libblis.so.$(SOVER) ;\
		install -Dm0644 $*/lib/*/libblas.so.3   debian/libblis$*/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER),,$*)/libblas.so.3 ;\
		ln -s libblas.so.3                      debian/libblis$*/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER),,$*)/libblas.so ;\
		install -Dm0644 $*/lib/*/libblis.a      debian/libblis$(subst $(SOVER),,$*)-dev/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER),,$*)/libblis.a ;\
		ln -s libblis.so.$(SOVER)               debian/libblis$(subst $(SOVER),,$*)-dev/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER),,$*)/libblis.so ;\
		install -Dm0644 $*/include/*/blis.h     debian/libblis$(subst $(SOVER),,$*)-dev/usr/include/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER),,$*)/blis.h ;\
		install -Dm0644 $*/include/*/cblas.h    debian/libblis$(subst $(SOVER),,$*)-dev/usr/include/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER),,$*)/cblas-blis.h ;\
	else \
		install -Dm0644 $*/lib/*/libblis64.so   debian/libblis$*/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER)-,,$*)/libblis64.so.$(SOVER) ;\
		install -Dm0644 $*/lib/*/libblas64.so.3 debian/libblis$*/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER)-,,$*)/libblas64.so.3 ;\
		ln -s libblas64.so.3                    debian/libblis$*/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER)-,,$*)/libblas64.so ;\
		install -Dm0644 $*/lib/*/libblis64.a    debian/libblis$(subst $(SOVER)-,,$*)-dev/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER)-,,$*)/libblis64.a ;\
		ln -s libblis64.so.$(SOVER)             debian/libblis$(subst $(SOVER)-,,$*)-dev/usr/lib/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER)-,,$*)/libblis64.so ;\
		install -Dm0644 $*/include/*/blis.h     debian/libblis$(subst $(SOVER)-,,$*)-dev/usr/include/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER)-,,$*)/blis64.h ;\
		install -Dm0644 $*/include/*/cblas.h    debian/libblis$(subst $(SOVER)-,,$*)-dev/usr/include/$(DEB_HOST_MULTIARCH)/blis$(subst $(SOVER)-,,$*)/cblas64-blis.h ;\
	fi;

override_dh_auto_install: $(addprefix install_, $(FLAVORS))
	# Don't use the debian/tmp directory
	-$(RM) -rf debian/tmp/*

override_dh_makeshlibs:
	dh_makeshlibs -Xlibblas

override_dh_dwz:
	dh_dwz --no-dwz-multifile
