ENH: FindBLAS.cmake, FindLAPACK.cmake modules were redesigned so now you have three new variables BLA_VENDOR (you can specify the VENDOR), BLA_STATIC (gets the static version of libs), BLA_F95 (gets the fortran 95 interface). BLA_VENDOR can be specified as an environment variable. Intel mkls libs need FindThreads to be found correctly so you will need to enable the C/CXX

This commit is contained in:
Alin Elena 2008-07-22 07:15:31 -04:00
parent 6db292d656
commit a57fc5585a
3 changed files with 733 additions and 561 deletions

View File

@ -24,7 +24,7 @@ macro(CHECK_FORTRAN_FUNCTION_EXISTS FUNCTION VARIABLE)
program TESTFortran program TESTFortran
external ${FUNCTION} external ${FUNCTION}
call ${FUNCTION}() call ${FUNCTION}()
end end program TESTFortran
" "
) )
try_compile(${VARIABLE} try_compile(${VARIABLE}
@ -33,6 +33,7 @@ macro(CHECK_FORTRAN_FUNCTION_EXISTS FUNCTION VARIABLE)
CMAKE_FLAGS "${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}" CMAKE_FLAGS "${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}"
OUTPUT_VARIABLE OUTPUT OUTPUT_VARIABLE OUTPUT
) )
# message(STATUS "${OUTPUT}")
if(${VARIABLE}) if(${VARIABLE})
set(${VARIABLE} 1 CACHE INTERNAL "Have Fortran function ${FUNCTION}") set(${VARIABLE} 1 CACHE INTERNAL "Have Fortran function ${FUNCTION}")
message(STATUS "Looking for Fortran ${FUNCTION} - found") message(STATUS "Looking for Fortran ${FUNCTION} - found")

View File

@ -1,5 +1,4 @@
# - Find a Fortran BLAS library # - Find BLAS library
# N.B. Fortran only. This module cannot be used to find a C BLAS library.
# This module finds an installed fortran library that implements the BLAS # This module finds an installed fortran library that implements the BLAS
# linear-algebra interface (see http://www.netlib.org/blas/). # linear-algebra interface (see http://www.netlib.org/blas/).
# The list of libraries searched for is taken # The list of libraries searched for is taken
@ -13,9 +12,19 @@
# and -L). # and -L).
# BLAS_LIBRARIES - uncached list of libraries (using full path name) to # BLAS_LIBRARIES - uncached list of libraries (using full path name) to
# link against to use BLAS # link against to use BLAS
# BLAS95_LIBRARIES - uncached list of libraries (using full path name) # to link against to use BLAS95 interface # BLAS95_LIBRARIES - uncached list of libraries (using full path name)
# # to link against to use BLAS95 interface
# BLAS95_FOUND - set to true if a library implementing the BLAS f95 interface
# is found
# BLA_STATIC if set on this determines what kind of linkage we do (static)
# BLA_VENDOR if set checks only the specified vendor, if not set checks
# all the posibilities
# BLA_F95 if set on tries to find the f95 interfaces for BLAS/LAPACK
##########
### List of vendors (BLA_VENDOR) valid in this module
## ATLAS, PhiPACK,CXML,DXML,SunPerf,SCSL,SGIMATH,IBMESSL,Intel10_32 (intel mkl v10 32 bit),Intel10_64lp (intel mkl v10 64 bit,lp thread model, lp64 model),
## Intel( older versions of mkl 32 and 64 bit), ACML,Apple, NAS, Generic
# C/CXX should be enabled to use Intel mkl
get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES) get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES)
if(NOT _LANGUAGES_ MATCHES Fortran) if(NOT _LANGUAGES_ MATCHES Fortran)
if(BLAS_FIND_REQUIRED) if(BLAS_FIND_REQUIRED)
@ -28,7 +37,7 @@ endif(NOT _LANGUAGES_ MATCHES Fortran)
include(CheckFortranFunctionExists) include(CheckFortranFunctionExists)
macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list) macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _threads)
# This macro checks for the existence of the combination of fortran libraries # This macro checks for the existence of the combination of fortran libraries
# given by _list. If the combination is found, this macro checks (using the # given by _list. If the combination is found, this macro checks (using the
# Check_Fortran_Function_Exists macro) whether can link against that library # Check_Fortran_Function_Exists macro) whether can link against that library
@ -40,310 +49,405 @@ macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list)
# N.B. _prefix is the prefix applied to the names of all cached variables that # N.B. _prefix is the prefix applied to the names of all cached variables that
# are generated internally and marked advanced by this macro. # are generated internally and marked advanced by this macro.
set(_libraries_work TRUE) set(_libraries_work TRUE)
set(${LIBRARIES}) set(${LIBRARIES})
set(_combined_name) set(_combined_name)
foreach(_library ${_list}) foreach(_library ${_list})
set(_combined_name ${_combined_name}_${_library}) set(_combined_name ${_combined_name}_${_library})
if(_libraries_work)
if ( WIN32 )
find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library}
PATHS ENV LIB
)
endif ( WIN32 )
if ( APPLE )
find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library}
PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH
)
else ( APPLE )
find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library}
PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH
)
endif( APPLE )
mark_as_advanced(${_prefix}_${_library}_LIBRARY)
set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
endif(_libraries_work)
endforeach(_library ${_list})
if(_libraries_work) if(_libraries_work)
# Test this combination of libraries. if ( WIN32 )
set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}}) if(BLA_STATIC)
#message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}") set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll")
check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS) endif(BLA_STATIC)
set(CMAKE_REQUIRED_LIBRARIES) find_library(${_prefix}_${_library}_LIBRARY
mark_as_advanced(${_prefix}${_combined_name}_WORKS) NAMES ${_library}
set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) PATHS ENV LIB
)
endif ( WIN32 )
if ( APPLE )
if(BLA_STATIC)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll")
endif(BLA_STATIC)
find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library}
PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH
)
else ( APPLE )
if(BLA_STATIC)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
endif(BLA_STATIC)
find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library}
PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH
)
endif( APPLE )
mark_as_advanced(${_prefix}_${_library}_LIBRARY)
set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
endif(_libraries_work) endif(_libraries_work)
if(NOT _libraries_work) endforeach(_library ${_list})
set(${LIBRARIES} FALSE) if(_libraries_work)
endif(NOT _libraries_work) # Test this combination of libraries.
#message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}") set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_threads})
# message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS)
set(CMAKE_REQUIRED_LIBRARIES)
mark_as_advanced(${_prefix}${_combined_name}_WORKS)
set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
endif(_libraries_work)
if(NOT _libraries_work)
set(${LIBRARIES} FALSE)
endif(NOT _libraries_work)
#message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
endmacro(Check_Fortran_Libraries) endmacro(Check_Fortran_Libraries)
set(BLAS_LINKER_FLAGS) set(BLAS_LINKER_FLAGS)
set(BLAS_LIBRARIES) set(BLAS_LIBRARIES)
set(BLAS95_LIBRARIES) set(BLAS95_LIBRARIES)
if ($ENV{BLA_VENDOR} MATCHES ".+")
set(BLA_VENDOR $ENV{BLA_VENDOR})
else ($ENV{BLA_VENDOR} MATCHES ".+")
if(NOT BLA_VENDOR)
set(BLA_VENDOR "All")
endif(NOT BLA_VENDOR)
endif ($ENV{BLA_VENDOR} MATCHES ".+")
if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
if(NOT BLAS_LIBRARIES)
# BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
cblas_dgemm cblas_dgemm
"" ""
"cblas;f77blas;atlas" "cblas;f77blas;atlas"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All")
# BLAS in PhiPACK libraries? (requires generic BLAS lib, too) # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"sgemm;dgemm;blas" "sgemm;dgemm;blas"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All")
# BLAS in Alpha CXML library? # BLAS in Alpha CXML library?
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"cxml" "cxml"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All")
# BLAS in Alpha DXML library? (now called CXML, see above) # BLAS in Alpha DXML library? (now called CXML, see above)
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"dxml" "dxml"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All")
# BLAS in Sun Performance library? # BLAS in Sun Performance library?
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"-xlic_lib=sunperf" "-xlic_lib=sunperf"
"sunperf;sunmath" "sunperf;sunmath"
) ""
)
if(BLAS_LIBRARIES) if(BLAS_LIBRARIES)
set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf") set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf")
endif(BLAS_LIBRARIES) endif(BLAS_LIBRARIES)
endif(NOT BLAS_LIBRARIES)
endif(NOT BLAS_LIBRARIES) endif (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All")
# BLAS in SCSL library? (SGI/Cray Scientific Library) # BLAS in SCSL library? (SGI/Cray Scientific Library)
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"scsl" "scsl"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All")
# BLAS in SGIMATH library? # BLAS in SGIMATH library?
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"complib.sgimath" "complib.sgimath"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All")
# BLAS in IBM ESSL library? (requires generic BLAS lib, too) # BLAS in IBM ESSL library? (requires generic BLAS lib, too)
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"essl;blas" "essl;blas"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All")
#BLAS in intel mkl 10 library? (em64t 64bit)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl_intel_lp64;mkl_intel_thread;mkl_core;guide;pthread"
)
endif(NOT BLAS_LIBRARIES)
if(NOT BLAS95_LIBRARIES)
check_fortran_libraries(
BLAS95_LIBRARIES
BLAS
sgemm
""
"mkl_blas95;mkl_intel_lp64;mkl_intel_thread;mkl_core;guide;pthread"
)
endif(NOT BLAS95_LIBRARIES)
### windows version of intel mkl 10
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
SGEMM
""
"mkl_c_dll;mkl_intel_thread_dll;mkl_core_dll;libguide40"
)
endif(NOT BLAS_LIBRARIES)
if(NOT BLAS95_LIBRARIES)
check_fortran_libraries(
BLAS95_LIBRARIES
BLAS
sgemm
""
"mkl_blas95;mkl_intel_c;mkl_intel_thread;mkl_core;libguide40"
)
endif(NOT BLAS95_LIBRARIES)
# linux 32 bit
if(NOT BLAS95_LIBRARIES)
check_fortran_libraries(
BLAS95_LIBRARIES
BLAS
sgemm
""
"mkl_blas95;mkl_intel;mkl_intel_thread;mkl_core;guide;pthread"
)
endif(NOT BLAS95_LIBRARIES)
#older vesions of intel mkl libs
# BLAS in intel mkl library? (shared)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl;guide;pthread"
)
endif(NOT BLAS_LIBRARIES)
#BLAS in intel mkl library? (static, 32bit)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl_ia32;guide;pthread"
)
endif(NOT BLAS_LIBRARIES)
#BLAS in intel mkl library? (static, em64t 64bit)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl_em64t;guide;pthread"
)
endif(NOT BLAS_LIBRARIES)
#BLAS in acml library? #BLAS in acml library?
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "ACML" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"acml" "acml"
) ""
endif(NOT BLAS_LIBRARIES) )
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "ACML" OR BLA_VENDOR STREQUAL "All")
# Apple BLAS library? # Apple BLAS library?
if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES) if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
cblas_dgemm cblas_dgemm
"" ""
"Accelerate" "Accelerate"
) ""
)
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
endif(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
if ( NOT BLAS_LIBRARIES )
if ( NOT BLAS_LIBRARIES ) check_fortran_libraries(
check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
cblas_dgemm cblas_dgemm
"" ""
"vecLib" "vecLib"
""
) )
endif ( NOT BLAS_LIBRARIES ) endif ( NOT BLAS_LIBRARIES )
endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
# Generic BLAS library? # Generic BLAS library?
if(NOT BLAS_LIBRARIES) if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
if(NOT BLAS_LIBRARIES)
check_fortran_libraries( check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"blas"
""
)
endif(NOT BLAS_LIBRARIES)
endif (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
#BLAS in intel mkl 10 library? (em64t 64bit)
if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
find_package(Threads)
else(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
find_package(Threads REQUIRED)
endif(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED)
if (WIN32)
if(BLA_F95)
if(NOT BLAS95_LIBRARIES)
check_fortran_libraries(
BLAS95_LIBRARIES
BLAS
sgemm
""
"mkl_blas95;mkl_intel_c;mkl_intel_thread;mkl_core;libguide40"
""
)
endif(NOT BLAS95_LIBRARIES)
else(BLA_F95)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
SGEMM
""
"mkl_c_dll;mkl_intel_thread_dll;mkl_core_dll;libguide40"
""
)
endif(NOT BLAS_LIBRARIES)
endif(BLA_F95)
else(WIN32)
if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
if(BLA_F95)
if(NOT BLAS95_LIBRARIES)
check_fortran_libraries(
BLAS95_LIBRARIES
BLAS
sgemm
""
"mkl_blas95;mkl_intel;mkl_intel_thread;mkl_core;guide"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT BLAS95_LIBRARIES)
else(BLA_F95)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl_intel;mkl_intel_thread;mkl_core;guide"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT BLAS_LIBRARIES)
endif(BLA_F95)
endif (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All")
if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
if(BLA_F95)
if(NOT BLAS95_LIBRARIES)
check_fortran_libraries(
BLAS95_LIBRARIES
BLAS
sgemm
""
"mkl_blas95;mkl_intel_lp64;mkl_intel_thread;mkl_core;guide"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT BLAS95_LIBRARIES)
else(BLA_F95)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl_intel_lp64;mkl_intel_thread;mkl_core;guide"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT BLAS_LIBRARIES)
endif(BLA_F95)
endif (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All")
endif (WIN32)
#older vesions of intel mkl libs
# BLAS in intel mkl library? (shared)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES BLAS_LIBRARIES
BLAS BLAS
sgemm sgemm
"" ""
"blas" "mkl;guide"
"${CMAKE_THREAD_LIBS_INIT}"
) )
endif(NOT BLAS_LIBRARIES) endif(NOT BLAS_LIBRARIES)
#BLAS in intel mkl library? (static, 32bit)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl_ia32;guide"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT BLAS_LIBRARIES)
#BLAS in intel mkl library? (static, em64t 64bit)
if(NOT BLAS_LIBRARIES)
check_fortran_libraries(
BLAS_LIBRARIES
BLAS
sgemm
""
"mkl_em64t;guide"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT BLAS_LIBRARIES)
endif (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
endif (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
if(BLAS_LIBRARIES) if(BLA_F95)
if(BLAS95_LIBRARIES)
set(BLAS95_FOUND TRUE)
else(BLAS95_LIBRARIES)
set(BLAS95_FOUND FALSE)
endif(BLAS95_LIBRARIES)
if(NOT BLAS_FIND_QUIETLY)
if(BLAS95_FOUND)
message(STATUS "A library with BLAS95 API found.")
else(BLAS95_FOUND)
if(BLAS_FIND_REQUIRED)
message(FATAL_ERROR
"A required library with BLAS95 API not found. Please specify library location.")
else(BLAS_FIND_REQUIRED)
message(STATUS
"A library with BLAS95 API not found. Please specify library location.")
endif(BLAS_FIND_REQUIRED)
endif(BLAS95_FOUND)
endif(NOT BLAS_FIND_QUIETLY)
set(BLAS_FOUND TRUE) set(BLAS_FOUND TRUE)
else(BLAS_LIBRARIES) set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}")
set(BLAS_FOUND FALSE) else(BLA_F95)
endif(BLAS_LIBRARIES) if(BLAS_LIBRARIES)
set(BLAS_FOUND TRUE)
else(BLAS_LIBRARIES)
set(BLAS_FOUND FALSE)
endif(BLAS_LIBRARIES)
if(NOT BLAS_FIND_QUIETLY) if(NOT BLAS_FIND_QUIETLY)
if(BLAS_FOUND) if(BLAS_FOUND)
message(STATUS "A library with BLAS API found.") message(STATUS "A library with BLAS API found.")
else(BLAS_FOUND) else(BLAS_FOUND)
if(BLAS_FIND_REQUIRED) if(BLAS_FIND_REQUIRED)
message(FATAL_ERROR message(FATAL_ERROR
"A required library with BLAS API not found. Please specify library location." "A required library with BLAS API not found. Please specify library location."
) )
else(BLAS_FIND_REQUIRED) else(BLAS_FIND_REQUIRED)
message(STATUS message(STATUS
"A library with BLAS API not found. Please specify library location." "A library with BLAS API not found. Please specify library location."
) )
endif(BLAS_FIND_REQUIRED) endif(BLAS_FIND_REQUIRED)
endif(BLAS_FOUND) endif(BLAS_FOUND)
endif(NOT BLAS_FIND_QUIETLY) endif(NOT BLAS_FIND_QUIETLY)
endif(BLA_F95)

View File

@ -1,5 +1,4 @@
# - Find a Fortran LAPACK library # - Find LAPACK library
# N.B. Fortran only. This module cannot be used to find a C LAPACK library.
# This module finds an installed fortran library that implements the LAPACK # This module finds an installed fortran library that implements the LAPACK
# linear-algebra interface (see http://www.netlib.org/lapack/). # linear-algebra interface (see http://www.netlib.org/lapack/).
# #
@ -15,9 +14,14 @@
# link against to use LAPACK # link against to use LAPACK
# LAPACK95_LIBRARIES - uncached list of libraries (using full path name) to # LAPACK95_LIBRARIES - uncached list of libraries (using full path name) to
# link against to use LAPACK95 # link against to use LAPACK95
# LAPACK95_FOUND - set to true if a library implementing the LAPACK f95
# # interface is found
# BLA_STATIC if set on this determines what kind of linkage we do (static)
# BLA_VENDOR if set checks only the specified vendor, if not set checks
# all the posibilities
# BLA_F95 if set on tries to find the f95 interfaces for BLAS/LAPACK
### List of vendors (BLA_VENDOR) valid in this module
## Intel(mkl), ACML,Apple, NAS, Generic
get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES) get_property(_LANGUAGES_ GLOBAL PROPERTY ENABLED_LANGUAGES)
if(NOT _LANGUAGES_ MATCHES Fortran) if(NOT _LANGUAGES_ MATCHES Fortran)
if(LAPACK_FIND_REQUIRED) if(LAPACK_FIND_REQUIRED)
@ -31,8 +35,9 @@ endif(NOT _LANGUAGES_ MATCHES Fortran)
include(CheckFortranFunctionExists) include(CheckFortranFunctionExists)
set(LAPACK_FOUND FALSE) set(LAPACK_FOUND FALSE)
set(LAPACK95_FOUND FALSE)
macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas) macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas _threads)
# This macro checks for the existence of the combination of fortran libraries # This macro checks for the existence of the combination of fortran libraries
# given by _list. If the combination is found, this macro checks (using the # given by _list. If the combination is found, this macro checks (using the
# Check_Fortran_Function_Exists macro) whether can link against that library # Check_Fortran_Function_Exists macro) whether can link against that library
@ -51,20 +56,29 @@ foreach(_library ${_list})
set(_combined_name ${_combined_name}_${_library}) set(_combined_name ${_combined_name}_${_library})
if(_libraries_work) if(_libraries_work)
IF (WIN32) IF (WIN32)
if(BLA_STATIC)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.dll")
endif(BLA_STATIC)
find_library(${_prefix}_${_library}_LIBRARY find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library} NAMES ${_library}
PATHS ENV LIB PATHS ENV LIB
) )
ENDIF (WIN32) ENDIF (WIN32)
if(APPLE) if(APPLE)
if(BLA_STATIC)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so;.dylib")
endif(BLA_STATIC)
find_library(${_prefix}_${_library}_LIBRARY find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library} NAMES ${_library}
PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH
) )
else(APPLE) else(APPLE)
find_library(${_prefix}_${_library}_LIBRARY if(BLA_STATIC)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
endif(BLA_STATIC)
find_library(${_prefix}_${_library}_LIBRARY
NAMES ${_library} NAMES ${_library}
PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH
) )
@ -78,8 +92,12 @@ endforeach(_library ${_list})
if(_libraries_work) if(_libraries_work)
# Test this combination of libraries. # Test this combination of libraries.
set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas}) if(UNIX AND BLA_STATIC)
#message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}") set(CMAKE_REQUIRED_LIBRARIES ${_flags} "-Wl,--start-group ${${LIBRARIES}} ${_blas};-Wl,--end-group" ${_threads})
else(UNIX AND BLA_STATIC)
set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas} ${_threads})
endif(UNIX AND BLA_STATIC)
# message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS) check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS)
set(CMAKE_REQUIRED_LIBRARIES) set(CMAKE_REQUIRED_LIBRARIES)
mark_as_advanced(${_prefix}${_combined_name}_WORKS) mark_as_advanced(${_prefix}${_combined_name}_WORKS)
@ -87,7 +105,6 @@ if(_libraries_work)
#message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}") #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
endif(_libraries_work) endif(_libraries_work)
if(_libraries_work) if(_libraries_work)
set(${LIBRARIES} ${${LIBRARIES}} ${_blas}) set(${LIBRARIES} ${${LIBRARIES}} ${_blas})
else(_libraries_work) else(_libraries_work)
@ -108,49 +125,34 @@ else(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
find_package(BLAS REQUIRED) find_package(BLAS REQUIRED)
endif(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) endif(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
if(BLAS_FOUND) if(BLAS_FOUND)
set(LAPACK_LINKER_FLAGS ${BLAS_LINKER_FLAGS}) set(LAPACK_LINKER_FLAGS ${BLAS_LINKER_FLAGS})
if ($ENV{BLA_VENDOR} MATCHES ".+")
#intel lapack set(BLA_VENDOR $ENV{BLA_VENDOR})
if(NOT LAPACK_LIBRARIES) else ($ENV{BLA_VENDOR} MATCHES ".+")
if(NOT BLA_VENDOR)
check_lapack_libraries( set(BLA_VENDOR "All")
LAPACK_LIBRARIES endif(NOT BLA_VENDOR)
LAPACK endif ($ENV{BLA_VENDOR} MATCHES ".+")
cheev
""
"mkl_lapack"
"${BLAS_LIBRARIES}"
)
endif(NOT LAPACK_LIBRARIES)
if(NOT LAPACK95_LIBRARIES)
check_lapack_libraries(
LAPACK95_LIBRARIES
LAPACK
cheev
""
"mkl_lapack95"
"${BLAS_LIBRARIES}"
)
endif(NOT LAPACK95_LIBRARIES)
#acml lapack #acml lapack
if (BLA_VENDOR STREQUAL "ACML" OR BLA_VENDOR STREQUAL "All")
if(NOT LAPACK_LIBRARIES) if(NOT LAPACK_LIBRARIES)
check_lapack_libraries(
check_lapack_libraries( LAPACK_LIBRARIES
LAPACK_LIBRARIES LAPACK
LAPACK cheev
cheev ""
"" "acml"
"acml" ""
"${BLAS_LIBRARIES}" ""
) )
endif(NOT LAPACK_LIBRARIES) endif(NOT LAPACK_LIBRARIES)
endif (BLA_VENDOR STREQUAL "ACML" OR BLA_VENDOR STREQUAL "All")
# Apple LAPACK library? # Apple LAPACK library?
if(NOT LAPACK_LIBRARIES) if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
if(NOT LAPACK_LIBRARIES)
check_lapack_libraries( check_lapack_libraries(
LAPACK_LIBRARIES LAPACK_LIBRARIES
LAPACK LAPACK
@ -158,9 +160,11 @@ if(NOT LAPACK_LIBRARIES)
"" ""
"Accelerate" "Accelerate"
"${BLAS_LIBRARIES}" "${BLAS_LIBRARIES}"
""
) )
endif(NOT LAPACK_LIBRARIES) endif(NOT LAPACK_LIBRARIES)
endif (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
if ( NOT LAPACK_LIBRARIES ) if ( NOT LAPACK_LIBRARIES )
check_lapack_libraries( check_lapack_libraries(
LAPACK_LIBRARIES LAPACK_LIBRARIES
@ -169,10 +173,12 @@ if(NOT LAPACK_LIBRARIES)
"" ""
"vecLib" "vecLib"
"${BLAS_LIBRARIES}" "${BLAS_LIBRARIES}"
""
) )
endif ( NOT LAPACK_LIBRARIES ) endif ( NOT LAPACK_LIBRARIES )
endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
# Generic LAPACK library? # Generic LAPACK library?
if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
if ( NOT LAPACK_LIBRARIES ) if ( NOT LAPACK_LIBRARIES )
check_lapack_libraries( check_lapack_libraries(
LAPACK_LIBRARIES LAPACK_LIBRARIES
@ -181,20 +187,80 @@ if(NOT LAPACK_LIBRARIES)
"" ""
"lapack" "lapack"
"${BLAS_LIBRARIES}" "${BLAS_LIBRARIES}"
""
) )
endif ( NOT LAPACK_LIBRARIES ) endif ( NOT LAPACK_LIBRARIES )
endif (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All")
#intel lapack
if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
if (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
find_PACKAGE(Threads)
else(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
find_package(Threads REQUIRED)
endif(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
if (BLA_F95)
if(NOT LAPACK95_LIBRARIES)
check_lapack_libraries(
LAPACK95_LIBRARIES
LAPACK
cheev
""
"mkl_lapack95"
"${BLAS95_LIBRARIES}"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT LAPACK95_LIBRARIES)
else(BLA_F95)
if(NOT LAPACK_LIBRARIES)
check_lapack_libraries(
LAPACK_LIBRARIES
LAPACK
cheev
""
"mkl_lapack"
"${BLAS_LIBRARIES}"
"${CMAKE_THREAD_LIBS_INIT}"
)
endif(NOT LAPACK_LIBRARIES)
endif(BLA_F95)
endif (_LANGUAGES_ MATCHES C OR _LANGUAGES_ MATCHES CXX)
endif(BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All")
else(BLAS_FOUND) else(BLAS_FOUND)
message(STATUS "LAPACK requires BLAS") message(STATUS "LAPACK requires BLAS")
endif(BLAS_FOUND) endif(BLAS_FOUND)
if(LAPACK_LIBRARIES) if(BLA_F95)
if(LAPACK95_LIBRARIES)
set(LAPACK95_FOUND TRUE)
else(LAPACK95_LIBRARIES)
set(LAPACK95_FOUND FALSE)
endif(LAPACK95_LIBRARIES)
if(NOT LAPACK_FIND_QUIETLY)
if(LAPACK95_FOUND)
message(STATUS "A library with LAPACK95 API found.")
else(LAPACK95_FOUND)
if(LAPACK_FIND_REQUIRED)
message(FATAL_ERROR
"A required library with LAPACK95 API not found. Please specify library location."
)
else(LAPACK_FIND_REQUIRED)
message(STATUS
"A library with LAPACK95 API not found. Please specify library location."
)
endif(LAPACK_FIND_REQUIRED)
endif(LAPACK95_FOUND)
endif(NOT LAPACK_FIND_QUIETLY)
set(LAPACK_FOUND "${LAPACK95_FOUND}")
set(LAPACK_LIBRARIES "${LAPACK95_LIBRARIES}")
else(BLA_F95)
if(LAPACK_LIBRARIES)
set(LAPACK_FOUND TRUE) set(LAPACK_FOUND TRUE)
else(LAPACK_LIBRARIES) else(LAPACK_LIBRARIES)
set(LAPACK_FOUND FALSE) set(LAPACK_FOUND FALSE)
endif(LAPACK_LIBRARIES) endif(LAPACK_LIBRARIES)
if(NOT LAPACK_FIND_QUIETLY) if(NOT LAPACK_FIND_QUIETLY)
if(LAPACK_FOUND) if(LAPACK_FOUND)
message(STATUS "A library with LAPACK API found.") message(STATUS "A library with LAPACK API found.")
else(LAPACK_FOUND) else(LAPACK_FOUND)
@ -208,4 +274,5 @@ if(NOT LAPACK_FIND_QUIETLY)
) )
endif(LAPACK_FIND_REQUIRED) endif(LAPACK_FIND_REQUIRED)
endif(LAPACK_FOUND) endif(LAPACK_FOUND)
endif(NOT LAPACK_FIND_QUIETLY) endif(NOT LAPACK_FIND_QUIETLY)
endif(BLA_F95)