Author: Andreas Tille <tille@debian.org>
Author: Sébastien Villemot <sebastien@debian.org>
Last-Update: 2017-09-10
Description: Use Debian package for BLAS/LAPACK (instead of obsolete clapack)
 - Use -lblas instead of -lblaswr
 - Use -ltmglib instead of -ltmg
 - Do not use f2c, not needed
 - Introduce prototypes for LAPACK functions used in the package
   (those are documented in the manpages from the liblapack-doc package)
Forwarded: https://github.com/CshlSiepelLab/phast/issues/48

--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -12,29 +12,9 @@
 
 ifdef CLAPACKPATH		# only do below if using CLAPACK
 
-all: liblinks phastlib
-
-sharedlib: liblinks sharedphastlib
-
-# by default, CLAPACK uses non-standard library names, which confuses
-# the compiler.  We'll just create symbolic links in ${PHAST}/lib that
-# have proper names
-liblinks: ${PHAST}/lib/liblapack.a ${PHAST}/lib/libtmg.a \
-	${PHAST}/lib/libblaswr.a 
-
-${PHAST}/lib/liblapack.a: ${CLAPACKPATH}/lapack${PLAT}.a
-	mkdir -p ${PHAST}/lib
-	${LN} -s $< $@
-
-${PHAST}/lib/libtmg.a: ${CLAPACKPATH}/tmglib${PLAT}.a
-	mkdir -p ${PHAST}/lib
-	${LN} -s $< $@
-
-${PHAST}/lib/libblaswr.a: ${CLAPACKPATH}/blas${PLAT}.a
-	mkdir -p ${PHAST}/lib
-	${LN} -s $< $@
+all: phastlib
 
-else				# no CLAPACK: links not necessary
+sharedlib: sharedphastlib
 
 all: phastlib
 
--- a/src/make-include.mk
+++ b/src/make-include.mk
@@ -120,8 +120,6 @@
     # PLAT is empty for windows builds
     PLAT =
   endif
-  # F2C libraries used by CLAPACK; most users won't need to edit
-  F2CPATH = ${CLAPACKPATH}/F2CLIBS
 endif
 
 # if neither VECLIB nor CLAPACKPATH is defined, then LAPACK will be
@@ -139,8 +137,7 @@
 else
 ifdef CLAPACKPATH
 ifneq ($(TARGETOS), Windows)
-  CFLAGS += -I${CLAPACKPATH}/INCLUDE -I${F2CPATH}
-  LIBS = -lphast -llapack -ltmg -lblaswr -lc -lf2c -lm
+  LIBS = -lphast -llapack -ltmglib -lblas -lc -lm
 else
   CFLAGS += -I${CLAPACKPATH}/INCLUDE -I${F2CPATH} -DPCRE_STATIC
   LIBS = -lphast -lm  ${CLAPACKPATH}/liblapack.a ${CLAPACKPATH}/libf2c.a ${CLAPACKPATH}/libblas.a
@@ -149,7 +146,6 @@
 # older than 3.1.1
 #CFLAGS += -I${CLAPACKPATH} -I${F2CPATH}
 #LIBS = -lphast -llapack -ltmg -lblaswr -lc -lF77 -lI77 -lm
-LIBPATH += -L${F2CPATH} 
 
 # bypass
 else
--- a/include/phast/external_libs.h
+++ b/include/phast/external_libs.h
@@ -39,10 +39,8 @@
 #else
 
 #ifndef SKIP_LAPACK 
-#include <f2c.h>  
-#include <clapack.h> 
-#define LAPACK_INT integer
-#define LAPACK_DOUBLE doublereal
+#define LAPACK_INT int
+#define LAPACK_DOUBLE double
 #endif  /*ifndef SKIP_LAPACK */
 
 #endif  /*ifdef VECLIB */
--- a/src/lib/base/phast_eigen.c
+++ b/src/lib/base/phast_eigen.c
@@ -19,7 +19,7 @@
 #include <math.h>
 #include <phast/external_libs.h>
 #include <phast/misc.h>
-
+#include <lapack.h>
 
 /* Diagonalize a square, real, nonsymmetric matrix.  Computes vector
    of eigenvalues and matrices of right and left eigenvectors,
@@ -59,7 +59,7 @@
   F77_CALL(dgeev)(&jobvl, &jobvr, &n, tmp, &n, wr, wi, vl, &n,
 		  vr, &n, work, &lwork, &info);
 #else
-  dgeev_(&jobvl, &jobvr, &n, tmp, &n, wr, wi, vl,
+  LAPACK_dgeev(&jobvl, &jobvr, &n, tmp, &n, wr, wi, vl,
 	 &n, vr, &n, work, &lwork, &info);
 #endif
 
@@ -196,7 +196,7 @@
   F77_CALL(dgeev)(&jobvl, &jobvr, &n, tmp, &n, wr, wi, NULL,
 		  &n, NULL, &n, work, &lwork, &info);
 #else
-  dgeev_(&jobvl, &jobvr, &n, tmp, &n, wr, wi, NULL,
+  LAPACK_dgeev(&jobvl, &jobvr, &n, tmp, &n, wr, wi, NULL,
          &n, NULL, &n, work, &lwork, &info);
 #endif
 
--- a/src/lib/base/phast_markov_matrix.c
+++ b/src/lib/base/phast_markov_matrix.c
@@ -21,6 +21,7 @@
 #include <phast/eigen.h>
 #include <phast/prob_vector.h>
 #include <phast/external_libs.h>
+#include <lapack.h>
 
 #define SUM_EPSILON 0.0001
 #define ELEMENT_EPSILON 0.00001
@@ -285,7 +286,7 @@
 #ifdef R_LAPACK
     F77_CALL(dgebal)(&job, &ln, mat, &ln, &ilo, &ihi, scale, &info);
 #else
-    dgebal_(&job, &ln, mat, &ln, &ilo, &ihi, scale, &info);
+    LAPACK_dgebal(&job, &ln, mat, &ln, &ilo, &ihi, scale, &info);
 #endif
     if (info != 0)
       die("Error in balancing matrix in lapack routine dgebal info=%i\n", info);
@@ -400,7 +401,7 @@
 #ifdef R_LAPACK
   F77_CALL(dgesv)(&ln, &ln, matU, &ln, ipiv, matV, &ln, &info);
 #else
-  dgesv_(&ln, &ln, matU, &ln, ipiv, matV, &ln, &info);
+  LAPACK_dgesv(&ln, &ln, matU, &ln, ipiv, matV, &ln, &info);
 #endif
   if (info !=0)
     die("Error solving U'X=V' in mm_exp_higham");
@@ -425,7 +426,7 @@
 #ifdef R_LAPACK
     F77_CALL(dgebak)(&job, &side, &ln, &ilo, &ihi, scale, &ln, mat, &ln, &info);
 #else
-    dgebak_(&job, &side, &ln, &ilo, &ihi, scale, &ln, mat, &ln, &info);
+    LAPACK_dgebak(&job, &side, &ln, &ilo, &ihi, scale, &ln, mat, &ln, &info);
 #endif
     mat_from_lapack(P->matrix, mat);
   }
--- a/src/lib/base/phast_matrix.c
+++ b/src/lib/base/phast_matrix.c
@@ -15,6 +15,7 @@
 #include <phast/external_libs.h>
 #include <math.h>
 #include <phast/misc.h>
+#include <lapack.h>
 
 Matrix *mat_new(int nrows, int ncols) {
   int i;
@@ -260,7 +261,7 @@
 #ifdef R_LAPACK
   F77_CALL(dgetrf)(&n, &n, (LAPACK_DOUBLE*)tmp, &n, ipiv, &info);
 #else
-  dgetrf_(&n, &n, (LAPACK_DOUBLE*)tmp, &n, ipiv, &info);
+  LAPACK_dgetrf(&n, &n, (LAPACK_DOUBLE*)tmp, &n, ipiv, &info);
 #endif
 
   if (info != 0) {
@@ -270,7 +271,7 @@
 #ifdef R_LAPACK
   F77_CALL(dgetri)(&n, (LAPACK_DOUBLE*)tmp, &n, ipiv, work, &lwork, &info);
 #else
-  dgetri_(&n, (LAPACK_DOUBLE*)tmp, &n, ipiv, work, &lwork, &info);
+  LAPACK_dgetri(&n, (LAPACK_DOUBLE*)tmp, &n, ipiv, work, &lwork, &info);
 #endif
 
   if (info != 0) {
