HPCW 3.0
Loading...
Searching...
No Matches
FindFFTW.cmake
Go to the documentation of this file.
1# Copyright (c) 2025 Niclas Schroeter
2# All rights reserved.
3#
4# SPDX-License-Identifier: Apache-2.0
5
6# This find module defines the following targets and variables:
7# - Adds fftw and fftw_single as target
8# - Sets FFTW3{f}_INCLUDE_DIRS
9# - Sets FFTW3{f}_LIBRARY_DIRS
10
11set(FFTW_FOUND_BY_PKGCONF 0)
12
13# FFTW3 has a known issue with its autotools-based build.
14# See https://github.com/FFTW/fftw3/issues/332
15# Essentially the CMake files are not built properly.
16message(WARNING "HPCW does not check for FFTW3Config.cmake by default \
17due to a bug in FFTW3. If you want to use these files to discover FFTW3 \
18regardless, set FFTW_CMAKE_CONFIG_MODE=ON")
19
20if(FFTW_CMAKE_CONFIG_MODE)
21 find_package(FFTW3 CONFIG)
22 find_package(FFTW3f CONFIG)
23endif()
24
25if(FFTW3_FOUND AND FFTW3f_FOUND)
26 add_library(fftw UNKNOWN IMPORTED)
27 add_library(fftw_single UNKNOWN IMPORTED)
28else()
29 find_package(PkgConfig)
30 if(PKG_CONFIG_FOUND)
31 pkg_check_modules(FFTW3 fftw3 IMPORTED_TARGET GLOBAL)
32 pkg_check_modules(FFTW3f fftw3f IMPORTED_TARGET GLOBAL)
33 if(FFTW3_FOUND AND FFTW3f_FOUND)
34 set(FFTW_FOUND_BY_PKGCONF 1)
35 add_library(fftw ALIAS PkgConfig::FFTW3)
36 add_library(fftw_single ALIAS PkgConfig::FFTW3f)
37 endif()
38 endif()
39endif()
40
41if(NOT (FFTW3_FOUND AND FFTW3f_FOUND))
42 message(STATUS "Manually looking for fftw")
43
44 find_library(FFTW3_LIB fftw3 REQUIRED)
45 find_library(FFTW3f_LIB fftw3f REQUIRED)
46 find_path(FFTW3_INCLUDE_DIRS NAMES "fftw3.h" REQUIRED)
47
48 cmake_path(GET FFTW3_LIB PARENT_PATH FFTW3_LIBRARY_DIRS)
49 cmake_path(GET FFTW3f_LIB PARENT_PATH FFTW3f_LIBRARY_DIRS)
50 set(FFTW3f_INCLUDE_DIRS "${FFTW3_INCLUDE_DIRS}")
51 add_library(fftw UNKNOWN IMPORTED)
52 add_library(fftw_single UNKNOWN IMPORTED)
53
54 message(STATUS "Found fftw")
55endif()
56
57# Specifically for ectrans/ecbuild:
58# ecbuild doesn't look for fftw3Config.cmake at all. If pkgconf
59# fails, they opt to search for the individual parts manually.
60# FFTW_ROOT serves as a hint for this case.
61if(NOT (FFTW_FOUND_BY_PKGCONF AND FFTW_ROOT))
62 cmake_path(GET FFTW3_LIBRARY_DIRS PARENT_PATH FFTW_ROOT)
63endif()