diff --git a/CMakeModules/morse/find/FindBLAS.cmake b/CMakeModules/morse/find/FindBLAS.cmake index 82b7dd4cfe55308d458dcff1ec231420bdf547f0..d6f69e6149a62e7b0ce5252797a67630909db657 100644 --- a/CMakeModules/morse/find/FindBLAS.cmake +++ b/CMakeModules/morse/find/FindBLAS.cmake @@ -35,6 +35,13 @@ # BLAS_DIR - Where to find the base directory of blas # BLAS_INCDIR - Where to find the header files # BLAS_LIBDIR - Where to find the library files +# The module can also look after the following environment variables if paths +# are not given as cmake variable +# BLAS_DIR - Where to find the base directory of blas +# BLAS_INCDIR - Where to find the header files +# BLAS_LIBDIR - Where to find the library files +# For MKL case and if no paths are given as hints, we will try to use the MKLROOT +# environment variable ########## ### List of vendors (BLA_VENDOR) valid in this module ########## List of vendors (BLA_VENDOR) valid in this module @@ -180,6 +187,9 @@ macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread) set(_libraries_work TRUE) set(${LIBRARIES}) set(_combined_name) + set(ENV_MKLROOT "$ENV{MKLROOT}") + set(ENV_BLAS_DIR "$ENV{BLAS_DIR}") + set(ENV_BLAS_LIBDIR "$ENV{BLAS_LIBDIR}") if (NOT _libdir) if (BLAS_DIR) list(APPEND _libdir "${BLAS_DIR}") @@ -193,7 +203,28 @@ macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread) endif() elseif (BLAS_LIBDIR) list(APPEND _libdir "${BLAS_LIBDIR}") + elseif(ENV_BLAS_DIR) + list(APPEND _libdir "${ENV_BLAS_DIR}") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib64") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib/intel64") + else() + list(APPEND _libdir "${ENV_BLAS_DIR}/lib32") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib/ia32") + endif() + elseif(ENV_BLAS_LIBDIR) + list(APPEND _libdir "${ENV_BLAS_LIBDIR}") else() + if (ENV_MKLROOT) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${ENV_MKLROOT}/lib64") + list(APPEND _libdir "${ENV_MKLROOT}/lib/intel64") + else() + list(APPEND _libdir "${ENV_MKLROOT}/lib32") + list(APPEND _libdir "${ENV_MKLROOT}/lib/ia32") + endif() + endif() if (WIN32) string(REPLACE ":" ";" _libdir2 "$ENV{LIB}") elseif (APPLE) @@ -370,10 +401,12 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All") if (CMAKE_C_COMPILER_NAME STREQUAL "gcc" OR CMAKE_C_COMPILER_NAME STREQUAL "cc") list(APPEND BLAS_SEARCH_LIBS - "mkl_blas95_lp64 mkl_intel_lp64 mkl_gnu_thread mkl_core gomp") + "mkl_blas95_lp64 mkl_intel_lp64 mkl_gnu_thread mkl_core") + set(OMP_LIB "-lgomp") else () list(APPEND BLAS_SEARCH_LIBS - "mkl_blas95_lp64 mkl_intel_lp64 mkl_intel_thread mkl_core iomp5") + "mkl_blas95_lp64 mkl_intel_lp64 mkl_intel_thread mkl_core") + set(OMP_LIB "-liomp5") endif () endif () if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All") @@ -442,10 +475,12 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All") if (CMAKE_C_COMPILER_NAME STREQUAL "gcc" OR CMAKE_C_COMPILER_NAME STREQUAL "cc") list(APPEND BLAS_SEARCH_LIBS - "mkl_intel_lp64 mkl_gnu_thread mkl_core gomp") + "mkl_intel_lp64 mkl_gnu_thread mkl_core") + set(OMP_LIB "-lgomp") else () list(APPEND BLAS_SEARCH_LIBS - "mkl_intel_lp64 mkl_intel_thread mkl_core iomp5") + "mkl_intel_lp64 mkl_intel_thread mkl_core") + set(OMP_LIB "-liomp5") endif () endif () if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All") @@ -476,7 +511,7 @@ if (BLA_VENDOR MATCHES "Intel*" OR BLA_VENDOR STREQUAL "All") ${BLAS_mkl_SEARCH_SYMBOL} "${additional_flags}" "${SEARCH_LIBS}" - "${CMAKE_THREAD_LIBS_INIT};${LM}" + "${OMP_LIB};${CMAKE_THREAD_LIBS_INIT};${LM}" ) if(_LIBRARIES) set(BLAS_LINKER_FLAGS "${additional_flags}") @@ -936,12 +971,14 @@ endif(BLA_F95) set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) -if (BLAS_FOUND AND NOT BLAS_DIR) +if (BLAS_FOUND) list(GET BLAS_LIBRARIES 0 first_lib) get_filename_component(first_lib_path "${first_lib}" PATH) if (${first_lib_path} MATCHES "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)") string(REGEX REPLACE "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)" "" not_cached_dir "${first_lib_path}") - set(BLAS_DIR "${not_cached_dir}" CACHE PATH "Installation directory of BLAS library" FORCE) + set(BLAS_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of BLAS library" FORCE) + else() + set(BLAS_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of BLAS library" FORCE) endif() endif() diff --git a/CMakeModules/morse/find/FindFFTW.cmake b/CMakeModules/morse/find/FindFFTW.cmake index 801c85207a3379156d667e5e29d06e17fb63f5e5..6791ce566966448f847e10d989776eba2d4a8a9d 100644 --- a/CMakeModules/morse/find/FindFFTW.cmake +++ b/CMakeModules/morse/find/FindFFTW.cmake @@ -40,6 +40,10 @@ # FFTW_DIR - Where to find the base directory of fftw # FFTW_INCDIR - Where to find the header files # FFTW_LIBDIR - Where to find the library files +# The module can also look for the following environment variables if paths +# are not given as cmake variable: FFTW_DIR, FFTW_INCDIR, FFTW_LIBDIR +# For MKL case and if no paths are given as hints, we will try to use the MKLROOT +# environment variable #============================================================================= # Copyright 2012-2013 Inria @@ -60,7 +64,7 @@ if (NOT FFTW_FOUND) - set(FFTW_DIR "" CACHE PATH "Installation directory of FFTW library") + set(FFTW_DIR "" CACHE PATH "Installation directory of FFTW library given by user") if (NOT FFTW_FIND_QUIETLY) message(STATUS "A cache variable, namely FFTW_DIR, has been set to specify the install directory of FFTW") endif() @@ -136,6 +140,14 @@ if (FFTW_LOOK_FOR_THREADS) endif() endif() +if (FFTW_LOOK_FOR_MKL) + if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_MKL) + find_package(Threads REQUIRED) + else() + find_package(Threads) + endif() +endif() + if (FFTW_LOOK_FOR_OMP) if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_OMP) find_package(OpenMP REQUIRED) @@ -144,16 +156,29 @@ if (FFTW_LOOK_FOR_OMP) endif() endif() -if( NOT FFTW_FOUND ) - - # Looking for include - # ------------------- - - # Add system include paths to search include - # ------------------------------------------ - unset(_inc_env) +# Looking for include +# ------------------- + +# Add system include paths to search include +# ------------------------------------------ +unset(_inc_env) +set(ENV_MKLROOT "$ENV{MKLROOT}") +set(ENV_FFTW_DIR "$ENV{FFTW_DIR}") +set(ENV_FFTW_INCDIR "$ENV{FFTW_INCDIR}") +if(ENV_FFTW_INCDIR) + list(APPEND _inc_env "${ENV_FFTW_INCDIR}") +elseif(ENV_FFTW_DIR) + list(APPEND _inc_env "${ENV_FFTW_DIR}") + list(APPEND _inc_env "${ENV_FFTW_DIR}/include") + list(APPEND _inc_env "${ENV_FFTW_DIR}/include/fftw") +else() + if (ENV_MKLROOT) + list(APPEND _inc_env "${ENV_MKLROOT}/include/fftw") + endif() + # system variables if(WIN32) - string(REPLACE ":" ";" _inc_env "$ENV{INCLUDE}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") else() string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") list(APPEND _inc_env "${_path_env}") @@ -164,271 +189,297 @@ if( NOT FFTW_FOUND ) string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") list(APPEND _inc_env "${_path_env}") endif() - list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") - list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") - list(REMOVE_DUPLICATES _inc_env) - - # set paths where to look for - set(PATH_TO_LOOK_FOR "${_inc_env}") - - # Try to find the fftw header in the given paths - # ------------------------------------------------- - # call cmake macro to find the header path - if(FFTW_INCDIR) +endif() +list(APPEND _inc_env "${CMAKE_PLATFORM_IMPLICIT_INCLUDE_DIRECTORIES}") +list(APPEND _inc_env "${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}") +list(REMOVE_DUPLICATES _inc_env) + +# set paths where to look for +set(PATH_TO_LOOK_FOR "${_inc_env}") + +# Try to find the fftw header in the given paths +# ------------------------------------------------- +# call cmake macro to find the header path +if(FFTW_INCDIR) + set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") + find_path(FFTW_fftw3.h_DIRS + NAMES fftw3.h + HINTS ${FFTW_INCDIR}) +else() + if(FFTW_DIR) set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") find_path(FFTW_fftw3.h_DIRS NAMES fftw3.h - HINTS ${FFTW_INCDIR}) + HINTS ${FFTW_DIR} + PATH_SUFFIXES include include/fftw) else() - if(FFTW_DIR) - set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") - find_path(FFTW_fftw3.h_DIRS - NAMES fftw3.h - HINTS ${FFTW_DIR} - PATH_SUFFIXES include) + set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") + find_path(FFTW_fftw3.h_DIRS + NAMES fftw3.h + HINTS ${PATH_TO_LOOK_FOR}) + endif() +endif() +mark_as_advanced(FFTW_fftw3.h_DIRS) + +# Add path to cmake variable +# ------------------------------------ +if (FFTW_fftw3.h_DIRS) + set(FFTW_INCLUDE_DIRS "${FFTW_fftw3.h_DIRS}") +else () + set(FFTW_INCLUDE_DIRS "FFTW_INCLUDE_DIRS-NOTFOUND") + if(NOT FFTW_FIND_QUIETLY) + message(STATUS "Looking for FFTW -- fftw3.h not found") + endif() +endif () + + +# Looking for lib +# --------------- + +# Add system library paths to search lib +# -------------------------------------- +unset(_lib_env) +set(ENV_FFTW_LIBDIR "$ENV{FFTW_LIBDIR}") +if(ENV_FFTW_LIBDIR) + list(APPEND _lib_env "${ENV_FFTW_LIBDIR}") +elseif(ENV_FFTW_DIR) + list(APPEND _lib_env "${ENV_FFTW_DIR}") + list(APPEND _lib_env "${ENV_FFTW_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _lib_env "${ENV_FFTW_DIR}/lib64") + list(APPEND _lib_env "${ENV_FFTW_DIR}/lib/intel64") + else() + list(APPEND _lib_env "${ENV_FFTW_DIR}/lib32") + list(APPEND _lib_env "${ENV_FFTW_DIR}/lib/ia32") + endif() +else() + if (ENV_MKLROOT) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _lib_env "${ENV_MKLROOT}/lib64") + list(APPEND _lib_env "${ENV_MKLROOT}/lib/intel64") else() - set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") - find_path(FFTW_fftw3.h_DIRS - NAMES fftw3.h - HINTS ${PATH_TO_LOOK_FOR}) + list(APPEND _lib_env "${ENV_MKLROOT}/lib32") + list(APPEND _lib_env "${ENV_MKLROOT}/lib/ia32") endif() endif() - mark_as_advanced(FFTW_fftw3.h_DIRS) - - # Add path to cmake variable - # ------------------------------------ - if (FFTW_fftw3.h_DIRS) - set(FFTW_INCLUDE_DIRS "${FFTW_fftw3.h_DIRS}") - else () - set(FFTW_INCLUDE_DIRS "FFTW_INCLUDE_DIRS-NOTFOUND") - if(NOT FFTW_FIND_QUIETLY) - message(STATUS "Looking for FFTW -- fftw3.h not found") - endif() - endif () - - - # Looking for lib - # --------------- - - # Add system library paths to search lib - # -------------------------------------- - unset(_lib_env) if(WIN32) - string(REPLACE ":" ";" _lib_env "$ENV{LIB}") + string(REPLACE ":" ";" _lib_env2 "$ENV{LIB}") else() if(APPLE) - string(REPLACE ":" ";" _lib_env "$ENV{DYLD_LIBRARY_PATH}") + string(REPLACE ":" ";" _lib_env2 "$ENV{DYLD_LIBRARY_PATH}") else() - string(REPLACE ":" ";" _lib_env "$ENV{LD_LIBRARY_PATH}") + string(REPLACE ":" ";" _lib_env2 "$ENV{LD_LIBRARY_PATH}") endif() + list(APPEND _lib_env "${_lib_env2}") list(APPEND _lib_env "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}") list(APPEND _lib_env "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}") endif() - list(REMOVE_DUPLICATES _lib_env) - - # set paths where to look for - set(PATH_TO_LOOK_FOR "${_lib_env}") - - if(FFTW_LOOK_FOR_FFTW_SIMPLE) - set(FFTW_PREC "f") - set(FFTW_PREC_TESTFUNC "s") - elseif(FFTW_LOOK_FOR_FFTW_DOUBLE) - set(FFTW_PREC "") - set(FFTW_PREC_TESTFUNC "d") - elseif(FFTW_LOOK_FOR_FFTW_LONG) - set(FFTW_PREC "l") - set(FFTW_PREC_TESTFUNC "l") - elseif(FFTW_LOOK_FOR_FFTW_QUAD) - set(FFTW_PREC "q") - set(FFTW_PREC_TESTFUNC "q") - endif() +endif() +list(REMOVE_DUPLICATES _lib_env) + +# set paths where to look for +set(PATH_TO_LOOK_FOR "${_lib_env}") + +if(FFTW_LOOK_FOR_FFTW_SIMPLE) + set(FFTW_PREC "f") + set(FFTW_PREC_TESTFUNC "s") +elseif(FFTW_LOOK_FOR_FFTW_DOUBLE) + set(FFTW_PREC "") + set(FFTW_PREC_TESTFUNC "d") +elseif(FFTW_LOOK_FOR_FFTW_LONG) + set(FFTW_PREC "l") + set(FFTW_PREC_TESTFUNC "l") +elseif(FFTW_LOOK_FOR_FFTW_QUAD) + set(FFTW_PREC "q") + set(FFTW_PREC_TESTFUNC "q") +endif() - if (FFTW_LOOK_FOR_MKL) +if (FFTW_LOOK_FOR_MKL) - set(FFTW_libs_to_find "mkl_intel_lp64;mkl_sequential;mkl_core") + set(FFTW_libs_to_find "mkl_intel_lp64;mkl_sequential;mkl_core") - # Try to find the MKL fftw lib in the given paths - # ----------------------------------------------- + # Try to find the MKL fftw lib in the given paths + # ----------------------------------------------- - # call cmake macro to find the lib path - if(FFTW_LIBDIR) + # call cmake macro to find the lib path + if(FFTW_LIBDIR) + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${FFTW_LIBDIR}) + endforeach() + else() + if(FFTW_DIR) foreach(fftw_lib ${FFTW_libs_to_find}) set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") find_library(FFTW_${fftw_lib}_LIBRARY NAMES ${fftw_lib} - HINTS ${FFTW_LIBDIR}) + HINTS ${FFTW_DIR} + PATH_SUFFIXES lib lib32 lib64) endforeach() else() - if(FFTW_DIR) - foreach(fftw_lib ${FFTW_libs_to_find}) - set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") - find_library(FFTW_${fftw_lib}_LIBRARY - NAMES ${fftw_lib} - HINTS ${FFTW_DIR} - PATH_SUFFIXES lib lib32 lib64) - endforeach() - else() - foreach(fftw_lib ${FFTW_libs_to_find}) - set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") - find_library(FFTW_${fftw_lib}_LIBRARY - NAMES ${fftw_lib} - HINTS ${PATH_TO_LOOK_FOR}) - endforeach() - endif() + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${PATH_TO_LOOK_FOR}) + endforeach() endif() + endif() - else(FFTW_LOOK_FOR_MKL) +else(FFTW_LOOK_FOR_MKL) - if (FFTW_LOOK_FOR_THREADS) - set(FFTW_libs_to_find "fftw3${FFTW_PREC}_threads;fftw3${FFTW_PREC}") - elseif (FFTW_LOOK_FOR_OMP) - set(FFTW_libs_to_find "fftw3${FFTW_PREC}_omp;fftw3${FFTW_PREC}") - else() - set(FFTW_libs_to_find "fftw3${FFTW_PREC}") - endif() + if (FFTW_LOOK_FOR_THREADS) + set(FFTW_libs_to_find "fftw3${FFTW_PREC}_threads;fftw3${FFTW_PREC}") + elseif (FFTW_LOOK_FOR_OMP) + set(FFTW_libs_to_find "fftw3${FFTW_PREC}_omp;fftw3${FFTW_PREC}") + else() + set(FFTW_libs_to_find "fftw3${FFTW_PREC}") + endif() - # Try to find the fftw lib in the given paths - # ---------------------------------------------- + # Try to find the fftw lib in the given paths + # ---------------------------------------------- - # call cmake macro to find the lib path - if(FFTW_LIBDIR) + # call cmake macro to find the lib path + if(FFTW_LIBDIR) + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${FFTW_LIBDIR}) + endforeach() + else() + if(FFTW_DIR) foreach(fftw_lib ${FFTW_libs_to_find}) set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") find_library(FFTW_${fftw_lib}_LIBRARY NAMES ${fftw_lib} - HINTS ${FFTW_LIBDIR}) + HINTS ${FFTW_DIR} + PATH_SUFFIXES lib lib32 lib64) endforeach() else() - if(FFTW_DIR) - foreach(fftw_lib ${FFTW_libs_to_find}) - set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") - find_library(FFTW_${fftw_lib}_LIBRARY - NAMES ${fftw_lib} - HINTS ${FFTW_DIR} - PATH_SUFFIXES lib lib32 lib64) - endforeach() - else() - foreach(fftw_lib ${FFTW_libs_to_find}) - set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") - find_library(FFTW_${fftw_lib}_LIBRARY - NAMES ${fftw_lib} - HINTS ${PATH_TO_LOOK_FOR}) - endforeach() - endif() + foreach(fftw_lib ${FFTW_libs_to_find}) + set(FFTW_${fftw_lib}_LIBRARY "FFTW_${fftw_lib}_LIBRARY-NOTFOUND") + find_library(FFTW_${fftw_lib}_LIBRARY + NAMES ${fftw_lib} + HINTS ${PATH_TO_LOOK_FOR}) + endforeach() endif() + endif() - endif(FFTW_LOOK_FOR_MKL) - - # If found, add path to cmake variable - # ------------------------------------ - set(FFTW_LIBRARIES "") - set(FFTW_LIBRARY_DIRS "") - foreach(fftw_lib ${FFTW_libs_to_find}) - - if (FFTW_${fftw_lib}_LIBRARY) - get_filename_component(${fftw_lib}_lib_path "${FFTW_${fftw_lib}_LIBRARY}" PATH) - # set cmake variables - list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}") - list(APPEND FFTW_LIBRARY_DIRS "${${fftw_lib}_lib_path}") - else () - list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}") - if (NOT FFTW_FIND_QUIETLY) - message(STATUS "Looking for FFTW -- lib ${fftw_lib} not found") - endif() - endif () - mark_as_advanced(FFTW_${fftw_lib}_LIBRARY) +endif(FFTW_LOOK_FOR_MKL) - endforeach() +# If found, add path to cmake variable +# ------------------------------------ +set(FFTW_LIBRARIES "") +set(FFTW_LIBRARY_DIRS "") +foreach(fftw_lib ${FFTW_libs_to_find}) - list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS) - list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS) + if (FFTW_${fftw_lib}_LIBRARY) + get_filename_component(${fftw_lib}_lib_path "${FFTW_${fftw_lib}_LIBRARY}" PATH) + # set cmake variables + list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}") + list(APPEND FFTW_LIBRARY_DIRS "${${fftw_lib}_lib_path}") + else () + list(APPEND FFTW_LIBRARIES "${FFTW_${fftw_lib}_LIBRARY}") + if (NOT FFTW_FIND_QUIETLY) + message(STATUS "Looking for FFTW -- lib ${fftw_lib} not found") + endif() + endif () + mark_as_advanced(FFTW_${fftw_lib}_LIBRARY) - # check a function to validate the find - if(FFTW_LIBRARIES) +endforeach() - set(REQUIRED_FLAGS) - set(REQUIRED_LDFLAGS) - set(REQUIRED_INCDIRS) - set(REQUIRED_LIBDIRS) - set(REQUIRED_LIBS) +list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS) +list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS) - # FFTW - if (FFTW_INCLUDE_DIRS) - set(REQUIRED_INCDIRS "${FFTW_INCLUDE_DIRS}") - endif() - if (FFTW_LIBRARY_DIRS) - set(REQUIRED_LIBDIRS "${FFTW_LIBRARY_DIRS}") - endif() - set(REQUIRED_LIBS "${FFTW_LIBRARIES}") - # THREADS - if (FFTW_LOOK_FOR_THREADS) - list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") - endif() - # OMP - if(FFTW_LOOK_FOR_OMP) - if (CMAKE_C_COMPILER MATCHES ".+gcc.*") - set(REQUIRED_FLAGS "-fopenmp") - endif() +# check a function to validate the find +if(FFTW_LIBRARIES) + + set(REQUIRED_FLAGS) + set(REQUIRED_LDFLAGS) + set(REQUIRED_INCDIRS) + set(REQUIRED_LIBDIRS) + set(REQUIRED_LIBS) + + # FFTW + if (FFTW_INCLUDE_DIRS) + set(REQUIRED_INCDIRS "${FFTW_INCLUDE_DIRS}") + endif() + if (FFTW_LIBRARY_DIRS) + set(REQUIRED_LIBDIRS "${FFTW_LIBRARY_DIRS}") + endif() + set(REQUIRED_LIBS "${FFTW_LIBRARIES}") + # THREADS + if (FFTW_LOOK_FOR_THREADS) + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") + endif() + # OMP + if(FFTW_LOOK_FOR_OMP) + if (CMAKE_C_COMPILER MATCHES ".+gcc.*") + set(REQUIRED_FLAGS "-fopenmp") endif() - # MKL - if(FFTW_LOOK_FOR_MKL) - list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT};-lm") - if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND REQUIRED_LDFLAGS "-Wl,--no-as-needed") - endif() + endif() + # MKL + if(FFTW_LOOK_FOR_MKL) + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT};-lm") + if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND REQUIRED_LDFLAGS "-Wl,--no-as-needed") endif() + endif() - # set required libraries for link - set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") - set(CMAKE_REQUIRED_LIBRARIES) - list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LDFLAGS}") - foreach(lib_dir ${REQUIRED_LIBDIRS}) - list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") - endforeach() - list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") - list(APPEND CMAKE_REQUIRED_FLAGS "${REQUIRED_FLAGS}") - string(REGEX REPLACE "^ -" "-" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") - - # test link - unset(FFTW_WORKS CACHE) - include(CheckFunctionExists) - check_function_exists(${FFTW_PREC_TESTFUNC}fftw_execute_ FFTW_WORKS) - mark_as_advanced(FFTW_WORKS) - - if(FFTW_WORKS) - # save link with dependencies - set(FFTW_LIBRARIES_DEP "${REQUIRED_LIBS}") - set(FFTW_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") - set(FFTW_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") - set(FFTW_C_FLAGS "${REQUIRED_FLAGS}") - set(FFTW_LINKER_FLAGS "${REQUIRED_LDFLAGS}") - list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS_DEP) - list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS_DEP) - list(REMOVE_DUPLICATES FFTW_LINKER_FLAGS) - else() - if(NOT FFTW_FIND_QUIETLY) - message(STATUS "Looking for FFTW : test of ${FFTW_PREC_TESTFUNC}fftw_execute_ with fftw library fails") - message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") - message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") - message(STATUS "CMAKE_REQUIRED_FLAGS: ${CMAKE_REQUIRED_FLAGS}") - message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") - endif() - else() - set(FFTW_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) + # set required libraries for link + set(CMAKE_REQUIRED_INCLUDES "${REQUIRED_INCDIRS}") + set(CMAKE_REQUIRED_LIBRARIES) + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LDFLAGS}") + foreach(lib_dir ${REQUIRED_LIBDIRS}) + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + endforeach() + list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") + list(APPEND CMAKE_REQUIRED_FLAGS "${REQUIRED_FLAGS}") + string(REGEX REPLACE "^ -" "-" CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}") + + # test link + unset(FFTW_WORKS CACHE) + include(CheckFunctionExists) + check_function_exists(${FFTW_PREC_TESTFUNC}fftw_execute_ FFTW_WORKS) + mark_as_advanced(FFTW_WORKS) + + if(FFTW_WORKS) + # save link with dependencies + set(FFTW_LIBRARIES_DEP "${REQUIRED_LIBS}") + set(FFTW_LIBRARY_DIRS_DEP "${REQUIRED_LIBDIRS}") + set(FFTW_INCLUDE_DIRS_DEP "${REQUIRED_INCDIRS}") + set(FFTW_C_FLAGS "${REQUIRED_FLAGS}") + set(FFTW_LINKER_FLAGS "${REQUIRED_LDFLAGS}") + list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS_DEP) + list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS_DEP) + list(REMOVE_DUPLICATES FFTW_LINKER_FLAGS) + else() + if(NOT FFTW_FIND_QUIETLY) + message(STATUS "Looking for FFTW : test of ${FFTW_PREC_TESTFUNC}fftw_execute_ with fftw library fails") + message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") + message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") + message(STATUS "CMAKE_REQUIRED_FLAGS: ${CMAKE_REQUIRED_FLAGS}") + message(STATUS "Check in CMakeFiles/CMakeError.log to figure out why it fails") endif() - set(CMAKE_REQUIRED_INCLUDES) - set(CMAKE_REQUIRED_FLAGS) - set(CMAKE_REQUIRED_LIBRARIES) - endif(FFTW_LIBRARIES) - -endif( NOT FFTW_FOUND ) + else() + set(FFTW_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) + endif() + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_FLAGS) + set(CMAKE_REQUIRED_LIBRARIES) +endif(FFTW_LIBRARIES) -if (FFTW_LIBRARIES AND NOT FFTW_DIR) +if (FFTW_LIBRARIES) list(GET FFTW_LIBRARIES 0 first_lib) get_filename_component(first_lib_path "${first_lib}" PATH) if (${first_lib_path} MATCHES "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)") string(REGEX REPLACE "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)" "" not_cached_dir "${first_lib_path}") - set(FFTW_DIR "${not_cached_dir}" CACHE PATH "Installation directory of FFTW library" FORCE) + set(FFTW_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of FFTW library" FORCE) + else() + set(FFTW_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of FFTW library" FORCE) endif() endif() diff --git a/CMakeModules/morse/find/FindLAPACK.cmake b/CMakeModules/morse/find/FindLAPACK.cmake index 66070b08473d9d4af4ef9050a5ce0c3d84b259d5..2ec1c87f1b6f405350c38e56374c147afe013037 100644 --- a/CMakeModules/morse/find/FindLAPACK.cmake +++ b/CMakeModules/morse/find/FindLAPACK.cmake @@ -35,6 +35,13 @@ # LAPACK_DIR - Where to find the base directory of lapack # LAPACK_INCDIR - Where to find the header files # LAPACK_LIBDIR - Where to find the library files +# The module can also look after the following environment variables if paths +# are not given as cmake variable +# LAPACK_DIR - Where to find the base directory of lapack +# LAPACK_INCDIR - Where to find the header files +# LAPACK_LIBDIR - Where to find the library files +# For MKL case and if no paths are given as hints, we will try to use the MKLROOT +# environment variable # Note that if BLAS_DIR is set, it will also look for lapack in it ### List of vendors (BLA_VENDOR) valid in this module ## Intel(mkl), ACML,Apple, NAS, Generic @@ -154,20 +161,37 @@ macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas _threads set(_libraries_work TRUE) set(${LIBRARIES}) set(_combined_name) +set(ENV_MKLROOT "$ENV{MKLROOT}") +set(ENV_BLAS_DIR "$ENV{BLAS_DIR}") +set(ENV_BLAS_LIBDIR "$ENV{BLAS_LIBDIR}") +set(ENV_LAPACK_DIR "$ENV{LAPACK_DIR}") +set(ENV_LAPACK_LIBDIR "$ENV{LAPACK_LIBDIR}") if (NOT _libdir) if (BLAS_DIR) - list(APPEND _libdir "${BLAS_DIR}") - list(APPEND _libdir "${BLAS_DIR}/lib") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - list(APPEND _libdir "${BLAS_DIR}/lib64") - list(APPEND _libdir "${BLAS_DIR}/lib/intel64") - else() - list(APPEND _libdir "${BLAS_DIR}/lib32") - list(APPEND _libdir "${BLAS_DIR}/lib/ia32") - endif() + list(APPEND _libdir "${BLAS_DIR}") + list(APPEND _libdir "${BLAS_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${BLAS_DIR}/lib64") + list(APPEND _libdir "${BLAS_DIR}/lib/intel64") + else() + list(APPEND _libdir "${BLAS_DIR}/lib32") + list(APPEND _libdir "${BLAS_DIR}/lib/ia32") + endif() elseif (BLAS_LIBDIR) - list(APPEND _libdir "${BLAS_LIBDIR}") - endif () + list(APPEND _libdir "${BLAS_LIBDIR}") + elseif(ENV_BLAS_DIR) + list(APPEND _libdir "${ENV_BLAS_DIR}") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib64") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib/intel64") + else() + list(APPEND _libdir "${ENV_BLAS_DIR}/lib32") + list(APPEND _libdir "${ENV_BLAS_DIR}/lib/ia32") + endif() + elseif(ENV_BLAS_LIBDIR) + list(APPEND _libdir "${ENV_BLAS_LIBDIR}") + endif() if (LAPACK_DIR) list(APPEND _libdir "${LAPACK_DIR}") list(APPEND _libdir "${LAPACK_DIR}/lib") @@ -180,7 +204,28 @@ if (NOT _libdir) endif() elseif (LAPACK_LIBDIR) list(APPEND _libdir "${LAPACK_LIBDIR}") + elseif(ENV_LAPACK_DIR) + list(APPEND _libdir "${ENV_LAPACK_DIR}") + list(APPEND _libdir "${ENV_LAPACK_DIR}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${ENV_LAPACK_DIR}/lib64") + list(APPEND _libdir "${ENV_LAPACK_DIR}/lib/intel64") + else() + list(APPEND _libdir "${ENV_LAPACK_DIR}/lib32") + list(APPEND _libdir "${ENV_LAPACK_DIR}/lib/ia32") + endif() + elseif(ENV_LAPACK_LIBDIR) + list(APPEND _libdir "${ENV_LAPACK_LIBDIR}") else() + if (ENV_MKLROOT) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _libdir "${ENV_MKLROOT}/lib64") + list(APPEND _libdir "${ENV_MKLROOT}/lib/intel64") + else() + list(APPEND _libdir "${ENV_MKLROOT}/lib32") + list(APPEND _libdir "${ENV_MKLROOT}/lib/ia32") + endif() + endif() if (WIN32) string(REPLACE ":" ";" _libdir2 "$ENV{LIB}") elseif (APPLE) @@ -212,7 +257,7 @@ foreach(_library ${_list}) set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif (APPLE) else (BLA_STATIC) - if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # for ubuntu's libblas3gf and liblapack3gf packages set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf) endif () @@ -287,71 +332,6 @@ if(BLAS_FOUND) endif(NOT BLA_VENDOR) endif ($ENV{BLA_VENDOR} MATCHES ".+") -if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") - if(NOT LAPACK_LIBRARIES) - check_lapack_libraries( - LAPACK_LIBRARIES - LAPACK - cheev - "" - "goto2" - "${BLAS_LIBRARIES}" - "" - ) - endif(NOT LAPACK_LIBRARIES) -endif (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") - - -#acml lapack - if (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All") - if (BLAS_LIBRARIES MATCHES ".+acml.+") - set (LAPACK_LIBRARIES ${BLAS_LIBRARIES}) - endif () - endif () - -# Apple LAPACK library? -if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All") - if(NOT LAPACK_LIBRARIES) - check_lapack_libraries( - LAPACK_LIBRARIES - LAPACK - cheev - "" - "Accelerate" - "${BLAS_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 ) - check_lapack_libraries( - LAPACK_LIBRARIES - LAPACK - cheev - "" - "vecLib" - "${BLAS_LIBRARIES}" - "" - ) - endif ( NOT LAPACK_LIBRARIES ) -endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All") -# Generic LAPACK library? -if (BLA_VENDOR STREQUAL "Generic" OR - BLA_VENDOR STREQUAL "ATLAS" OR - BLA_VENDOR STREQUAL "All") - if ( NOT LAPACK_LIBRARIES ) - check_lapack_libraries( - LAPACK_LIBRARIES - LAPACK - cheev - "" - "lapack" - "${BLAS_LIBRARIES}" - "" - ) - endif ( NOT LAPACK_LIBRARIES ) -endif () #intel lapack if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All") if (NOT WIN32) @@ -431,6 +411,73 @@ if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All") endforeach () endif () endif() + +#goto lapack +if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") + if(NOT LAPACK_LIBRARIES) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "goto2" + "${BLAS_LIBRARIES}" + "" + ) + endif(NOT LAPACK_LIBRARIES) +endif (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") + + +#acml lapack + if (BLA_VENDOR MATCHES "ACML.*" OR BLA_VENDOR STREQUAL "All") + if (BLAS_LIBRARIES MATCHES ".+acml.+") + set (LAPACK_LIBRARIES ${BLAS_LIBRARIES}) + endif () + endif () + +# Apple LAPACK library? +if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All") + if(NOT LAPACK_LIBRARIES) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "Accelerate" + "${BLAS_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 ) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "vecLib" + "${BLAS_LIBRARIES}" + "" + ) + endif ( NOT LAPACK_LIBRARIES ) +endif (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All") +# Generic LAPACK library? +if (BLA_VENDOR STREQUAL "Generic" OR + BLA_VENDOR STREQUAL "ATLAS" OR + BLA_VENDOR STREQUAL "All") + if ( NOT LAPACK_LIBRARIES ) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "lapack" + "${BLAS_LIBRARIES}" + "" + ) + endif ( NOT LAPACK_LIBRARIES ) +endif () else(BLAS_FOUND) message(STATUS "LAPACK requires BLAS") endif(BLAS_FOUND) @@ -506,11 +553,13 @@ endif(BLA_F95) set(CMAKE_FIND_LIBRARY_SUFFIXES ${_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) -if (LAPACK_FOUND AND NOT LAPACK_DIR) +if (LAPACK_FOUND) list(GET LAPACK_LIBRARIES 0 first_lib) get_filename_component(first_lib_path "${first_lib}" PATH) if (${first_lib_path} MATCHES "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)") string(REGEX REPLACE "(/lib(32|64)?$)|(/lib/intel64$|/lib/ia32$)" "" not_cached_dir "${first_lib_path}") - set(LAPACK_DIR "${not_cached_dir}" CACHE PATH "Installation directory of LAPACK library" FORCE) + set(LAPACK_DIR_FOUND "${not_cached_dir}" CACHE PATH "Installation directory of LAPACK library" FORCE) + else() + set(LAPACK_DIR_FOUND "${first_lib_path}" CACHE PATH "Installation directory of LAPACK library" FORCE) endif() endif() diff --git a/CMakeModules/morse/find/FindQUARK.cmake b/CMakeModules/morse/find/FindQUARK.cmake index 68e7923f603d1f15ad634dea5e5186e9a24487ab..507f00f71b880fe3ffa16521b397cc2c78e5baa3 100644 --- a/CMakeModules/morse/find/FindQUARK.cmake +++ b/CMakeModules/morse/find/FindQUARK.cmake @@ -224,7 +224,7 @@ if(QUARK_LIBRARIES) set(REQUIRED_INCDIRS "${QUARK_INCLUDE_DIRS}") endif() if (QUARK_LIBRARY_DIRS) - set(CMAKE_REQUIRED_FLAGS "${QUARK_LIBRARY_DIRS}") + set(REQUIRED_LIBDIRS "${QUARK_LIBRARY_DIRS}") endif() set(REQUIRED_LIBS "${QUARK_LIBRARIES}") # HWLOC