From 1c5add8e69db451811ad96bb5be87e9f4810a632 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Keck <Jean-Baptiste.Keck@imag.fr> Date: Sat, 20 Feb 2016 15:19:20 +0100 Subject: [PATCH] Updated FindFFTW.cmake to handle extra libraries. --- CMake/FindFFTW.cmake | 223 ++++++++++++++++++++++++++++++------------- 1 file changed, 158 insertions(+), 65 deletions(-) diff --git a/CMake/FindFFTW.cmake b/CMake/FindFFTW.cmake index 6c20112d5..37f7c7152 100644 --- a/CMake/FindFFTW.cmake +++ b/CMake/FindFFTW.cmake @@ -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) -- GitLab