diff --git a/CMakeModules/morse/find/FindFFTW.cmake b/CMakeModules/morse/find/FindFFTW.cmake index 8a992479577a07cbced3ee471947196915484c82..ac98df8b664267d7f9bb224f215cc28a1b6bb6fb 100644 --- a/CMakeModules/morse/find/FindFFTW.cmake +++ b/CMakeModules/morse/find/FindFFTW.cmake @@ -64,10 +64,10 @@ if (NOT FFTW_FOUND) - 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() + 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() endif() # Set the version to find @@ -80,223 +80,264 @@ set(FFTW_LOOK_FOR_FFTW_LONG OFF) set(FFTW_LOOK_FOR_FFTW_QUAD OFF) if( FFTW_FIND_COMPONENTS ) - foreach( component ${FFTW_FIND_COMPONENTS} ) - if (${component} STREQUAL "THREADS") - # means we look for the Threads version of FFTW - set(FFTW_LOOK_FOR_THREADS ON) - endif() - if (${component} STREQUAL "OMP") - # means we look for the OpenMP version of FFTW - set(FFTW_LOOK_FOR_OMP ON) - endif() - if (${component} STREQUAL "SIMPLE") - # means we look for FFTW simple precision (fftw3f) - set(FFTW_LOOK_FOR_FFTW_SIMPLE ON) - set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) - set(FFTW_LOOK_FOR_FFTW_LONG OFF) - set(FFTW_LOOK_FOR_FFTW_QUAD OFF) - endif() - if (${component} STREQUAL "DOUBLE") - # means we look for FFTW double precision (fftw3) - set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) - set(FFTW_LOOK_FOR_FFTW_DOUBLE ON) - set(FFTW_LOOK_FOR_FFTW_LONG OFF) - set(FFTW_LOOK_FOR_FFTW_QUAD OFF) - endif() - if (${component} STREQUAL "LONG") - # means we look for FFTW long double precision (fftw3l) - set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) - set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) - set(FFTW_LOOK_FOR_FFTW_LONG ON) - set(FFTW_LOOK_FOR_FFTW_QUAD OFF) - endif() - if (${component} STREQUAL "QUAD") - # means we look for FFTW quad precision (fftw3q) - set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) - set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) - set(FFTW_LOOK_FOR_FFTW_LONG OFF) - set(FFTW_LOOK_FOR_FFTW_QUAD ON) - endif() - if (${component} STREQUAL "MKL") - # means we look for the Intel MKL version of FFTW - set(FFTW_LOOK_FOR_MKL ON) - if (FFTW_LOOK_FOR_FFTW_LONG) - message(WARNING "Looking for FFTW -- long precision functions do not exist in MKL FFTW") - set(FFTW_LOOK_FOR_FFTW_LONG OFF) - endif() - if (FFTW_LOOK_FOR_FFTW_QUAD) - message(WARNING "Looking for FFTW -- quadruple functions do not exist in MKL FFTW") - set(FFTW_LOOK_FOR_FFTW_QUAD OFF) - endif() - endif() - endforeach() + foreach( component ${FFTW_FIND_COMPONENTS} ) + if (${component} STREQUAL "THREADS") + # means we look for the Threads version of FFTW + set(FFTW_LOOK_FOR_THREADS ON) + endif() + if (${component} STREQUAL "OMP") + # means we look for the OpenMP version of FFTW + set(FFTW_LOOK_FOR_OMP ON) + endif() + if (${component} STREQUAL "SIMPLE") + # means we look for FFTW simple precision (fftw3f) + set(FFTW_LOOK_FOR_FFTW_SIMPLE ON) + set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + if (${component} STREQUAL "DOUBLE") + # means we look for FFTW double precision (fftw3) + set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) + set(FFTW_LOOK_FOR_FFTW_DOUBLE ON) + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + if (${component} STREQUAL "LONG") + # means we look for FFTW long double precision (fftw3l) + set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) + set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) + set(FFTW_LOOK_FOR_FFTW_LONG ON) + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + if (${component} STREQUAL "QUAD") + # means we look for FFTW quad precision (fftw3q) + set(FFTW_LOOK_FOR_FFTW_SIMPLE OFF) + set(FFTW_LOOK_FOR_FFTW_DOUBLE OFF) + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + set(FFTW_LOOK_FOR_FFTW_QUAD ON) + endif() + if (${component} STREQUAL "MKL") + # means we look for the Intel MKL version of FFTW + set(FFTW_LOOK_FOR_MKL ON) + if (FFTW_LOOK_FOR_FFTW_LONG) + message(WARNING "Looking for FFTW -- long precision functions do not exist in MKL FFTW") + set(FFTW_LOOK_FOR_FFTW_LONG OFF) + endif() + if (FFTW_LOOK_FOR_FFTW_QUAD) + message(WARNING "Looking for FFTW -- quadruple functions do not exist in MKL FFTW") + set(FFTW_LOOK_FOR_FFTW_QUAD OFF) + endif() + endif() + endforeach() endif() if (FFTW_LOOK_FOR_THREADS) - if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_THREADS) - find_package(Threads REQUIRED) - else() - find_package(Threads) - endif() + if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_THREADS) + find_package(Threads REQUIRED) + else() + find_package(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() + 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) - else() - find_package(OpenMP) - endif() + if (FFTW_FIND_REQUIRED AND FFTW_FIND_REQUIRED_OMP) + find_package(OpenMP REQUIRED) + else() + find_package(OpenMP) + endif() endif() -# 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) +set(ENV_FFTW_LIBDIR "$ENV{FFTW_LIBDIR}") +set(FFTW_GIVEN_BY_USER "FALSE") +if ( FFTW_DIR OR ( FFTW_INCDIR AND FFTW_LIBDIR) OR ENV_FFTW_DIR OR (ENV_FFTW_INCDIR AND ENV_FFTW_LIBDIR) ) + set(FFTW_GIVEN_BY_USER "TRUE") +endif() + +# Optionally use pkg-config to detect include/library dirs (if pkg-config is available) +# ------------------------------------------------------------------------------------- +include(FindPkgConfig) +find_package(PkgConfig QUIET) +if( PKG_CONFIG_EXECUTABLE AND NOT FFTW_GIVEN_BY_USER ) + + pkg_search_module(FFTW fftw3) + if (NOT FFTW_FIND_QUIETLY) + if (FFTW_FOUND AND FFTW_LIBRARIES) + message(STATUS "Looking for FFTW - found using PkgConfig") + #if(NOT FFTW_INCLUDE_DIRS) + # message("${Magenta}FFTW_INCLUDE_DIRS is empty using PkgConfig." + # "Perhaps the path to hwloc headers is already present in your" + # "C(PLUS)_INCLUDE_PATH environment variable.${ColourReset}") + #endif() + else() + message("${Magenta}Looking for FFTW - not found using PkgConfig." + "Perhaps you should add the directory containing fftw3.pc to" + "the PKG_CONFIG_PATH environment variable.${ColourReset}") + endif() + endif() + + set(FFTW_INCLUDE_DIRS_DEP "${FFTW_INCLUDE_DIRS}") + set(FFTW_LIBRARY_DIRS_DEP "${FFTW_LIBRARY_DIRS}") + set(FFTW_LIBRARIES_DEP "${FFTW_LIBRARIES}") + set(FFTW_WORKS TRUE) + +endif( PKG_CONFIG_EXECUTABLE AND NOT FFTW_GIVEN_BY_USER ) + + +if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR (FFTW_GIVEN_BY_USER) ) + + # 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) + 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() + else() if (ENV_MKLROOT) - list(APPEND _inc_env "${ENV_MKLROOT}/include/fftw") + list(APPEND _inc_env "${ENV_MKLROOT}/include/fftw") endif() # system variables if(WIN32) - string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") - list(APPEND _inc_env "${_path_env}") + 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}") - string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") - list(APPEND _inc_env "${_path_env}") - string(REPLACE ":" ";" _path_env "$ENV{CPATH}") - list(APPEND _inc_env "${_path_env}") - string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") - list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{C_INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{CPATH}") + list(APPEND _inc_env "${_path_env}") + string(REPLACE ":" ";" _path_env "$ENV{INCLUDE_PATH}") + list(APPEND _inc_env "${_path_env}") endif() -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() + 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" "include/fftw") + 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" "include/fftw") 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} - PATH_SUFFIXES "fftw") + set(FFTW_fftw3.h_DIRS "FFTW_fftw3.h_DIRS-NOTFOUND") + find_path(FFTW_fftw3.h_DIRS + NAMES fftw3.h + HINTS ${PATH_TO_LOOK_FOR} + PATH_SUFFIXES "fftw") endif() -endif() -mark_as_advanced(FFTW_fftw3.h_DIRS) + endif() + mark_as_advanced(FFTW_fftw3.h_DIRS) -# Add path to cmake variable -# ------------------------------------ -if (FFTW_fftw3.h_DIRS) + # Add path to cmake variable + # ------------------------------------ + if (FFTW_fftw3.h_DIRS) set(FFTW_INCLUDE_DIRS "${FFTW_fftw3.h_DIRS}") -else () + else () set(FFTW_INCLUDE_DIRS "FFTW_INCLUDE_DIRS-NOTFOUND") if(NOT FFTW_FIND_QUIETLY) - message(STATUS "Looking for FFTW -- fftw3.h not found") + message(STATUS "Looking for FFTW -- fftw3.h not found") endif() -endif () + endif () -# Looking for lib -# --------------- + # Looking for lib + # --------------- -# Add system library paths to search lib -# -------------------------------------- -unset(_lib_env) -set(ENV_FFTW_LIBDIR "$ENV{FFTW_LIBDIR}") -if(ENV_FFTW_LIBDIR) + # 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) + 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") + 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") + list(APPEND _lib_env "${ENV_FFTW_DIR}/lib32") + list(APPEND _lib_env "${ENV_FFTW_DIR}/lib/ia32") endif() -else() + else() if (ENV_MKLROOT) - list(APPEND _lib_env "${ENV_MKLROOT}/lib") - if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - list(APPEND _lib_env "${ENV_MKLROOT}/lib64") - list(APPEND _lib_env "${ENV_MKLROOT}/lib/intel64") - else() - list(APPEND _lib_env "${ENV_MKLROOT}/lib32") - list(APPEND _lib_env "${ENV_MKLROOT}/lib/ia32") - endif() + list(APPEND _lib_env "${ENV_MKLROOT}/lib") + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + list(APPEND _lib_env "${ENV_MKLROOT}/lib64") + list(APPEND _lib_env "${ENV_MKLROOT}/lib/intel64") + else() + list(APPEND _lib_env "${ENV_MKLROOT}/lib32") + list(APPEND _lib_env "${ENV_MKLROOT}/lib/ia32") + endif() endif() if(WIN32) - string(REPLACE ":" ";" _lib_env2 "$ENV{LIB}") + string(REPLACE ":" ";" _lib_env2 "$ENV{LIB}") else() - if(APPLE) - string(REPLACE ":" ";" _lib_env2 "$ENV{DYLD_LIBRARY_PATH}") - else() - 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}") + if(APPLE) + string(REPLACE ":" ";" _lib_env2 "$ENV{DYLD_LIBRARY_PATH}") + else() + 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() -endif() -list(REMOVE_DUPLICATES _lib_env) + endif() + list(REMOVE_DUPLICATES _lib_env) -# set paths where to look for -set(PATH_TO_LOOK_FOR "${_lib_env}") + # set paths where to look for + set(PATH_TO_LOOK_FOR "${_lib_env}") -if(FFTW_LOOK_FOR_FFTW_SIMPLE) + if(FFTW_LOOK_FOR_FFTW_SIMPLE) set(FFTW_PREC "f") set(FFTW_PREC_TESTFUNC "s") -elseif(FFTW_LOOK_FOR_FFTW_DOUBLE) + elseif(FFTW_LOOK_FOR_FFTW_DOUBLE) set(FFTW_PREC "") set(FFTW_PREC_TESTFUNC "d") -elseif(FFTW_LOOK_FOR_FFTW_LONG) + elseif(FFTW_LOOK_FOR_FFTW_LONG) set(FFTW_PREC "l") set(FFTW_PREC_TESTFUNC "l") -elseif(FFTW_LOOK_FOR_FFTW_QUAD) + elseif(FFTW_LOOK_FOR_FFTW_QUAD) set(FFTW_PREC "q") set(FFTW_PREC_TESTFUNC "q") -endif() + endif() -if (FFTW_LOOK_FOR_MKL) + if (FFTW_LOOK_FOR_MKL) set(FFTW_libs_to_find "mkl_intel_lp64;mkl_sequential;mkl_core") @@ -305,39 +346,39 @@ if (FFTW_LOOK_FOR_MKL) # 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() + 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_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() + 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() 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};fftw3") + set(FFTW_libs_to_find "fftw3${FFTW_PREC}_threads;fftw3${FFTW_PREC};fftw3") elseif (FFTW_LOOK_FOR_OMP) - set(FFTW_libs_to_find "fftw3${FFTW_PREC}_omp;fftw3${FFTW_PREC};fftw3") + set(FFTW_libs_to_find "fftw3${FFTW_PREC}_omp;fftw3${FFTW_PREC};fftw3") else() - set(FFTW_libs_to_find "fftw3${FFTW_PREC};fftw3") + set(FFTW_libs_to_find "fftw3${FFTW_PREC};fftw3") endif() # Try to find the fftw lib in the given paths @@ -345,59 +386,59 @@ else(FFTW_LOOK_FOR_MKL) # 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() + 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_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() + 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() endif() -endif(FFTW_LOOK_FOR_MKL) + 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 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}") + 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() + 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) -endforeach() + endforeach() -list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS) -list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS) + list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS) + list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS) -# check a function to validate the find -if(FFTW_LIBRARIES) + # check a function to validate the find + if(FFTW_LIBRARIES) set(REQUIRED_FLAGS) set(REQUIRED_LDFLAGS) @@ -407,39 +448,39 @@ if(FFTW_LIBRARIES) # FFTW if (FFTW_INCLUDE_DIRS) - set(REQUIRED_INCDIRS "${FFTW_INCLUDE_DIRS}") + set(REQUIRED_INCDIRS "${FFTW_INCLUDE_DIRS}") endif() if (FFTW_LIBRARY_DIRS) - set(REQUIRED_LIBDIRS "${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}") + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") endif() # OMP if(FFTW_LOOK_FOR_OMP) - if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - # either gomp ... - #set(REQUIRED_FLAGS "-fopenmp") - #list(APPEND REQUIRED_LIBS "-lgomp") - # or iomp5 - list(APPEND REQUIRED_LIBS "-liomp5") - elseif (CMAKE_C_COMPILER_ID STREQUAL "Intel") - list(APPEND REQUIRED_LIBS "-liomp5") - endif() + if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + # either gomp ... + #set(REQUIRED_FLAGS "-fopenmp") + #list(APPEND REQUIRED_LIBS "-lgomp") + # or iomp5 + list(APPEND REQUIRED_LIBS "-liomp5") + elseif (CMAKE_C_COMPILER_ID STREQUAL "Intel") + list(APPEND REQUIRED_LIBS "-liomp5") + endif() endif() # MKL if(FFTW_LOOK_FOR_MKL) - list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") - if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") - list(APPEND REQUIRED_LDFLAGS "-Wl,--no-as-needed") - endif() + list(APPEND REQUIRED_LIBS "${CMAKE_THREAD_LIBS_INIT}") + if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND REQUIRED_LDFLAGS "-Wl,--no-as-needed") + endif() endif() # m find_library(M_LIBRARY NAMES m) if(M_LIBRARY) - list(APPEND REQUIRED_LIBS "-lm") + list(APPEND REQUIRED_LIBS "-lm") endif() # set required libraries for link @@ -447,7 +488,7 @@ if(FFTW_LIBRARIES) set(CMAKE_REQUIRED_LIBRARIES) list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LDFLAGS}") foreach(lib_dir ${REQUIRED_LIBDIRS}) - list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") + list(APPEND CMAKE_REQUIRED_LIBRARIES "-L${lib_dir}") endforeach() list(APPEND CMAKE_REQUIRED_LIBRARIES "${REQUIRED_LIBS}") list(APPEND CMAKE_REQUIRED_FLAGS "${REQUIRED_FLAGS}") @@ -460,46 +501,48 @@ if(FFTW_LIBRARIES) 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) + # 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() + 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(FFTW_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) endif() set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_FLAGS) set(CMAKE_REQUIRED_LIBRARIES) -endif(FFTW_LIBRARIES) + endif(FFTW_LIBRARIES) + +endif( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT FFTW_FOUND) OR (FFTW_GIVEN_BY_USER) ) 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_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() + 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_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() # check that FFTW has been found # ------------------------------- include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FFTW DEFAULT_MSG - FFTW_LIBRARIES - FFTW_INCLUDE_DIRS - FFTW_WORKS) + FFTW_LIBRARIES + FFTW_INCLUDE_DIRS + FFTW_WORKS)