quantum-espresso/cmake/FindFFTW3.cmake

479 lines
11 KiB
CMake

# Find the FFTW3 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(FFTW3 [REQUIRED] [QUIET] [COMPONENTS component1 ... componentX])
#
# It sets the following variables:
# FFTW3_FOUND ... true if fftw is found on the system
# FFTW3_[component]_FOUND ... true if the component is found on the system (see components below)
# FFTW3_LIBRARIES ... full paths to all found fftw libraries
# FFTW3_[component]_LIB ... full path to one of the components (see below)
# FFTW3_INCLUDE_DIRS ... fftw include directory paths
#
# The following variables will be checked by the function
# FFTW3_USE_STATIC_LIBS ... if true, only static libraries are found, otherwise both static and shared.
# FFTW3_ROOT ... if set, the libraries are exclusively searched under this path
#
# This package supports the following components:
# FLOAT
# DOUBLE
# LONGDOUBLE
# FLOAT_THREADS
# DOUBLE_THREADS
# LONGDOUBLE_THREADS
# FLOAT_OPENMP
# DOUBLE_OPENMP
# LONGDOUBLE_OPENMP
# FLOAT_MPI
# DOUBLE_MPI
# Check whether to search static or dynamic libs
set(CMAKE_FIND_LIBRARY_SUFFIXES_SAV ${CMAKE_FIND_LIBRARY_SUFFIXES})
if(${FFTW3_USE_STATIC_LIBS})
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV})
endif()
# Check common variables
set(FFTW3_DIRS $ENV{FFTW_HOME})
set(FFTW3_DIRS ${FFTW_DIRS} $ENV{FFTW_ROOT})
set(FFTW3_DIRS ${FFTW_DIRS} $ENV{FFTW_DIR})
set(FFTW3_DIRS ${FFTW_DIRS} $ENV{FFTW_PATH})
set(FFTW3_DIRS ${FFTW_DIRS} $ENV{FFTW3_ROOT})
set(FFTW3_DIRS ${FFTW_DIRS} $ENV{FFTW3_DIR})
set(FFTW3_DIRS ${FFTW_DIRS} $ENV{FFTW3_PATH})
if(FFTW3_DIRS)
if("DOUBLE" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE
NAMES "fftw3"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("DOUBLE_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE_THREADS
NAMES "fftw3_threads"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("DOUBLE_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE_OPENMP
NAMES "fftw3_omp"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("DOUBLE_MPI" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE_MPI
NAMES "fftw3_mpi"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("FLOAT" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT
NAMES "fftw3f"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("FLOAT_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT_THREADS
NAMES "fftw3f_threads"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("FLOAT_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT_OPENMP
NAMES "fftw3f_omp"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("FLOAT_MPI" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT_MPI
NAMES "fftw3f_mpi"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("LONGDOUBLE" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_LONGDOUBLE
NAMES "fftw3l"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("LONGDOUBLE_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_LONGDOUBLE_THREADS
NAMES "fftw3l_threads"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
if("LONGDOUBLE_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(FFTW3_LONGDOUBLE_OPENMP
NAMES "fftw3l_omp"
PATHS
${FFTW3_DIRS}
PATH_SUFFIXES
"lib"
"lib64"
NO_DEFAULT_PATH)
endif()
find_path(FFTW3_INCLUDE_DIRS
NAMES
"fftw3.h"
"fftw3.f"
PATHS
${FFTW3_DIRS}
$ENV{C_INCLUDE_PATH}
PATH_SUFFIXES
"include"
"inc"
NO_DEFAULT_PATH)
else()
# Check if we can use PkgConfig
find_package(PkgConfig)
# Determine from PKG
if(PKG_CONFIG_FOUND AND NOT FFTW3_ROOT)
pkg_check_modules(PKG_FFTW3 QUIET "fftw3")
endif()
# Try to find in the LD_LIBRARY_PATH
string(REPLACE ":" ";" LIBRARY_DIRS "$ENV{LD_LIBRARY_PATH}")
if("DOUBLE" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE
NAMES "fftw3"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("DOUBLE_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE_THREADS
NAMES "fftw3_threads"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("DOUBLE_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE_OPENMP
NAMES "fftw3_omp"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("DOUBLE_MPI" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_DOUBLE_MPI
NAMES "fftw3_mpi"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("FLOAT" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT
NAMES "fftw3f"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("FLOAT_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT_THREADS
NAMES "fftw3f_threads"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("FLOAT_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT_OPENMP
NAMES "fftw3f_omp"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("FLOAT_MPI" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_FLOAT_MPI
NAMES "fftw3f_mpi"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("LONGDOUBLE" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_LONGDOUBLE
NAMES "fftw3l"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("LONGDOUBLE_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(
FFTW3_LONGDOUBLE_THREADS
NAMES "fftw3l_threads"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
if("LONGDOUBLE_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
find_library(FFTW3_LONGDOUBLE_OPENMP
NAMES "fftw3l_omp"
PATHS
${PKG_FFTW3_LIBRARY_DIRS}
${LIB_INSTALL_DIR}
${LIBRARY_DIRS}
PATH_SUFFIXES
"lib"
"lib64")
endif()
set(LD_DIRS)
foreach(_lib ${LIBRARY_DIRS})
get_filename_component(_root_lib_dir ${_lib} DIRECTORY)
list(APPEND LD_DIRS ${_root_lib_dir})
endforeach()
find_path(FFTW3_INCLUDE_DIRS
NAMES
"fftw3.h"
"fftw3.f"
PATHS
${PKG_FFTW3_INCLUDE_DIRS}
${INCLUDE_INSTALL_DIR}
${LD_DIRS}
$ENV{C_INCLUDE_PATH}
PATH_SUFFIXES
"include"
"inc")
endif()
# Components
add_library(FFTW3 INTERFACE IMPORTED)
if(FFTW3_DOUBLE AND "DOUBLE" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_DOUBLE_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_DOUBLE})
else()
set(FFTW3_DOUBLE_FOUND FALSE)
endif()
if(FFTW3_FLOAT AND "FLOAT" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_FLOAT_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_FLOAT})
else()
set(FFTW3_FLOAT_FOUND FALSE)
endif()
if(FFTW3_LONGDOUBLE AND "LONGDOUBLE" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_LONGDOUBLE_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_LONGDOUBLE})
else()
set(FFTW3_LONGDOUBLE_FOUND FALSE)
endif()
if(FFTW3_DOUBLE_THREADS AND "DOUBLE_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_DOUBLE_THREADS_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_DOUBLE_THREADS})
else()
set(FFTW3_DOUBLE_THREADS_FOUND FALSE)
endif()
if(FFTW3_FLOAT_THREADS AND "FLOAT_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_FLOAT_THREADS_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_FLOAT_THREADS})
else()
set(FFTW3_FLOAT_THREADS_FOUND FALSE)
endif()
if(FFTW3_LONGDOUBLE_THREADS AND "LONGDOUBLE_THREADS" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_LONGDOUBLE_THREADS_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_LONGDOUBLE_THREADS})
else()
set(FFTW3_LONGDOUBLE_THREADS_FOUND FALSE)
endif()
if(FFTW3_DOUBLE_OPENMP AND "DOUBLE_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_DOUBLE_OPENMP_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_DOUBLE_OPENMP})
add_library(FFTW3::DoubleOpenMP INTERFACE IMPORTED)
else()
set(FFTW3_DOUBLE_OPENMP_FOUND FALSE)
endif()
if(FFTW3_FLOAT_OPENMP AND "FLOAT_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_FLOAT_OPENMP_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_FLOAT_OPENMP})
else()
set(FFTW3_FLOAT_OPENMP_FOUND FALSE)
endif()
if(FFTW3_LONGDOUBLE_OPENMP AND "LONGDOUBLE_OPENMP" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_LONGDOUBLE_OPENMP_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_LONGDOUBLE_OPENMP})
else()
set(FFTW3_LONGDOUBLE_OPENMP_FOUND FALSE)
endif()
if(FFTW3_DOUBLE_MPI AND "DOUBLE_MPI" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_DOUBLE_MPI_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_DOUBLE_MPI})
else()
set(FFTW3_DOUBLE_MPI_FOUND FALSE)
endif()
if(FFTW3_FLOAT_MPI AND "FLOAD_MPI" IN_LIST FFTW3_FIND_COMPONENTS)
set(FFTW3_FLOAT_MPI_FOUND TRUE)
set(FFTW3_LIBRARIES ${FFTW3_LIBRARIES} ${FFTW3_FLOAT_MPI})
else()
set(FFTW3_FLOAT_MPI_FOUND FALSE)
endif()
target_link_libraries(FFTW3 INTERFACE ${FFTW3_LIBRARIES})
target_include_directories(FFTW3 INTERFACE ${FFTW3_INCLUDE_DIRS})
# End components
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SAV})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(FFTW3 REQUIRED_VARS FFTW3_LIBRARIES FFTW3_INCLUDE_DIRS)
mark_as_advanced(
FFTW3_INCLUDE_DIRS
FFTW3_LIBRARIES
FFTW3_FLOAT
FFTW3_DOUBLE
FFTW3_LONGDOUBLE
FFTW3_FLOAT_THREADS
FFTW3_DOUBLE_THREADS
FFTW3_LONGDOUBLE_THREADS
FFTW3_FLOAT_OPENMP
FFTW3_DOUBLE_OPENMP
FFTW3_LONGDOUBLE_OPENMP
FFTW3_FLOAT_MPI
FFTW3_DOUBLE_MPI)