find/FindFFTW.cmake

450 lines
13 KiB
CMake

# - Find the FFTW library
#
# Original version of this file:
# Copyright (c) 2015, Wenzel Jakob
# https://github.com/wjakob/layerlab/blob/master/cmake/FindFFTW.cmake, commit 4d58bfdc28891b4f9373dfe46239dda5a0b561c6
# Modifications:
# Copyright (c) 2017, Patrick Bos
#
# Usage:
# find_package(FFTW [version] [REQUIRED] [QUIET] [COMPONENTS component1 ... componentX] )
#
# It sets the following variables:
# FFTW_FOUND ... true if fftw is found on the system
# FFTW_[component]_LIB_FOUND ... true if the component is found on the system (see components below)
# FFTW_LIBRARIES ... full paths to all found fftw libraries
# FFTW_[component]_LIB ... full path to one of the components (see below)
# FFTW_INCLUDE_DIRS ... fftw include directory paths
# FFTW_VERSION ... fftw version found
#
# The following variables will be checked by the function
# FFTW_USE_STATIC_LIBS ... if true, only static libraries are found, otherwise both static and shared.
# FFTW_ROOT ... if set, the libraries are exclusively searched
# under this path
#
# This package supports the following components:
# FLOAT_LIB
# DOUBLE_LIB
# LONGDOUBLE_LIB
# FLOAT_THREADS_LIB
# DOUBLE_THREADS_LIB
# LONGDOUBLE_THREADS_LIB
# FLOAT_OPENMP_LIB
# DOUBLE_OPENMP_LIB
# LONGDOUBLE_OPENMP_LIB
#
# TODO (maybe): extend with ExternalProject download + build option
# TODO: put on conda-forge
if( NOT FFTW_ROOT AND DEFINED ENV{FFTWDIR} )
set( FFTW_ROOT $ENV{FFTWDIR} )
endif()
# Check if we can use PkgConfig
find_package(PkgConfig)
#Determine from PKG
if( PKG_CONFIG_FOUND AND NOT FFTW_ROOT )
pkg_check_modules( PKG_FFTW QUIET "fftw3" )
endif()
#Check whether to search static or dynamic libs
set( CMAKE_FIND_LIBRARY_SUFFIXES_SAV ${CMAKE_FIND_LIBRARY_SUFFIXES} )
if( ${FFTW_USE_STATIC_LIBS} )
set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX} )
else()
set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV} )
endif()
if( FFTW_ROOT )
# find libs
find_library(
FFTW_DOUBLE_LIB
NAMES "fftw3" libfftw3-3
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_DOUBLE_THREADS_LIB
NAMES "fftw3_threads"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_DOUBLE_OPENMP_LIB
NAMES "fftw3_omp"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_DOUBLE_MPI_LIB
NAMES "fftw3_mpi"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_FLOAT_LIB
NAMES "fftw3f" libfftw3f-3
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_FLOAT_THREADS_LIB
NAMES "fftw3f_threads"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_FLOAT_OPENMP_LIB
NAMES "fftw3f_omp"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_FLOAT_MPI_LIB
NAMES "fftw3f_mpi"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_LONGDOUBLE_LIB
NAMES "fftw3l" libfftw3l-3
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_LONGDOUBLE_THREADS_LIB
NAMES "fftw3l_threads"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_LONGDOUBLE_OPENMP_LIB
NAMES "fftw3l_omp"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
find_library(
FFTW_LONGDOUBLE_MPI_LIB
NAMES "fftw3l_mpi"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "lib" "lib64"
NO_DEFAULT_PATH
)
#find includes
find_path(FFTW_INCLUDE_DIRS
NAMES "fftw3.h"
PATHS ${FFTW_ROOT}
PATH_SUFFIXES "include"
NO_DEFAULT_PATH
)
else()
find_library(
FFTW_DOUBLE_LIB
NAMES "fftw3"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_DOUBLE_THREADS_LIB
NAMES "fftw3_threads"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_DOUBLE_OPENMP_LIB
NAMES "fftw3_omp"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_DOUBLE_MPI_LIB
NAMES "fftw3_mpi"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_FLOAT_LIB
NAMES "fftw3f"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_FLOAT_THREADS_LIB
NAMES "fftw3f_threads"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_FLOAT_OPENMP_LIB
NAMES "fftw3f_omp"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_FLOAT_MPI_LIB
NAMES "fftw3f_mpi"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_LONGDOUBLE_LIB
NAMES "fftw3l"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(
FFTW_LONGDOUBLE_THREADS_LIB
NAMES "fftw3l_threads"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(FFTW_LONGDOUBLE_OPENMP_LIB
NAMES "fftw3l_omp"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_library(FFTW_LONGDOUBLE_MPI_LIB
NAMES "fftw3l_mpi"
PATHS ${PKG_FFTW_LIBRARY_DIRS} ${LIB_INSTALL_DIR}
)
find_path(FFTW_INCLUDE_DIRS
NAMES "fftw3.h"
PATHS ${PKG_FFTW_INCLUDE_DIRS} ${INCLUDE_INSTALL_DIR}
)
endif( FFTW_ROOT )
#--------------------------------------- components
if (FFTW_DOUBLE_LIB AND NOT TARGET FFTW::Double)
set(FFTW_DOUBLE_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_DOUBLE_LIB})
add_library(FFTW::Double INTERFACE IMPORTED)
set_target_properties(FFTW::Double
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_DOUBLE_LIB}"
)
else()
set(FFTW_DOUBLE_LIB_FOUND FALSE)
endif()
if (FFTW_FLOAT_LIB AND NOT TARGET FFTW::Float)
set(FFTW_FLOAT_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_FLOAT_LIB})
add_library(FFTW::Float INTERFACE IMPORTED)
set_target_properties(FFTW::Float
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_FLOAT_LIB}"
)
else()
set(FFTW_FLOAT_LIB_FOUND FALSE)
endif()
if (FFTW_LONGDOUBLE_LIB AND NOT TARGET FFTW::LongDouble)
set(FFTW_LONGDOUBLE_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_LONGDOUBLE_LIB})
add_library(FFTW::LongDouble INTERFACE IMPORTED)
set_target_properties(FFTW::LongDouble
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_LONGDOUBLE_LIB}"
)
else()
set(FFTW_LONGDOUBLE_LIB_FOUND FALSE)
endif()
if (FFTW_DOUBLE_THREADS_LIB AND NOT TARGET FFTW::DoubleThreads)
set(FFTW_DOUBLE_THREADS_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_DOUBLE_THREADS_LIB})
add_library(FFTW::DoubleThreads INTERFACE IMPORTED)
set_target_properties(FFTW::DoubleThreads
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_DOUBLE_THREADS_LIB}"
)
else()
set(FFTW_DOUBLE_THREADS_LIB_FOUND FALSE)
endif()
if (FFTW_FLOAT_THREADS_LIB AND NOT TARGET FFTW::FloatThreads)
set(FFTW_FLOAT_THREADS_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_FLOAT_THREADS_LIB})
add_library(FFTW::FloatThreads INTERFACE IMPORTED)
set_target_properties(FFTW::FloatThreads
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_FLOAT_THREADS_LIB}"
)
else()
set(FFTW_FLOAT_THREADS_LIB_FOUND FALSE)
endif()
if (FFTW_LONGDOUBLE_THREADS_LIB AND NOT TARGET FFTW::LongDoubleThreads)
set(FFTW_LONGDOUBLE_THREADS_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_LONGDOUBLE_THREADS_LIB})
add_library(FFTW::LongDoubleThreads INTERFACE IMPORTED)
set_target_properties(FFTW::LongDoubleThreads
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_LONGDOUBLE_THREADS_LIB}"
)
else()
set(FFTW_LONGDOUBLE_THREADS_LIB_FOUND FALSE)
endif()
if (FFTW_DOUBLE_OPENMP_LIB AND NOT TARGET FFTW::DoubleOpenMP)
set(FFTW_DOUBLE_OPENMP_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_DOUBLE_OPENMP_LIB})
add_library(FFTW::DoubleOpenMP INTERFACE IMPORTED)
set_target_properties(FFTW::DoubleOpenMP
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_DOUBLE_OPENMP_LIB}"
)
else()
set(FFTW_DOUBLE_OPENMP_LIB_FOUND FALSE)
endif()
if (FFTW_FLOAT_OPENMP_LIB AND NOT TARGET FFTW::FloatOpenMP)
set(FFTW_FLOAT_OPENMP_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_FLOAT_OPENMP_LIB})
add_library(FFTW::FloatOpenMP INTERFACE IMPORTED)
set_target_properties(FFTW::FloatOpenMP
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_FLOAT_OPENMP_LIB}"
)
else()
set(FFTW_FLOAT_OPENMP_LIB_FOUND FALSE)
endif()
if (FFTW_LONGDOUBLE_OPENMP_LIB AND NOT TARGET FFTW::LongDoubleOpenMP)
set(FFTW_LONGDOUBLE_OPENMP_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_LONGDOUBLE_OPENMP_LIB})
add_library(FFTW::LongDoubleOpenMP INTERFACE IMPORTED)
set_target_properties(FFTW::LongDoubleOpenMP
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_LONGDOUBLE_OPENMP_LIB}"
)
else()
set(FFTW_LONGDOUBLE_OPENMP_LIB_FOUND FALSE)
endif()
if (FFTW_DOUBLE_MPI_LIB AND NOT TARGET FFTW::DoubleMPI)
set(FFTW_DOUBLE_MPI_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_DOUBLE_MPI_LIB})
add_library(FFTW::DoubleMPI INTERFACE IMPORTED)
set_target_properties(FFTW::DoubleMPI
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_DOUBLE_MPI_LIB}"
)
else()
set(FFTW_DOUBLE_MPI_LIB_FOUND FALSE)
endif()
if (FFTW_FLOAT_MPI_LIB AND NOT TARGET FFTW::FloatMPI)
set(FFTW_FLOAT_MPI_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_FLOAT_MPI_LIB})
add_library(FFTW::FloatMPI INTERFACE IMPORTED)
set_target_properties(FFTW::FloatMPI
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_FLOAT_MPI_LIB}"
)
else()
set(FFTW_FLOAT_MPI_LIB_FOUND FALSE)
endif()
if (FFTW_LONGDOUBLE_MPI_LIB AND NOT TARGET FFTW::LongDoubleMPI)
set(FFTW_LONGDOUBLE_MPI_LIB_FOUND TRUE)
set(FFTW_LIBRARIES ${FFTW_LIBRARIES} ${FFTW_LONGDOUBLE_MPI_LIB})
add_library(FFTW::LongDoubleMPI INTERFACE IMPORTED)
set_target_properties(FFTW::LongDoubleMPI
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${FFTW_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${FFTW_LONGDOUBLE_MPI_LIB}"
)
else()
set(FFTW_LONGDOUBLE_MPI_LIB_FOUND FALSE)
endif()
#--------------------------------------- end components
set( CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV} )
# Deduce the version
execute_process(COMMAND fftw-wisdom-to-conf -V
RESULT_VARIABLE success
OUTPUT_VARIABLE stdout
ERROR_VARIABLE stderr)
if (success EQUAL 0)
string(REGEX MATCH "FFTW *version *([0-9]+([.][0-9]+([.][0-9]+)?)?)"
_version ${stdout}
)
string(REPLACE " " ";" _version_list ${_version})
list(GET _version_list -1 FFTW_VERSION)
set(_version_list)
set(_version)
else()
message("Error running fftw-wisdom-to-conf. Could not determine FFTW version
Output:
${stdout}
Error:
${stderr}
")
set(FFTW_VERSION)
endif()
set(stdout)
set(stderr)
set(success)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(FFTW
REQUIRED_VARS FFTW_INCLUDE_DIRS
VERSION_VAR FFTW_VERSION
HANDLE_COMPONENTS
)
mark_as_advanced(
FFTW_INCLUDE_DIRS
FFTW_LIBRARIES
FFTW_FLOAT_LIB
FFTW_DOUBLE_LIB
FFTW_LONGDOUBLE_LIB
FFTW_FLOAT_THREADS_LIB
FFTW_DOUBLE_THREADS_LIB
FFTW_LONGDOUBLE_THREADS_LIB
FFTW_FLOAT_OPENMP_LIB
FFTW_DOUBLE_OPENMP_LIB
FFTW_LONGDOUBLE_OPENMP_LIB
FFTW_FLOAT_MPI_LIB
FFTW_DOUBLE_MPI_LIB
FFTW_LONGDOUBLE_MPI_LIB
FFTW_VERSION
)