#!/usr/bin/make -f

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

SO:=3
MN:=0
VERS:=$(SO).$(MN)

# xerblas_ and LAPACK_xerblas must be overrideable by applications
# --dynamic-list does not work with gold, so drop the flag completely
BUILDFLAGS_ENV:=DEB_LDFLAGS_MAINT_STRIP="-Wl,-Bsymbolic-functions"
LDFLAGS:=$(shell $(BUILDFLAGS_ENV) dpkg-buildflags --get LDFLAGS)

F77:=gfortran
FFLAGS:=$(shell dpkg-buildflags --get FFLAGS)
FFLAGS_NOOPT:=$(shell DEB_BUILD_OPTIONS=noopt dpkg-buildflags --get FFLAGS)

CC:=/usr/bin/cc
CFLAGS:=$(shell dpkg-buildflags --get CFLAGS)
CPPFLAGS:=$(shell dpkg-buildflags --get CPPFLAGS)

ARCH:=$(shell dpkg --print-architecture)

ifeq ($(ARCH),alpha)
  FFLAGS += -mieee
  FFLAGS_NOOPT += -mieee
endif

# Using the -frecursive flag is the solution recommended by upstream for #693269
# However, we don't want to use -frecursive for the testsuite, it leads to
#  segfaults on mips{,el} (xeigtstz allocates too much space on the stack)
FFLAGS_TESTSUITE := $(FFLAGS)
FFLAGS += -frecursive
FFLAGS_NOOPT += -frecursive

# Support parallel build
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
	NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
	MAKEFLAGS += -j$(NUMJOBS)
endif

#
#
# Configure
#
#

make.inc: install/make.inc.gfortran
	cat $< | sed -e "s,\(^NOOPT  *=\).*,\1 \$$(PICOPTS) $(FFLAGS_NOOPT),1" \
		     -e "s,\(^OPTS  *=\).*,\1 \$$(PICOPTS) $(FFLAGS),1" \
		     -e "s/\(^LOADOPTS  *=\).*/\1 $(LDFLAGS)/1" \
		     -e "s,\(^CFLAGS  *=\).*,\1 $(CPPFLAGS) \$$(PICOPTS) $(CFLAGS),1" \
		     -e "s,[^ ]*blas[^ ]*\.a,-lblas,1" > $@

#
#
# Build rules for libraries
#
#

liblapack_pic.a: make.inc testing/Makefile
	echo "Building liblapack_pic.a"
	$(MAKE) cleanlib
	$(MAKE) lapack_install PICOPTS=-fPIC
	$(MAKE) lib        PICOPTS=-fPIC
	mv liblapack.a $@

liblapack.so.$(VERS): liblapack_pic.a 
	echo "Building liblapack.so.$(VERS) from liblapack_pic.a"
	mkdir -p tmp
	cd tmp && ar x ../$<
	$(F77) -shared -Wl,-soname=liblapack.so.$(SO) -o $@ tmp/*.o  -L. -lblas $(LDFLAGS)
	rm -rf tmp

liblapack.so.$(SO): liblapack.so.$(VERS)
	ln -snf $< $@

liblapack.so: liblapack.so.$(SO)
	ln -snf $< $@

liblapack.a: make.inc
	echo "Building liblapack.a"
	$(MAKE) lapack_install
	$(MAKE) lib

lapacke/liblapacke_pic.a: make.inc
	echo "Building liblapacke_pic.a"
	cd lapacke; \
	$(MAKE) cleanlib; \
	$(MAKE) PICOPTS=-fPIC; \
	mv ../liblapacke.a $(@F)

lapacke/liblapacke.so.$(VERS): lapacke/liblapacke_pic.a 
	echo "Building liblapacke.so.$(VERS) from liblapacke_pic.a"
	cd lapacke; \
	mkdir -p tmp; \
	cd tmp && ar x ../$(<F) && cd -; \
	$(CC) -shared -Wl,-soname=liblapacke.so.$(SO) -o $(@F) tmp/*.o  -L.. -lblas -llapack $(LDFLAGS); \
	rm -rf tmp

lapacke/liblapacke.so.$(SO): lapacke/liblapacke.so.$(VERS)
	cd lapacke; \
	ln -snf $(<F) $(@F)

lapacke/liblapacke.so: lapacke/liblapacke.so.$(SO)
	cd lapacke; \
	ln -snf $(<F) $(@F)

lapacke/liblapacke.a: make.inc
	echo "Building liblapacke.a"
	cd lapacke; \
	$(MAKE) ; \
	mv ../liblapacke.a $(@F)

#
#
# Testing rules
#
#

testing/testing_results.txt: liblapack.so
	LD_LIBRARY_PATH=$$(pwd):$$LD_LIBRARY_PATH \
		$(MAKE) PICOPTS= OPTS="$(FFLAGS_TESTSUITE)" \
		LLIB="-L $$(pwd) -llapack -lblas" lapack_testing

#
#
# Package rules
#
#

%:
	dh $@ --parallel

override_dh_auto_clean: make.inc
	dh_testdir
	rm -rf debian/*_stamp debian/*_results lib* testing/*out
	rm -rf *.a install/test* debian/test/ debian/time/
	rm -f testing/tmp testing/testing_results.txt
	cd lapacke && $(MAKE) clean
	rm -f lapacke/*.a lapacke/*.so lapacke/*.so.* lapacke/include/lapacke_mangling.h
	touch TESTING/xlinfoo TESTING/xeigfoo  && $(MAKE) clean
	rm -rf DOCS/explore-html/ DOCS/man/
	rm -f output_err
	rm -f make.inc

# liblapack_pic.a must come before liblapack.a, otherwise the latter will be overwritten
# We also build the test programs, in order to avoid FTBFS if DEB_BUILD_OPTIONS contains nocheck
override_dh_auto_build-arch: liblapack_pic.a liblapack.a liblapack.so lapacke/liblapacke_pic.a lapacke/liblapacke.a lapacke/liblapacke.so
	make OPTS="$(FFLAGS_TESTSUITE)" -C testing xeigtstc xeigtstd xeigtsts xeigtstz xlintstc xlintstd xlintsts xlintstz xlintstds xlintstrfc xlintstrfd xlintstrfs xlintstrfz xlintstzc

override_dh_auto_build-indep: make.inc
	$(MAKE) html
	$(MAKE) man

ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
override_dh_auto_test-arch: testing/testing_results.txt
else
override_dh_auto_test-arch:
	touch testing/testing_results.txt
endif

override_dh_makeshlibs:
	dh_makeshlibs -a -pliblapack3 -V "liblapack3 | liblapack.so.3" -n
	dh_makeshlibs -a -Nliblapack3

override_dh_shlibdeps:
	dh_shlibdeps -a -l $$(pwd)

# Do not compress the .map files in HTML generated documentation
override_dh_compress-indep:
	dh_compress -i -X.map

# This Makefile must be run serially (because non-PIC and PIC versions must be
# built sequentially), but the sub-makes can still be parallized
.NOTPARALLEL:
