diff --git a/Makefile b/Makefile
index 20ae6404c..a829df788 100644
--- a/Makefile
+++ b/Makefile
@@ -162,33 +162,29 @@ MK_BLAS_FLAMEC_OBJS :=
MK_LAPACK_FLAMEC_SRC :=
MK_LAPACK_FLAMEC_OBJS :=
+MK_FLABLAS_F2C_SRC :=
+MK_FLABLAS_F2C_OBJS :=
MK_MAP_LAPACK2FLAMEC_SRC :=
MK_MAP_LAPACK2FLAMEC_OBJS :=
-MK_MAP_LAPACK2FLAMEC_F2C_SRC :=
-MK_MAP_LAPACK2FLAMEC_F2C_OBJS :=
-
-MK_MAP_LAPACK2FLAMEC_F2C_FLAMEC_SRC :=
-MK_MAP_LAPACK2FLAMEC_F2C_FLAMEC_OBJS :=
-
-MK_MAP_LAPACK2FLAMEC_F2C_INSTALL_SRC :=
-MK_MAP_LAPACK2FLAMEC_F2C_INSTALL_OBJS :=
-
MK_MAP_LAPACK2FLASH_SRC :=
MK_MAP_LAPACK2FLASH_OBJS :=
-MK_MAP_LAPACK2FLASH_F2C_SRC :=
-MK_MAP_LAPACK2FLASH_F2C_OBJS :=
+MK_MAP_FORTRAN_SRC :=
+MK_MAP_FORTRAN_OBJS :=
-MK_MAP_LAPACK2FLASH_F2C_FLAMEC_SRC :=
-MK_MAP_LAPACK2FLASH_F2C_FLAMEC_OBJS :=
+MK_MAP_F2C_SRC :=
+MK_MAP_F2C_OBJS :=
-MK_MAP_LAPACK2FLASH_F2C_INSTALL_SRC :=
-MK_MAP_LAPACK2FLASH_F2C_INSTALL_OBJS :=
+MK_MAP_INSTALL_SRC :=
+MK_MAP_INSTALL_OBJS :=
-MK_FLABLAS_F2C_SRC :=
-MK_FLABLAS_F2C_OBJS :=
+MK_MAP_FLAMEC_SRC :=
+MK_MAP_FLAMEC_OBJS :=
+
+MK_MAP_LAPACKCHECK_SRC :=
+MK_MAP_LAPACKCHECK_OBJS :=
# --- Define install target names for static libraries ---
@@ -369,41 +365,38 @@ FFLAGS := $(FFLAGS) $(INCLUDE_PATHS)
# directory with the base object directory, and also replacing the source file
# suffix (ie: '.c' or '.f') with '.o'.
-MK_FLABLAS_F2C_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_FLABLAS_F2C_SRC)))
-
-MK_BASE_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_BASE_FLAMEC_SRC)))
+MK_BASE_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_BASE_FLAMEC_SRC)))
-MK_BLAS_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_BLAS_FLAMEC_SRC)))
+MK_BLAS_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_BLAS_FLAMEC_SRC)))
-MK_LAPACK_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_LAPACK_FLAMEC_SRC)))
+MK_LAPACK_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_LAPACK_FLAMEC_SRC)))
-MK_MAP_LAPACK2FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLAMEC_SRC)))
+MK_FLABLAS_F2C_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_FLABLAS_F2C_SRC)))
-MK_MAP_LAPACK2FLAMEC_F2C_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLAMEC_F2C_SRC)))
+MK_MAP_LAPACK2FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_MAP_LAPACK2FLAMEC_SRC)))
-MK_MAP_LAPACK2FLAMEC_F2C_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLAMEC_F2C_FLAMEC_SRC)))
+MK_MAP_LAPACK2FLASH_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_MAP_LAPACK2FLASH_SRC)))
-MK_MAP_LAPACK2FLAMEC_F2C_INSTALL_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLAMEC_F2C_INSTALL_SRC)))
+MK_MAP_FORTRAN_OBJS := $(patsubst $(SRC_PATH)/%.f, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.f, $(MK_MAP_FORTRAN_SRC)))
-MK_MAP_LAPACK2FLASH_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLASH_SRC)))
+MK_MAP_F2C_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_MAP_F2C_SRC)))
-MK_MAP_LAPACK2FLASH_F2C_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLASH_F2C_SRC)))
+MK_MAP_INSTALL_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_MAP_INSTALL_SRC)))
-MK_MAP_LAPACK2FLASH_F2C_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLASH_F2C_FLAMEC_SRC)))
+MK_MAP_FLAMEC_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_MAP_FLAMEC_SRC)))
-MK_MAP_LAPACK2FLASH_F2C_INSTALL_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
- $(filter %.c, $(MK_MAP_LAPACK2FLASH_F2C_INSTALL_SRC)))
+MK_MAP_LAPACKCHECK_OBJS := $(patsubst $(SRC_PATH)/%.c, $(BASE_OBJ_PATH)/%.o, \
+ $(filter %.c, $(MK_MAP_LAPACKCHECK_SRC)))
# Combine the base, blas, and lapack libraries.
MK_ALL_FLAMEC_OBJS := $(MK_BASE_FLAMEC_OBJS) \
@@ -413,30 +406,49 @@ MK_ALL_FLAMEC_OBJS := $(MK_BASE_FLAMEC_OBJS) \
# Prepend the flablas source code files, if requested
# LAPACK
+# Use legacy (3.5.0) f2c version of lapack
+# or default to the latest integrated version
+# Only build these when lapack2flame or lapack2flash is enabled
ifeq ($(FLA_ENABLE_LAPACK2FLAME),yes)
MK_ALL_FLAMEC_OBJS := $(MK_MAP_LAPACK2FLAMEC_OBJS) \
- $(MK_MAP_LAPACK2FLAMEC_F2C_OBJS) \
- $(MK_MAP_LAPACK2FLAMEC_F2C_FLAMEC_OBJS) \
- $(MK_MAP_LAPACK2FLAMEC_F2C_INSTALL_OBJS) \
+ $(MK_MAP_INSTALL_OBJS) \
+ $(MK_MAP_FLAMEC_OBJS) \
+ $(MK_MAP_LAPACKCHECK_OBJS) \
+ $(MK_ALL_FLAMEC_OBJS)
+
+ifeq ($(FLA_ENABLE_LEGACY_LAPACK),yes)
+MK_ALL_FLAMEC_OBJS := $(MK_MAP_F2C_OBJS) \
+ $(MK_ALL_FLAMEC_OBJS)
+else
+MK_ALL_FLAMEC_OBJS := $(MK_MAP_FORTRAN_OBJS) \
$(MK_ALL_FLAMEC_OBJS)
endif
+endif
ifeq ($(FLA_ENABLE_LAPACK2FLASH),yes)
MK_ALL_FLAMEC_OBJS := $(MK_MAP_LAPACK2FLASH_OBJS) \
- $(MK_MAP_LAPACK2FLASH_F2C_OBJS) \
- $(MK_MAP_LAPACK2FLASH_F2C_FLAMEC_OBJS) \
- $(MK_MAP_LAPACK2FLASH_F2C_INSTALL_OBJS) \
+ $(MK_MAP_INSTALL_OBJS) \
+ $(MK_MAP_FLAMEC_OBJS) \
+ $(MK_MAP_LAPACKCHECK_OBJS) \
+ $(MK_ALL_FLAMEC_OBJS)
+
+ifeq ($(FLA_ENABLE_LEGACY_LAPACK),yes)
+MK_ALL_FLAMEC_OBJS := $(MK_MAP_F2C_OBJS) \
$(MK_ALL_FLAMEC_OBJS)
+else
+MK_ALL_FLAMEC_OBJS := $(MK_MAP_FORTRAN_OBJS) \
+ $(MK_ALL_FLAMEC_OBJS)
+endif
endif
# BLAS
ifeq ($(FLA_ENABLE_BUILTIN_BLAS),yes)
ifeq ($(FLA_ENABLE_LAPACK2FLAME),no)
-MK_FLABLAS_F2C_OBJS := $(MK_MAP_LAPACK2FLAMEC_F2C_INSTALL_OBJS) \
+MK_FLABLAS_F2C_OBJS := $(MK_MAP_INSTALL_OBJS) \
$(MK_FLABLAS_F2C_OBJS)
endif
ifeq ($(FLA_ENABLE_LAPACK2FLASH),no)
-MK_FLABLAS_F2C_OBJS := $(MK_MAP_LAPACK2FLASH_F2C_INSTALL_OBJS) \
+MK_FLABLAS_F2C_OBJS := $(MK_MAP_INSTALL_OBJS) \
$(MK_FLABLAS_F2C_OBJS)
endif
MK_ALL_FLAMEC_OBJS := $(MK_FLABLAS_F2C_OBJS) \
@@ -558,6 +570,18 @@ ifeq ($(FLA_ENABLE_MAX_ARG_LIST_HACK),yes)
@echo $@ >> $(AR_OBJ_LIST_FILE)
endif
+# Default Fortran compilation rules
+# Might need -fallow-argument-mismatch for newer gfortran (untested)
+$(BASE_OBJ_PATH)/%.o: $(SRC_PATH)/%.f $(CONFIG_MK_FILE) $(HEADERS_TO_FLATTEN)
+ifeq ($(ENABLE_VERBOSE),yes)
+ $(F77) -cpp -c $< -o $@
+else
+ @echo "Compiling $<"
+ @$(F77) -cpp -c $< -o $@
+endif
+ifeq ($(FLA_ENABLE_MAX_ARG_LIST_HACK),yes)
+ @echo $@ >> $(AR_OBJ_LIST_FILE)
+endif
# --- All-purpose library rule (static and shared) ---
diff --git a/build/FLA_config.h.in b/build/FLA_config.h.in
index e55e13577..7d586ba70 100644
--- a/build/FLA_config.h.in
+++ b/build/FLA_config.h.in
@@ -70,6 +70,10 @@
by FLA_MEMORY_ALIGNMENT_BOUNDARY. */
#undef FLA_ENABLE_LDIM_ALIGNMENT
+/* Determines whether to use the legacy f2c files or the newer fortran version
+ of lapack with lapack2flame or lapack2flash. */
+#undef FLA_ENABLE_LEGACY_LAPACK
+
/* Determines whether memory is aligned to user-requested boundaries. */
#undef FLA_ENABLE_MEMORY_ALIGNMENT
diff --git a/build/ac-macros/fla_check_enable_legacy_lapack.m4 b/build/ac-macros/fla_check_enable_legacy_lapack.m4
new file mode 100644
index 000000000..9028acfe6
--- /dev/null
+++ b/build/ac-macros/fla_check_enable_legacy_lapack.m4
@@ -0,0 +1,52 @@
+AC_DEFUN([FLA_CHECK_ENABLE_LEGACY_LAPACK],
+[
+ dnl Tell the user we're checking whether to enable the option.
+ AC_MSG_CHECKING([whether user requested the to use legacy lapack with lapack2flame or lapack2flash])
+
+ dnl Determine whether the user gave the --enable-