#!/usr/bin/make -f

include /usr/share/dpkg/default.mk

SO:=3

# 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)

# if F77 isn't explicitly set (default or undefined), set it to the compiler for
# our host architecture. This may be a cross compiler
ifneq ($(filter default undefined,$(origin F77)),)
F77 := $(DEB_HOST_GNU_TYPE)-gfortran
endif

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

# if CC isn't explicitly set (default or undefined), set it to the compiler for
# our host architecture. This may be a cross compiler
ifneq ($(filter default undefined,$(origin CC)),)
CC := $(DEB_HOST_GNU_TYPE)-gcc
endif

CFLAGS:=$(shell dpkg-buildflags --get CFLAGS)
CPPFLAGS:=$(shell dpkg-buildflags --get CPPFLAGS)

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

# On arches with extended precision, this flag is used
# for BLAS when compiling i{c,z}amax.f and the BLAS testsuite,
# in order to avoid test failures.
# See also debian/patches/icamax-izamax-extended-precision.patch
ifneq (,$(filter $(DEB_HOST_ARCH_CPU),i386 m68k))
  FFLAGS_FLOAT_STORE := -ffloat-store
  export FFLAGS_FLOAT_STORE
endif

FFLAGS_BLAS_TESTSUITE := $(FFLAGS) $(FFLAGS_FLOAT_STORE)

# Using the -frecursive flag is the solution recommended by upstream for #693269
# However, we don't want to use -frecursive for the LAPACK testsuite, it leads to
#  segfaults on mips{,el} (xeigtstz allocates too much space on the stack)
FFLAGS_LAPACK_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

%:
	dh $@

make.inc: INSTALL/make.inc.gfortran
	sed -e "s%\(^CC  *=\).*%\1 $(CC)%1" \
	    -e "s%\(^FORTRAN  *=\).*%\1 $(F77)%1" \
	    -e "s%\(^NOOPT  *=\).*%\1 \$$(PICOPTS) $(FFLAGS_NOOPT)%1" \
	    -e "s%\(^OPTS  *=\).*%\1 \$$(PICOPTS) $(FFLAGS)%1" \
	    -e "s%\(^LOADER  *=\).*%\1 $(F77)%1" \
	    -e "s%\(^LOADOPTS  *=\).*%\1 $(LDFLAGS)%1" \
	    -e "s%\(^ARCH  *=\).*%\1 $(DEB_HOST_GNU_TYPE)-ar%1" \
	    -e "s%\(^RANLIB  *=\).*%\1 $(DEB_HOST_GNU_TYPE)-ranlib%1" \
	    -e "s%\(^CFLAGS  *=\).*%\1 $(CPPFLAGS) \$$(PICOPTS) $(CFLAGS)%1" \
	    -e "s%^#\(LAPACKE_WITH_TMG  *=\)%\1%1" \
	    < $< > $@
	# Build deprecated routines (see #810143)
	echo "BUILD_DEPRECATED=1" >> $@

override_dh_auto_clean: make.inc
	$(MAKE) clean
	rm -rf debian/*_stamp debian/*_results lib*.so* pic/
	rm -rf debian/test/ debian/time/
	rm -f TESTING/tmp TESTING/testing_results.txt
	rm -f LAPACKE/include/lapacke_mangling.h
	rm -f CBLAS/include/cblas_mangling.h
	rm -rf DOCS/explore-html/ DOCS/man/
	rm -f output_err
	rm -f lapack-netlib.pc LAPACKE/lapacke.pc BLAS/blas-netlib.pc
	rm -f make.inc

override_dh_auto_configure: make.inc
	# Create lapack-netlib.pc
	sed -e "s%@LAPACK_VERSION@%$(DEB_VERSION_UPSTREAM)%" \
	    -e "s%@CMAKE_INSTALL_FULL_INCLUDEDIR@%/usr/include/$(DEB_HOST_MULTIARCH)%"  \
	    -e "s%@CMAKE_INSTALL_FULL_LIBDIR@%/usr/lib/$(DEB_HOST_MULTIARCH)%" < lapack.pc.in > lapack-netlib.pc

	# Create lapacke.pc
	sed -e "s%@LAPACK_VERSION@%$(DEB_VERSION_UPSTREAM)%" \
	    -e "s%@CMAKE_INSTALL_FULL_INCLUDEDIR@%/usr/include/$(DEB_HOST_MULTIARCH)%"  \
	    -e "s%@CMAKE_INSTALL_FULL_LIBDIR@%/usr/lib/$(DEB_HOST_MULTIARCH)%" < LAPACKE/lapacke.pc.in > LAPACKE/lapacke.pc

	# Create blas-netlib.pc
	sed -e "s%@LAPACK_VERSION@%$(DEB_VERSION_UPSTREAM)%" \
	    -e "s%@CMAKE_INSTALL_FULL_INCLUDEDIR@%/usr/include/$(DEB_HOST_MULTIARCH)%"  \
	    -e "s%@CMAKE_INSTALL_FULL_LIBDIR@%/usr/lib/$(DEB_HOST_MULTIARCH)%" < BLAS/blas.pc.in > BLAS/blas-netlib.pc

override_dh_auto_build-arch:
	# Build pic libraries
	$(MAKE) cleanlib
	$(MAKE) blaslib cblaslib lapacklib tmglib lapackelib PICOPTS=-fPIC
	mkdir -p pic
	mv librefblas.a pic/librefblas_pic.a
	mv libcblas.a pic/libcblas_pic.a
	mv liblapack.a pic/liblapack_pic.a
	mv libtmglib.a pic/libtmglib_pic.a
	mv liblapacke.a pic/liblapacke_pic.a

	# Build libblas.so.*
	ar d pic/librefblas_pic.a xerbla.o # We want to use the xerbla.o from libcblas_pic.a
	mkdir -p tmp
	cd tmp && ar x ../pic/librefblas_pic.a && ar x ../pic/libcblas_pic.a
	$(F77) -shared -Wl,-soname=libblas.so.$(SO) -o libblas.so.$(DEB_VERSION_UPSTREAM) tmp/*.o $(LDFLAGS)
	rm -rf tmp
	ln -s libblas.so.$(DEB_VERSION_UPSTREAM) libblas.so.$(SO)
	ln -s libblas.so.$(DEB_VERSION_UPSTREAM) libblas.so

	# Build liblapack.so.*
	mkdir -p tmp
	cd tmp && ar x ../pic/liblapack_pic.a
	$(F77) -shared -Wl,-soname=liblapack.so.$(SO) -o liblapack.so.$(DEB_VERSION_UPSTREAM) tmp/*.o  -L. -lblas $(LDFLAGS)
	rm -rf tmp
	ln -s liblapack.so.$(DEB_VERSION_UPSTREAM) liblapack.so.$(SO)
	ln -s liblapack.so.$(DEB_VERSION_UPSTREAM) liblapack.so

	# Build libtmglib.so.*
	mkdir -p tmp
	cd tmp && ar x ../pic/libtmglib_pic.a
	$(F77) -shared -Wl,-soname=libtmglib.so.$(SO) -o libtmglib.so.$(DEB_VERSION_UPSTREAM) tmp/*.o  -L. -lblas -llapack $(LDFLAGS)
	rm -rf tmp
	ln -s libtmglib.so.$(DEB_VERSION_UPSTREAM) libtmglib.so.$(SO)
	ln -s libtmglib.so.$(DEB_VERSION_UPSTREAM) libtmglib.so

	# Build liblapacke.so.*
	mkdir -p tmp
	cd tmp && ar x ../pic/liblapacke_pic.a
	$(CC) -shared -Wl,-soname=liblapacke.so.$(SO) -o liblapacke.so.$(DEB_VERSION_UPSTREAM) tmp/*.o  -L. -lblas -llapack -ltmglib $(LDFLAGS)
	rm -rf tmp
	ln -s liblapacke.so.$(DEB_VERSION_UPSTREAM) liblapacke.so.$(SO)
	ln -s liblapacke.so.$(DEB_VERSION_UPSTREAM) liblapacke.so

	# Build static versions
	$(MAKE) cleanlib
	$(MAKE) blaslib cblaslib lapacklib tmglib lapackelib

	# Build libblas.a
	ar d librefblas.a xerbla.o # We want to use the xerbla.o from libcblas.a
	mkdir -p tmp
	cd tmp && ar x ../librefblas.a && ar x ../libcblas.a
	ar r libblas.a $$(env LC_ALL=C ls tmp/*.o)
	rm -rf tmp

	# Build the test programs, in order to avoid FTBFS if DEB_BUILD_OPTIONS contains nocheck
	$(MAKE) OPTS="$(FFLAGS_BLAS_TESTSUITE)" BLASLIB="../../libblas.so" -C BLAS/TESTING
	$(MAKE) OPTS="$(FFLAGS_BLAS_TESTSUITE)" BLASLIB="../../libblas.so" CBLASLIB="" -C CBLAS/testing
	$(MAKE) OPTS="$(FFLAGS_LAPACK_TESTSUITE)" BLASLIB="../../libblas.so" LAPACKLIB="liblapack.so" TMGLIB="libtmglib.so" -C TESTING EIG/xeigtstc EIG/xeigtstd EIG/xeigtsts EIG/xeigtstz LIN/xlintstc LIN/xlintstd LIN/xlintsts LIN/xlintstz LIN/xlintstds LIN/xlintstrfc LIN/xlintstrfd LIN/xlintstrfs LIN/xlintstrfz LIN/xlintstzc

override_dh_auto_build-indep:
ifeq (,$(filter nodoc,$(DEB_BUILD_OPTIONS)))
	$(MAKE) html
	# Remove useless doxygen-generated files
	find DOCS/explore-html/ \( -name '*.map' -or -name '*.md5' \) -delete

	$(MAKE) man
	# Remove directory reference files, because they include local build pathnames
	# (but don't delete some __*__.3 files)
	rm DOCS/man/man3/_[a-zA-Z]*
endif

override_dh_auto_test-arch:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	# Run BLAS tests, output the result, and stop if one test fails
	LD_LIBRARY_PATH=$$(pwd):$$LD_LIBRARY_PATH $(MAKE) blas_testing
	cat BLAS/TESTING/*.out
	! grep -q -i fail BLAS/TESTING/*.out

	# Run CBLAS tests, output the result, and stop if one test fails
	LD_LIBRARY_PATH=$$(pwd):$$LD_LIBRARY_PATH $(MAKE) cblas_testing
	cat CBLAS/testing/*.out
	! grep -q -i fail CBLAS/testing/*.out

	# Run LAPACK tests, but don't stop if one test fails
	# Only a summary is displayed; full test results in TESTING/testing_results.txt
	LD_LIBRARY_PATH=$$(pwd):$$LD_LIBRARY_PATH $(MAKE) lapack_testing
endif

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

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

GENERATED_MAINTAINER_SCRIPTS := $(patsubst %.in,%,$(wildcard debian/*.postinst.in debian/*.prerm.in))

$(GENERATED_MAINTAINER_SCRIPTS): %: %.in
	sed "s%@DEB_HOST_MULTIARCH@%$(DEB_HOST_MULTIARCH)%g" < $< > $@

override_dh_install: $(GENERATED_MAINTAINER_SCRIPTS)
	dh_install

override_dh_clean:
	dh_clean
	rm -f $(GENERATED_MAINTAINER_SCRIPTS)
