[BUG FIX] BLAS/LAPACK: allow suffixes in case BLAS/LAPACK can not provide ICB.
This commit is contained in:
@@ -2,6 +2,7 @@ arpack-ng - 3.9.0
|
||||
|
||||
[ Franck Houssen ]
|
||||
* [BUG FIX] autotools: ICB must be checked first (MPI changes compilers).
|
||||
* [BUG FIX] BLAS/LAPACK: allow suffixes in case BLAS/LAPACK can not provide ICB.
|
||||
|
||||
[ Haoyang Liu ]
|
||||
* CMake: minimum required version changed to 3.0
|
||||
|
||||
+87
-48
@@ -160,67 +160,44 @@ if (ICB)
|
||||
message("-- Fortran compiler does support iso_c_binding.")
|
||||
endif()
|
||||
else()
|
||||
# ICB saves you from old-fashion-boring-cumbersome-fortran/C crap...
|
||||
|
||||
if ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -cpp -ffixed-line-length-none")
|
||||
elseif ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "Intel")
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fpp -extend-source")
|
||||
else ()
|
||||
message(WARNING "build script does not know how to enable your Fortran compiler's preprocessor and support for lines longer than 72 characters: set them manually via FFLAGS.")
|
||||
endif ()
|
||||
|
||||
set(SCALARFUNS naitr napps naup2 naupd nconv neigh neupd ngets statn saitr sapps saup2 saupd sconv seigt seupd sgets stats getv0 sortc sortr sesrt stqrb)
|
||||
set(COMPLEXFUNS, naitr napps naup2 naupd neigh neupd ngets statn getv0 sortc)
|
||||
|
||||
set(BLASFUNS1 axpy copy gemv geqr2 lacpy lae2 lahqr lanhs larnv lartg lascl laset lasrt scal trevc trmm trsen gbmv gbtrf gbtrs gttrf gttrs pttrf pttrs)
|
||||
set(BLASFUNS2 dot ger labad laev2 lamch lanst lanv2 lapy2 larf larfg lasr nrm2 orm2r rot steqr swap)
|
||||
set(BLASFUNS3 dotc geru unm2r)
|
||||
set(BLASFUNS4 COPY LABAD LAMCH LANHS LANV2 LARFG ROT GEMV)
|
||||
set(BLASFUNS5 scnrm2 dznrm2 csscal zdscal)
|
||||
# ICB saves you from old-fashion-boring-cumbersome-fortran/C crap... For arpack symbols (only).
|
||||
|
||||
if (SYMBOLSUFFIX)
|
||||
foreach (f IN LISTS SCALARFUNS BLASFUNS1 BLASFUNS2)
|
||||
if ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -cpp -ffixed-line-length-none")
|
||||
elseif ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "Intel")
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fpp -extend-source")
|
||||
else ()
|
||||
message(WARNING "build script does not know how to enable your Fortran compiler's preprocessor and support for lines longer than 72 characters: set them manually via FFLAGS.")
|
||||
endif ()
|
||||
|
||||
set(SCALARFUNS naitr napps naup2 naupd nconv neigh neupd ngets statn saitr sapps saup2 saupd sconv seigt seupd sgets stats getv0 sortc sortr sesrt stqrb)
|
||||
set(COMPLEXFUNS, naitr napps naup2 naupd neigh neupd ngets statn getv0 sortc)
|
||||
|
||||
foreach (f IN LISTS SCALARFUNS)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Ds${f}=s${f}${SYMBOLSUFFIX} -Dd${f}=d${f}${SYMBOLSUFFIX}")
|
||||
endforeach ()
|
||||
|
||||
foreach (f IN LISTS COMPLEXFUNS BLASFUNS1 BLASFUNS3)
|
||||
foreach (f IN LISTS COMPLEXFUNS)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Dc${f}=c${f}${SYMBOLSUFFIX} -Dz${f}=z${f}${SYMBOLSUFFIX}")
|
||||
endforeach ()
|
||||
|
||||
foreach (f IN LISTS BLASFUNS4)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DS${f}=S${f}${SYMBOLSUFFIX} -DD${f}=D${f}${SYMBOLSUFFIX}")
|
||||
set(CFUNS snaupd sneupd dnaupd dneupd)
|
||||
foreach (f IN LISTS CFUNS)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${f}=${f}${SYMBOLSUFFIX}")
|
||||
list(APPEND CFUNS_SUFFIXED ${f}${SYMBOLSUFFIX})
|
||||
endforeach ()
|
||||
|
||||
foreach (f IN LISTS BLASFUNS5)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -D${f}=${f}${SYMBOLSUFFIX}")
|
||||
endforeach ()
|
||||
include(FortranCInterface)
|
||||
FortranCInterface_HEADER(FCMangle.h SYMBOLS ${CFUNS_SUFFIXED})
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DINCLUDE_FCMANGLE")
|
||||
|
||||
FortranCInterface_VERIFY()
|
||||
endif ()
|
||||
|
||||
set(CFUNS sgemm snaupd sneupd dnaupd dneupd cheev)
|
||||
foreach (f IN LISTS CFUNS)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${f}=${f}${SYMBOLSUFFIX}")
|
||||
list(APPEND CFUNS_SUFFIXED ${f}${SYMBOLSUFFIX})
|
||||
endforeach ()
|
||||
|
||||
include(FortranCInterface)
|
||||
FortranCInterface_HEADER(FCMangle.h SYMBOLS ${CFUNS_SUFFIXED})
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DINCLUDE_FCMANGLE")
|
||||
|
||||
FortranCInterface_VERIFY()
|
||||
endif ()
|
||||
|
||||
if (NOT TARGET BLAS::BLAS) # Search only if not already found by upper CMakeLists.txt
|
||||
find_package(BLAS REQUIRED)
|
||||
|
||||
# BLAS::BLAS target was already created at this point by FindBLAS.cmake if cmake version >= 3.18
|
||||
if (NOT TARGET BLAS::BLAS) # Create target "at hand" to ensure compatibility if cmake version < 3.18
|
||||
add_library(BLAS::BLAS INTERFACE IMPORTED)
|
||||
set_target_properties(BLAS::BLAS PROPERTIES INTERFACE_LINK_LIBRARIES "${BLAS_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
get_target_property(BLAS_LIBRARIES BLAS::BLAS INTERFACE_LINK_LIBRARIES) # Get variables from target (*.pc/cmake, msg).
|
||||
# Find MPI
|
||||
|
||||
if (MPI)
|
||||
if (NOT TARGET MPI::MPI_Fortran) # Search only if not already found by upper CMakeLists.txt
|
||||
@@ -274,6 +251,21 @@ if (MPI)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Find BLAS
|
||||
|
||||
if (NOT TARGET BLAS::BLAS) # Search only if not already found by upper CMakeLists.txt
|
||||
find_package(BLAS REQUIRED)
|
||||
|
||||
# BLAS::BLAS target was already created at this point by FindBLAS.cmake if cmake version >= 3.18
|
||||
if (NOT TARGET BLAS::BLAS) # Create target "at hand" to ensure compatibility if cmake version < 3.18
|
||||
add_library(BLAS::BLAS INTERFACE IMPORTED)
|
||||
set_target_properties(BLAS::BLAS PROPERTIES INTERFACE_LINK_LIBRARIES "${BLAS_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
get_target_property(BLAS_LIBRARIES BLAS::BLAS INTERFACE_LINK_LIBRARIES) # Get variables from target (*.pc/cmake, msg).
|
||||
|
||||
# Find LAPACK
|
||||
|
||||
if (NOT TARGET LAPACK::LAPACK) # Search only if not already found by upper CMakeLists.txt
|
||||
find_package(LAPACK REQUIRED)
|
||||
|
||||
@@ -285,6 +277,53 @@ if (NOT TARGET LAPACK::LAPACK) # Search only if not already found by upper CMake
|
||||
endif()
|
||||
get_target_property(LAPACK_LIBRARIES LAPACK::LAPACK INTERFACE_LINK_LIBRARIES) # Get variables from target (*.pc/cmake, msg).
|
||||
|
||||
# As BLAS/LAPACK does not provide ICB, we may have to deal with symbols the old-fashion-boring-cumbersome-fortran/C way...
|
||||
|
||||
if (SYMBOLSUFFIX)
|
||||
if ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU")
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -cpp -ffixed-line-length-none")
|
||||
elseif ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "Intel")
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fpp -extend-source")
|
||||
else ()
|
||||
message(WARNING "build script does not know how to enable your Fortran compiler's preprocessor and support for lines longer than 72 characters: set them manually via FFLAGS.")
|
||||
endif ()
|
||||
|
||||
set(BLASFUNS1 axpy copy gemv geqr2 lacpy lae2 lahqr lanhs larnv lartg lascl laset lasrt scal trevc trmm trsen gbmv gbtrf gbtrs gttrf gttrs pttrf pttrs)
|
||||
set(BLASFUNS2 dot ger labad laev2 lamch lanst lanv2 lapy2 larf larfg lasr nrm2 orm2r rot steqr swap)
|
||||
set(BLASFUNS3 dotc geru unm2r)
|
||||
set(BLASFUNS4 COPY LABAD LAMCH LANHS LANV2 LARFG ROT GEMV)
|
||||
set(BLASFUNS5 scnrm2 dznrm2 csscal zdscal)
|
||||
|
||||
foreach (f IN LISTS BLASFUNS1 BLASFUNS2)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Ds${f}=s${f}${SYMBOLSUFFIX} -Dd${f}=d${f}${SYMBOLSUFFIX}")
|
||||
endforeach ()
|
||||
|
||||
foreach (f IN LISTS BLASFUNS1 BLASFUNS3)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Dc${f}=c${f}${SYMBOLSUFFIX} -Dz${f}=z${f}${SYMBOLSUFFIX}")
|
||||
endforeach ()
|
||||
|
||||
foreach (f IN LISTS BLASFUNS4)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DS${f}=S${f}${SYMBOLSUFFIX} -DD${f}=D${f}${SYMBOLSUFFIX}")
|
||||
endforeach ()
|
||||
|
||||
foreach (f IN LISTS BLASFUNS5)
|
||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -D${f}=${f}${SYMBOLSUFFIX}")
|
||||
endforeach ()
|
||||
|
||||
set(CFUNS sgemm cheev)
|
||||
foreach (f IN LISTS CFUNS)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${f}=${f}${SYMBOLSUFFIX}")
|
||||
list(APPEND CFUNS_SUFFIXED ${f}${SYMBOLSUFFIX})
|
||||
endforeach ()
|
||||
|
||||
include(FortranCInterface)
|
||||
FortranCInterface_HEADER(FCMangle.h SYMBOLS ${CFUNS_SUFFIXED})
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DINCLUDE_FCMANGLE")
|
||||
|
||||
FortranCInterface_VERIFY()
|
||||
endif ()
|
||||
|
||||
if (MPI)
|
||||
set(parpackutil_DIR ${arpack_SOURCE_DIR}/PARPACK/UTIL/)
|
||||
set(parpacksrc_DIR ${arpack_SOURCE_DIR}/PARPACK/SRC/)
|
||||
|
||||
+55
-21
@@ -194,7 +194,7 @@ if test x"$enable_icb" != x"no"; then
|
||||
fi
|
||||
AX_CXX_COMPILE_STDCXX(11)
|
||||
else
|
||||
# ICB saves you from old-fashion-boring-cumbersome-fortran/C crap...
|
||||
# ICB saves you from old-fashion-boring-cumbersome-fortran/C crap... For arpack symbols (only).
|
||||
|
||||
if test x"$SYMBOLSUFFIX" != x""; then
|
||||
dnl Need to rely on non-F77 features
|
||||
@@ -210,48 +210,82 @@ else
|
||||
SCALARFUNS="naitr napps naup2 naupd nconv neigh neupd ngets statn saitr sapps saup2 saupd sconv seigt seupd sgets stats getv0 sortc sortr sesrt stqrb"
|
||||
COMPLEXFUNS="naitr napps naup2 naupd neigh neupd ngets statn getv0 sortc"
|
||||
|
||||
BLASFUNS1="axpy copy gemv geqr2 lacpy lae2 lahqr lanhs larnv lartg lascl laset lasrt scal trevc trmm trsen gbmv gbtrf gbtrs gttrf gttrs pttrf pttrs"
|
||||
BLASFUNS2="dot ger labad laev2 lamch lanst lanv2 lapy2 larf larfg lasr nrm2 orm2r rot steqr swap"
|
||||
BLASFUNS3="dotc geru unm2r"
|
||||
BLASFUNS4="COPY LABAD LAMCH LANHS LANV2 LARFG ROT GEMV"
|
||||
BLASFUNS5="scnrm2 dznrm2 csscal zdscal"
|
||||
|
||||
FUNS1="$SCALARFUNS $BLASFUNS1 $BLASFUNS2"
|
||||
FUNS1="$SCALARFUNS"
|
||||
for f in $FUNS1
|
||||
do
|
||||
FFLAGS="$FFLAGS -Ds$f=s$f$SYMBOLSUFFIX -Dd$f=d$f$SYMBOLSUFFIX"
|
||||
done
|
||||
|
||||
FUNS2="$COMPLEXFUNS $BLASFUNS1 $BLASFUNS3"
|
||||
FUNS2="$COMPLEXFUNS"
|
||||
for f in $FUNS2
|
||||
do
|
||||
FFLAGS="$FFLAGS -Dc$f=c$f$SYMBOLSUFFIX -Dz$f=z$f$SYMBOLSUFFIX"
|
||||
done
|
||||
|
||||
for f in $BLASFUNS4
|
||||
do
|
||||
FFLAGS="$FFLAGS -DS$f=S$f$SYMBOLSUFFIX -DD$f=D$f$SYMBOLSUFFIX"
|
||||
done
|
||||
|
||||
for f in $BLASFUNS5
|
||||
do
|
||||
FFLAGS="$FFLAGS -D$f=$f$SYMBOLSUFFIX -D$f=$f$SYMBOLSUFFIX"
|
||||
done
|
||||
fi
|
||||
|
||||
dnl Both a lowercase and uppercase variable are needed
|
||||
dnl since the macro changes the case of the whole expression
|
||||
symbolsuffix=$SYMBOLSUFFIX
|
||||
AC_F77_FUNC(sgemm$SYMBOLSUFFIX, sgemmsuff)
|
||||
AC_F77_FUNC(snaupd$SYMBOLSUFFIX, snaupdsuff)
|
||||
AC_F77_FUNC(sneupd$SYMBOLSUFFIX, sneupdsuff)
|
||||
AC_F77_FUNC(dnaupd$SYMBOLSUFFIX, dnaupdsuff)
|
||||
AC_F77_FUNC(dneupd$SYMBOLSUFFIX, dneupdsuff)
|
||||
dnl Needed for BLAS check and for tests (even when suffix is empty)
|
||||
CPPFLAGS="$CPPFLAGS -Dsnaupd=$snaupdsuff -Dsneupd=$sneupdsuff -Ddnaupd=$dnaupdsuff -Ddneupd=$dneupdsuff"
|
||||
fi
|
||||
|
||||
dnl As BLAS/LAPACK does not provide ICB, we may have to deal with symbols the old-fashion-boring-cumbersome-fortran/C way...
|
||||
|
||||
if test x"$SYMBOLSUFFIX" != x""; then
|
||||
dnl Need to rely on non-F77 features
|
||||
AC_FC_LINE_LENGTH(unlimited)
|
||||
FFLAGS="$FFLAGS $ac_cv_fc_line_length"
|
||||
|
||||
AC_LANG_PUSH([Fortran 77])
|
||||
AX_CHECK_COMPILE_FLAG(-cpp, FFLAGS="$FFLAGS -cpp",
|
||||
AX_CHECK_COMPILE_FLAG(-fpp, FFLAGS="$FFLAGS -fpp",
|
||||
AC_MSG_WARN([configure does not know how to enable your Fortran compiler's preprocessor: set it manually via FFLAGS.])))
|
||||
AC_LANG_POP([Fortran 77])
|
||||
|
||||
BLASFUNS1="axpy copy gemv geqr2 lacpy lae2 lahqr lanhs larnv lartg lascl laset lasrt scal trevc trmm trsen gbmv gbtrf gbtrs gttrf gttrs pttrf pttrs"
|
||||
BLASFUNS2="dot ger labad laev2 lamch lanst lanv2 lapy2 larf larfg lasr nrm2 orm2r rot steqr swap"
|
||||
BLASFUNS3="dotc geru unm2r"
|
||||
BLASFUNS4="COPY LABAD LAMCH LANHS LANV2 LARFG ROT GEMV"
|
||||
BLASFUNS5="scnrm2 dznrm2 csscal zdscal"
|
||||
|
||||
FUNS1="$BLASFUNS1 $BLASFUNS2"
|
||||
for f in $FUNS1
|
||||
do
|
||||
FFLAGS="$FFLAGS -Ds$f=s$f$SYMBOLSUFFIX -Dd$f=d$f$SYMBOLSUFFIX"
|
||||
done
|
||||
|
||||
FUNS2="$BLASFUNS1 $BLASFUNS3"
|
||||
for f in $FUNS2
|
||||
do
|
||||
FFLAGS="$FFLAGS -Dc$f=c$f$SYMBOLSUFFIX -Dz$f=z$f$SYMBOLSUFFIX"
|
||||
done
|
||||
|
||||
for f in $BLASFUNS4
|
||||
do
|
||||
FFLAGS="$FFLAGS -DS$f=S$f$SYMBOLSUFFIX -DD$f=D$f$SYMBOLSUFFIX"
|
||||
done
|
||||
|
||||
for f in $BLASFUNS5
|
||||
do
|
||||
FFLAGS="$FFLAGS -D$f=$f$SYMBOLSUFFIX -D$f=$f$SYMBOLSUFFIX"
|
||||
done
|
||||
|
||||
dnl Both a lowercase and uppercase variable are needed
|
||||
dnl since the macro changes the case of the whole expression
|
||||
symbolsuffix=$SYMBOLSUFFIX
|
||||
AC_F77_FUNC(sgemm$SYMBOLSUFFIX, sgemmsuff)
|
||||
AC_F77_FUNC(cheev$SYMBOLSUFFIX, cheevsuff)
|
||||
dnl Needed for BLAS check and for tests (even when suffix is empty)
|
||||
CPPFLAGS="$CPPFLAGS -Dsgemm=$sgemmsuff -Dsnaupd=$snaupdsuff -Dsneupd=$sneupdsuff -Ddnaupd=$dnaupdsuff -Ddneupd=$dneupdsuff -Dcheev=$cheevsuff"
|
||||
CPPFLAGS="$CPPFLAGS -Dsgemm=$sgemmsuff -Dcheev=$cheevsuff"
|
||||
fi
|
||||
|
||||
dnl Set conditional for Makefiles.
|
||||
|
||||
AM_CONDITIONAL([MPI], [test x"$enable_mpi" != x"no"])
|
||||
AM_CONDITIONAL([BLACS], [false])
|
||||
AM_CONDITIONAL([ICB], [test x"$enable_icb" != x"no"])
|
||||
|
||||
Reference in New Issue
Block a user