168 lines
4.7 KiB
CMake
168 lines
4.7 KiB
CMake
#[[
|
|
Usage:
|
|
find_package(FFTW [REQUIRED] [QUIET] [COMPONENTS ...])
|
|
|
|
Be warned that this will only search for FFTW3 libraries.
|
|
|
|
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 (see below)
|
|
FFTW_LIBRARIES .. full paths to all found FFTW libraries
|
|
FFTW_[component]_LIB .. full path to one component (see below)
|
|
FFTW_INCLUDE_DIRS .. FFTW include directory paths
|
|
|
|
The following variables will be checked by the function
|
|
FFTW_USE_STATIC_LIBS .. if true, only static libraries are searched
|
|
FFTW_ROOT .. if set, search under this path first
|
|
|
|
Paths will be searched in the following order:
|
|
FFTW_ROOT (if provided)
|
|
PkgConfig paths (if found)
|
|
Library/include installation directories
|
|
Default find_* paths
|
|
|
|
The following component library locations will be defined (if found):
|
|
FFTW_FLOAT_LIB
|
|
FFTW_DOUBLE_LIB
|
|
FFTW_LONGDOUBLE_LIB
|
|
FFTW_FLOAT_THREADS_LIB
|
|
FFTW_DOUBLE_THREADS_LIB
|
|
FFTW_LONGDOUBLE_THREADS_LIB
|
|
FFTW_FLOAT_OMP_LIB
|
|
FFTW_DOUBLE_OMP_LIB
|
|
FFTW_LONGDOUBLE_OMP_LIB
|
|
|
|
The following IMPORTED targets will be created (if found):
|
|
FFTW::Float
|
|
FFTW::Double
|
|
FFTW::LongDouble
|
|
FFTW::FloatThreads
|
|
FFTW::DoubleThreads
|
|
FFTW::LongDoubleThreads
|
|
FFTW::FloatOMP
|
|
FFTW::DoubleOMP
|
|
FFTW::LongDoubleOMP
|
|
]]
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
|
|
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)
|
|
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()
|
|
|
|
# Paths to pass to find_library for each component
|
|
set(findlib_paths
|
|
${FFTW_ROOT}
|
|
${PKG_FFTW_LIBRARY_DIRS}
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
|
|
# Find include directory
|
|
find_path(FFTW_INCLUDE_DIRS
|
|
NAMES fftw3.h
|
|
PATHS ${FFTW_ROOT}
|
|
${PKG_FFTW_INCLUDE_DIRS}
|
|
${INCLUDE_INSTALL_DIR}
|
|
PATH_SUFFIXES include
|
|
)
|
|
|
|
set(FFTW_LIBRARIES "")
|
|
|
|
foreach(dtype Float Double LongDouble)
|
|
|
|
# Single-letter suffix for the library name
|
|
string(REGEX REPLACE "(.).*" "\\1" letter ${dtype})
|
|
string(TOLOWER ${letter} letter)
|
|
# The double-precision library doesn't use a suffix
|
|
if("${letter}" STREQUAL "d")
|
|
set(letter "")
|
|
endif()
|
|
|
|
foreach(system "" Threads OMP)
|
|
|
|
# CamelCase component name used for interface libraries
|
|
# e.g. FloatThreads
|
|
set(component ${dtype}${system})
|
|
|
|
# Component library location variable used via find_library
|
|
# e.g. FFTW_DOUBLE_THREADS_LIB
|
|
if(system)
|
|
set(libvar FFTW_${dtype}_${system}_LIB)
|
|
else()
|
|
set(libvar FFTW_${dtype}_LIB)
|
|
endif()
|
|
string(TOUPPER ${libvar} libvar)
|
|
|
|
# Filename root common to all libraries
|
|
set(libname fftw3${letter})
|
|
if(system)
|
|
string(TOLOWER ${system} systemlower)
|
|
set(libname ${libname}_${systemlower})
|
|
endif()
|
|
# Actual filenames looked for by find_library
|
|
set(libnames
|
|
${libname}
|
|
lib${libname}3-3
|
|
)
|
|
|
|
find_library(
|
|
${libvar}
|
|
NAMES ${libnames}
|
|
PATHS ${findlib_paths}
|
|
PATH_SUFFIXES lib lib64
|
|
)
|
|
|
|
# Tell find_package whether this component was found
|
|
set(FFTW_${component}_FIND_QUIETLY TRUE)
|
|
# Also set the value of the legacy library-variable
|
|
# (Will be set to *-NOTFOUND if not found)
|
|
set(${libvar} ${FFTW_${component}})
|
|
|
|
# If the library was found:
|
|
if(${libvar} AND NOT TARGET FFTW::${component})
|
|
# Add it to the list of FFTW libraries
|
|
list(APPEND FFTW_LIBRARIES ${${libvar}})
|
|
|
|
# Create a corresponding interface library
|
|
add_library(FFTW::${component} IMPORTED INTERFACE)
|
|
target_include_directories(
|
|
FFTW::${component} SYSTEM INTERFACE ${FFTW_INCLUDE_DIRS})
|
|
target_link_libraries(
|
|
FFTW::${component} INTERFACE ${${libvar}})
|
|
endif()
|
|
|
|
mark_as_advanced(${libvar})
|
|
|
|
endforeach()
|
|
endforeach()
|
|
|
|
# Restore saved find_library suffixes
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV})
|
|
|
|
find_package_handle_standard_args(FFTW
|
|
REQUIRED_VARS FFTW_LIBRARIES FFTW_INCLUDE_DIRS
|
|
HANDLE_COMPONENTS
|
|
)
|
|
|
|
mark_as_advanced(
|
|
FFTW_INCLUDE_DIRS
|
|
FFTW_LIBRARIES
|
|
)
|