Skip to content
Snippets Groups Projects
Commit 1c5add8e authored by Jean-Baptiste Keck's avatar Jean-Baptiste Keck
Browse files

Updated FindFFTW.cmake to handle extra libraries.

parent 944dd4bc
No related branches found
No related tags found
No related merge requests found
......@@ -8,80 +8,173 @@
# Set fftw_DIR=where_fftw_is_installed if it's not in a "classic" place or if you want a specific version
#
# Written by F. Pérignon, nov/2009
# Updated by J-B. Keck, feb/2016
# inspired from http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries
include(LibFindMacros)
find_package(PkgConfig)
# Use pkg-config to get hints about paths
libfind_pkg_check_modules(FFTW_PKGCONF fftw3)
# --version check not supported yet
set(FFTW_VERSION_STRING ${FFTW_FIND_VERSION})
# Include dir
# -- user-defined
find_path(
FFTW_INCLUDE_DIR
NAMES fftw3.h
#NO_CMAKE_ENVIRONMENT_PATH
PATHS ${fftw_DIR} PATHS ENV INCLUDE ENV PATH ${FFTW_PKGCONF_INCLUDE_DIRS}
PATH_SUFFIXES include
NO_DEFAULT_PATH
)
# -- default
find_path(FFTW_INCLUDE_DIR NAMES fftw3.h)
# --main variables generated by this module
list(APPEND FFTW_INCLUDE_DIRS "")
list(APPEND FFTW_LIBRARY_DIRS "")
list(APPEND FFTW_LIBRARIES "")
if(FIND_FFTW_VERBOSE)
message(STATUS "Entering FindFFTW.cmake in verbose mode:")
endif()
# Finally the library itself
find_library(
FFTW_LIBRARY
NAMES fftw3
PATHS ${fftw_DIR} ${FFTW_INCLUDE_DIR}/.. ENV LIBRARY_PATH ENV LD_LIBRARY_PATH ${FFTW_PKGCONF_LIBRARY_DIRS}
PATH_SUFFIXES lib
NO_DEFAULT_PATH
)
foreach(fftw_comp ${FFTW_FIND_COMPONENTS})
string(REPLACE "-" "_" fftw_comp_no_dash "${fftw_comp}")
string(TOLOWER ${fftw_comp_no_dash} component)
string(TOUPPER ${fftw_comp_no_dash} COMPONENT)
find_library(FFTW_LIBRARY
NAMES fftw3
)
# -- check if component has not already been found
if(${COMPONENT}_FOUND)
continue()
endif()
# Finally the library itself, mpi version
find_library(
FFTW_MPI_LIBRARY
NAMES fftw3_mpi
PATHS ${fftw_DIR} ${FFTW_INCLUDE_DIR}/.. ENV LIBRARY_PATH ENV LD_LIBRARY_PATH ${FFTW_PKGCONF_LIBRARY_DIRS}
PATH_SUFFIXES lib
NO_DEFAULT_PATH
)
# -- find header name given the component name
string(REGEX REPLACE "_(omp|threads)" "" component_without_ext "${component}")
string(REGEX REPLACE "_mpi" "-mpi" component_without_ext "${component_without_ext}")
string(REGEX REPLACE "fftw3[fdlq]" "fftw3" header "${component_without_ext}.h")
find_library(FFTW_MPI_LIBRARY
NAMES fftw3_mpi
)
# -- find library name given the component name
string(REPLACE "fftw3d" "fftw3" library "${component}")
if(FIND_FFTW_DEBUG)
message("\tFFTW::${fftw_comp}:${COMPONENT}:${component}, LIB=${library} HEADER=${header}")
endif()
# -- use pkg-config to get hints about paths
pkg_check_modules(${COMPONENT}_PKGCONF ${library} ${header} QUIET)
# Finally the library itself, float version
find_library(
FFTWFloat_LIBRARY
NAMES fftw3f
PATHS ${fftw_DIR} ENV LIBRARY_PATH ENV LD_LIBRARY_PATH ${FFTW_PKGCONF_LIBRARY_DIRS}
PATH_SUFFIXES lib
NO_DEFAULT_PATH
)
find_library(FFTWFloat_LIBRARY
NAMES fftw3f
)
# -- find include dir
find_path(
${COMPONENT}_INCLUDE_DIR
NAMES ${header}
PATHS ${FFTW_INCLUDE_DIRS}
NO_DEFAULT_PATH
)
find_path(
${COMPONENT}_INCLUDE_DIR
NAMES ${header}
PATHS ${fftw_DIR}
PATHS ${${COMPONENT}_PKGCONF_INCLUDE_DIRS}
PATHS ENV INCLUDE
ENV PATH
ENV C_INCLUDE_PATH
PATH_SUFFIXES include
NO_DEFAULT_PATH
)
# -- search in default locations only if last search failed
find_path(FFTW_INCLUDE_DIR NAMES ${header})
# Finally the library itself, float and mpi version
find_library(
FFTWFloat_MPI_LIBRARY
NAMES fftw3f_mpi
PATHS ${fftw_DIR} ENV LIBRARY_PATH ENV LD_LIBRARY_PATH ${FFTW_PKGCONF_LIBRARY_DIRS}
PATH_SUFFIXES lib
NO_DEFAULT_PATH
)
find_library(FFTWFloat_MPI_LIBRARY
NAMES fftw3f_mpi
)
if(${${COMPONENT}_INCLUDE_DIR} STREQUAL "${COMPONENT}_INCLUDE_DIR-NOTFOUND")
set(INCLUDE_DIR_FOUND FALSE)
else()
set(INCLUDE_DIR_FOUND TRUE)
endif()
#other types for the CXX library
find_library(FFTWLongDouble_LIBRARY NAMES fftw3l)
find_library(FFTW__float128_LIBRARY NAMES fftw3q)
# -- find library
find_library(
${COMPONENT}_LIBRARY
NAMES ${library}
PATHS ${FFTW_LIBRARY_DIRS}
NO_DEFAULT_PATH
)
find_library(
${COMPONENT}_LIBRARY
NAMES ${library}
PATHS ${fftw_DIR}
PATHS ${${COMPONENT}_INCLUDE_DIR}/..
PATHS ${${COMPONENT}_PKGCONF_LIBRARY_DIRS}}
PATHS ENV LIBRARY_PATH
ENV LD_LIBRARY_PATH
ENV DYLD_LIBRARY_PATH
PATH_SUFFIXES lib
NO_DEFAULT_PATH
)
# -- default locations
find_library(${COMPONENT}_LIBRARY NAMES ${library})
# -- if component is required append it to required vars
if(FFTW_FIND_REQUIRED_${fftw_comp})
list(APPEND FFTW_REQUIRED_INCLUDE_DIRS ${COMPONENT}_INCLUDE_DIR)
list(APPEND FFTW_REQUIRED_LIBRARIES ${COMPONENT}_LIBRARY)
endif()
set(FFTW_PROCESS_INCLUDES FFTW_INCLUDE_DIR)
set(FFTW_PROCESS_LIBS FFTW_LIBRARY FFTWFloat_LIBRARY FFTW_MPI_LIBRARY FFTWFloat_MPI_LIBRARY FFTWLongDouble_LIBRARY FFTW__float128_LIBRARY)
libfind_process(FFTW)
# --extract library dir and library name
if(${${COMPONENT}_LIBRARY} STREQUAL "${COMPONENT}_LIBRARY-NOTFOUND")
set(LIBRARY_DIR_FOUND FALSE)
else()
get_filename_component(${COMPONENT}_LIBRARY_DIR "${${COMPONENT}_LIBRARY}" DIRECTORY)
set(${COMPONENT}_LIBRARY "${library}")
set(LIBRARY_DIR_FOUND TRUE)
endif()
# -- find quadmath library if required
string(FIND ${component} "fftw3q" FFTWQ_POS)
if(FFTWQ_POS EQUAL 0)
list(APPEND FFTW_LIBRARIES "quadmath")
endif()
if(LIBRARY_DIR_FOUND AND INCLUDE_DIR_FOUND)
set(${COMPONENT}_FOUND TRUE)
list(APPEND ${COMPONENT}_INCLUDE_DIRS ${${COMPONENT}_INCLUDE_DIR})
list(APPEND ${COMPONENT}_LIBRARY_DIRS ${${COMPONENT}_LIBRARY_DIR})
list(APPEND ${COMPONENT}_LIBRARIES ${${COMPONENT}_LIBRARY})
list(APPEND FFTW_INCLUDE_DIRS ${${COMPONENT}_INCLUDE_DIRS})
list(APPEND FFTW_LIBRARY_DIRS ${${COMPONENT}_LIBRARY_DIRS})
list(APPEND FFTW_LIBRARIES ${${COMPONENT}_LIBRARIES})
if(FIND_FFTW_VERBOSE)
message("\tFound FFTW::${fftw_comp} with parameters '-I${${COMPONENT}_INCLUDE_DIR} -L${${COMPONENT}_LIBRARY_DIR} -l${${COMPONENT}_LIBRARY}'.")
endif()
else()
set(${COMPONENT}_FOUND FALSE)
if(FFTW_FIND_REQUIRED_${fftw_comp})
if(NOT FFTW_FIND_QUIETLY)
message(FATAL_ERROR "Error: Could not find required component FFTW::${fftw_comp} (${COMPONENT}_INCLUDE_DIR='${${COMPONENT}_INCLUDE_DIR}' and ${COMPONENT}_LIBRARY='${${COMPONENT}_LIBRARY}'.)")
endif()
else()
if(FIND_FFTW_VERBOSE)
message("\tCould not find optional FFTW::${fftw_comp}.")
endif()
if(FIND_FFTW_DEBUG)
message(STATUS "\t\t${COMPONENT}_INCLUDE_DIR='${${COMPONENT}_INCLUDE_DIR}' and ${COMPONENT}_LIBRARY='${${COMPONENT}_LIBRARY}'")
endif()
endif()
endif()
unset(${COMPONENT}_INCLUDE_DIR)
unset(${COMPONENT}_LIBRARY_DIR)
unset(${COMPONENT}_LIBRARY)
unset(FFTWQ_POS)
unset(library)
unset(header)
unset(fftw_comp_no_dash)
unset(component)
unset(COMPONENT)
endforeach()
list(REMOVE_DUPLICATES FFTW_INCLUDE_DIRS)
list(REMOVE_DUPLICATES FFTW_LIBRARY_DIRS)
list(REMOVE_DUPLICATES FFTW_LIBRARIES)
# -- check required variables, version and set FFTW_FOUND to TRUE if ok
find_package_handle_standard_args(FFTW FOUND_VAR FFTW_FOUND
REQUIRED_VARS ${FFTW_REQUIRED_LIBRARIES} ${FFTW_REQUIRED_INCLUDE_DIRS}
VERSION_VAR FFTW_VERSION_STRING)
if(FIND_FFTW_DEBUG)
message(STATUS "FFTW_FOUND='${FFTW_FOUND}'")
message(STATUS "FFTW_INCLUDE_DIRS='${FFTW_INCLUDE_DIRS}'")
message(STATUS "FFTW_LIBRARY_DIRS='${FFTW_LIBRARY_DIRS}'")
message(STATUS "FFTW_LIBRARIES='${FFTW_LIBRARIES}'")
endif()
unset(FFTW_REQUIRED_LIBRARIES)
unset(FFTW_REQUIRED_INCLUDE_DIRS)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment