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