HPCW 3.0
Loading...
Searching...
No Matches
fftw.cmake
Go to the documentation of this file.
1# Copyright (c) 2020 - 2024 David Guibert
2# Copyright (c) 2024 - 2025 Antoine Morvan
3# Copyright (c) 2024 - 2025 Niclas Schroeter
4# All rights reserved.
5#
6# SPDX-License-Identifier: Apache-2.0
7
8set_property(GLOBAL PROPERTY fftw_can_use_system TRUE)
9set_property(GLOBAL PROPERTY fftw_depends mpi)
10
11set(fftw_configure_args "" CACHE STRING "Custom configure arguments for FFTW")
12set(fftw_build_args "" CACHE STRING "Custom Make arguments for FFTW")
13
14if(fftw_enabled)
15 if(USE_SYSTEM_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})
19
20 add_library(fftw ALIAS MKL::MKL)
21 add_library(fftw_single ALIAS MKL::MKL)
22 else()
23 find_package(FFTW MODULE REQUIRED)
24
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}")
31 endif()
32 else()
33 message(STATUS "FFTW: enabled (internally built)")
34
35 set(myCFLAGS "")
36 list(APPEND myCFLAGS -fPIC)
37 if(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
38 list(APPEND myCFLAGS -gcc-sys)
39 endif()
40 if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
41 list(APPEND myCFLAGS -DPIC)
42 endif()
43 list(JOIN myCFLAGS " " CFLAGS)
44
45 set(BUILD_WRAPPER ./configure)
46 list(
47 APPEND
48 BUILD_WRAPPER
49 --enable-mpi
50 --enable-shared
51 --enable-openmp
52 --enable-threads)
53 EXECUTE_PROCESS( COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE )
54 if (ARCHITECTURE STREQUAL x86_64)
55 list(
56 APPEND
57 BUILD_WRAPPER
58 --enable-fma
59 --enable-sse2
60 --enable-avx
61 --enable-avx2
62 --enable-avx512)
63 elseif(ARCHITECTURE STREQUAL aarch64)
64 list(
65 APPEND
66 BUILD_WRAPPER
67 --enable-neon
68 --enable-fma
69 --enable-sve
70 --enable-armv8-cntvct-el0)
71 else()
72 message(FATAL_ERROR "Architecture '${ARCHITECTURE}' is not supported by HPCW")
73 endif()
74
75 # FIXME: enable conditionnally list(APPEND BUILD_WRAPPER --enable-avx512)
76 list(APPEND BUILD_WRAPPER "CFLAGS=${CFLAGS}")
77
78 # Double precision FFTW
79 ExternalProject_Data_Add(
80 fftw
81 DEPENDS MPI::MPI_C ${fftw_revision}
82 CONFIGURE_COMMAND
83 # https://github.com/RemiLacroix-IDRIS/spack/commit/d2edb5f3571674c8724360018ca4f1d488a4806a
84 sed -i -e "s@-no-gcc@-gcc-sys@" configure
85 COMMAND env
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}
92 BUILD_COMMAND env
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})
96
97 # Single precision FFTW
98 ExternalProject_Data_Add(
99 fftw_single
100 DEPENDS MPI::MPI_C fftw ${fftw_revision}
101 CONFIGURE_COMMAND
102 # https://github.com/RemiLacroix-IDRIS/spack/commit/d2edb5f3571674c8724360018ca4f1d488a4806a
103 sed -i -e "s@-no-gcc@-gcc-sys@" configure
104 COMMAND env
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}
111 BUILD_COMMAND env
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})
115
116 ExternalProject_Get_Property(fftw INSTALL_DIR)
117 set(FFTW_DIR ${INSTALL_DIR})
118
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}"
122 "${FFTW_DIR}/lib")
123
124 endif()
125endif(fftw_enabled)