mitsuba/data/cmake/FindFFTW3.cmake

117 lines
4.1 KiB
CMake

# - Find FFTW3
# This module searches for the FFTW3 library.
#
# The module defines the following variables:
# FFTW3_INCLUDE_DIRS - where to find fftw3.h, etc.
# FFTW3_LIBRARIES - the libraries needed to use FFTW3.
# FFTW3_FOUND - if false, do not try to use FFTW3.
#
# Variables used by this module, they can change the default behavior and need
# to be set before calling find_package:
#
# FFTW3_PRECISION - String which determines the variant of the library to find
# based on the floating point type. Its value is one of
# "DOUBLE" (default), "SINGLE", "LONG DOUBLE"
# FFTW3_ROOT_DIR - The preferred installation prefix for searching for FFTW3.
# Set if this module has problems finding the proper
# FFTW3 instalation.
#
# ============================================================================
# Originally created by Robert Osfield. [OpenSceneGraph]
# ============================================================================
# Search FFTW3_ROOT_DIR is set
set (_FFTW3_SEARCHES "")
if (FFTW3_ROOT_DIR)
set(_FFTW3_SEARCH_ROOT PATHS ${FFTW3_ROOT_DIR} NO_DEFAULT_PATH)
list(APPEND _FFTW3_SEARCHES _FFTW3_SEARCH_ROOT)
endif()
# Normal search
set(_FFTW3_SEARCH_NORMAL
PATHS "/usr/local"
"/opt/local/"
"/opt/local/Library/Frameworks"
"/opt")
list(APPEND _FFTW3_SEARCHES _FFTW3_SEARCH_NORMAL)
# Default precision is double
if (NOT FFTW3_PRECISION)
set (FFTW3_PRECISION "DOUBLE")
else()
string (TOUPPER "${FFTW3_PRECISION}" FFTW3_PRECISION)
endif()
# Suffix based on the precision
if (FFTW3_PRECISION STREQUAL "DOUBLE")
set(_FFTW3_SUFFIX "")
elseif (FFTW3_PRECISION STREQUAL "SINGLE")
set(_FFTW3_SUFFIX "f")
elseif (FFTW3_PRECISION STREQUAL "LONG DOUBLE")
set(_FFTW3_SUFFIX "l")
else()
message(FATAL_ERROR "Unknown FFTW3 precision: ${FFTW3_PRECISION}")
endif()
# Names of the library, including two forms of version naming
set(_FFTW3_NAMES "fftw3${_FFTW3_SUFFIX}" "fftw${_FFTW3_SUFFIX}-3")
if (WIN32)
list(APPEND _FFTW3_NAMES "libfftw3${_FFTW3_SUFFIX}" "libfftw${_FFTW3_SUFFIX}-3")
endif()
foreach(version_minor 4 3 2 1)
list(APPEND _FFTW3_NAMES "fftw${_FFTW3_SUFFIX}-3.${version_minor}"
"fftw3${_FFTW3_SUFFIX}-${version_minor}")
if (WIN32)
list(APPEND _FFTW3_NAMES "libfftw${_FFTW3_SUFFIX}-3.${version_minor}"
"libfftw3${_FFTW3_SUFFIX}-${version_minor}")
endif()
endforeach()
# The separate threads and OpenMP library have a suffix
if (UNIX AND NOT APPLE)
set(_FFTW3_THREADS_NAMES "")
set(_FFTW3_OMP_NAMES "")
foreach(name ${_FFTW3_NAMES})
list(APPEND _FFTW3_THREADS_NAMES "${name}_threads")
list(APPEND _FFTW3_OMP_NAMES "${name}_omp")
endforeach()
endif()
# Try each search configuration
foreach (search ${_FFTW3_SEARCHES})
find_path (FFTW3_INCLUDE_DIR NAMES "fftw3.h" ${${search}} PATH_SUFFIXES "include")
find_library (FFTW3_LIBRARY NAMES ${_FFTW3_NAMES} ${${search}} PATH_SUFFIXES "include")
if (UNIX AND NOT APPLE)
find_library (FFTW3_THREADS_LIBRARY
NAMES ${_FFTW3_THREADS_NAMES} ${${search}} PATH_SUFFIXES "include")
find_library (FFTW3_OMP_LIBRARY
NAMES ${_FFTW3_OMP_NAMES} ${${search}} PATH_SUFFIXES "include")
endif()
endforeach()
mark_as_advanced(FFTW3_INCLUDE_DIR FFTW3_LIBRARY)
if (UNIX AND NOT APPLE)
mark_as_advanced(FFTW3_THREADS_LIBRARY FFTW3_OMP_LIBRARY)
endif()
# TODO: Define an option to look for an appropriate threads variant (pthreads or OMP)
set(_FFTW3_LIB_VARS FFTW3_LIBRARY)
if (UNIX AND NOT APPLE)
list(APPEND _FFTW3_LIB_VARS FFTW3_THREADS_LIBRARY)
endif()
# handle the QUIETLY and REQUIRED arguments and set FFTW3_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFTW3 DEFAULT_MSG FFTW3_INCLUDE_DIR ${_FFTW3_LIB_VARS})
if (FFTW3_FOUND)
# TODO: create a compile test to find if FFTW_DLL is needed on Windows
set(FFTW3_INCLUDE_DIRS ${FFTW3_INCLUDE_DIR})
set(FFTW3_LIBRARIES "")
foreach(var ${_FFTW3_LIB_VARS})
list(APPEND FFTW3_LIBRARIES ${${var}})
endforeach()
endif()