1# Copyright (c) 2020 - 2024 David Guibert
2# Copyright (c) 2024 - 2025 Antoine Morvan
3# Copyright (c) 2024 - 2025 Niclas Schroeter
6# SPDX-License-Identifier: Apache-2.0
8set_property(GLOBAL PROPERTY fftw_can_use_system TRUE)
9set_property(GLOBAL PROPERTY fftw_depends mpi)
11set(fftw_configure_args "" CACHE STRING "Custom configure arguments for FFTW")
12set(fftw_build_args "" CACHE STRING "Custom Make arguments for FFTW")
16 message(STATUS "FFTW: enabled (system installed)")
17 if(DEFINED ENV{MKLROOT} OR DEFINED ENV{MKL_ROOT})
18 find_package(MKL CONFIG REQUIRED PATHS $ENV{MKLROOT} $ENV{MKL_ROOT})
20 add_library(fftw ALIAS MKL::MKL)
21 add_library(fftw_single ALIAS MKL::MKL)
23 find_package(FFTW MODULE REQUIRED)
25 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}" "${FFTW3_LIBRARY_DIRS}")
26 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}" "${FFTW3f_LIBRARY_DIRS}")
27 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}" "${FFTW3_LIBRARY_DIRS}")
28 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}" "${FFTW3f_LIBRARY_DIRS}")
29 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${FFTW3_INCLUDE_DIRS}")
30 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${FFTW3f_INCLUDE_DIRS}")
33 message(STATUS "FFTW: enabled (internally built)")
36 list(APPEND myCFLAGS -fPIC)
37 if(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
38 list(APPEND myCFLAGS -gcc-sys)
40 if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
41 list(APPEND myCFLAGS -DPIC)
43 list(JOIN myCFLAGS " " CFLAGS)
45 set(BUILD_WRAPPER ./configure)
53 EXECUTE_PROCESS( COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE )
54 if (ARCHITECTURE STREQUAL x86_64)
63 elseif(ARCHITECTURE STREQUAL aarch64)
70 --enable-armv8-cntvct-el0)
72 message(FATAL_ERROR "Architecture '${ARCHITECTURE}' is not supported by HPCW")
75 # FIXME: enable conditionnally list(APPEND BUILD_WRAPPER --enable-avx512)
76 list(APPEND BUILD_WRAPPER "CFLAGS=${CFLAGS}")
78 # Double precision FFTW
79 ExternalProject_Data_Add(
81 DEPENDS MPI::MPI_C ${fftw_revision}
83 # https://github.com/RemiLacroix-IDRIS/spack/commit/d2edb5f3571674c8724360018ca4f1d488a4806a
84 sed -i -e "s@-no-gcc@-gcc-sys@" configure
86 PATH=$ENV{PATH} CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
87 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
88 CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER}
89 FC=${CMAKE_Fortran_COMPILER} MPICC=${MPI_C_COMPILER}
90 MPICXX=${MPI_CXX_COMPILER} MPIFC=${MPI_Fortran_COMPILER}
91 ${BUILD_WRAPPER} --prefix=<INSTALL_DIR> ${default_configure_args} ${fftw_configure_args}
93 PATH=$ENV{PATH} CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
94 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
95 ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${fftw_build_args})
97 # Single precision FFTW
98 ExternalProject_Data_Add(
100 DEPENDS MPI::MPI_C fftw ${fftw_revision}
102 # https://github.com/RemiLacroix-IDRIS/spack/commit/d2edb5f3571674c8724360018ca4f1d488a4806a
103 sed -i -e "s@-no-gcc@-gcc-sys@" configure
105 PATH=$ENV{PATH} CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
106 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
107 CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER}
108 FC=${CMAKE_Fortran_COMPILER} MPICC=${MPI_C_COMPILER}
109 MPICXX=${MPI_CXX_COMPILER} MPIFC=${MPI_Fortran_COMPILER}
110 ${BUILD_WRAPPER} --prefix=<INSTALL_DIR> --enable-single ${default_configure_args} ${fftw_configure_args}
112 PATH=$ENV{PATH} CPATH=$ENV{CPATH} C_INCLUDE_PATH=$ENV{C_INCLUDE_PATH}
113 LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} LIBRARY_PATH=$ENV{LIBRARY_PATH}
114 ${CMAKE_MAKE_PROGRAM} -j${BUILD_PARALLEL_LEVEL} ${default_build_args} ${fftw_build_args})
116 ExternalProject_Get_Property(fftw INSTALL_DIR)
117 set(FFTW_DIR ${INSTALL_DIR})
119 set_if_not_present(ENV{CPATH} "$ENV{CPATH}" "${FFTW_DIR}/include")
120 set_if_not_present(ENV{LIBRARY_PATH} "$ENV{LIBRARY_PATH}" "${FFTW_DIR}/lib")
121 set_if_not_present(ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}"