@@ -53,6 +53,7 @@ option(FINUFFT_USE_CUDA "Whether to build CUDA accelerated FINUFFT library (libc
5353option (FINUFFT_USE_CPU "Whether to build the ordinary FINUFFT library (libfinufft)." ON )
5454option (FINUFFT_STATIC_LINKING "Whether to link the static FINUFFT library (libfinufft_static)." ON )
5555option (FINUFFT_BUILD_DEVEL "Whether to build development executables" OFF )
56+ option (FINUFFT_USE_DUCC0 "Whether to use DUCC0 for CPU fft library" ON )
5657# sphinx tag (don't remove): @cmake_opts_end
5758
5859if (FINUFFT_USE_CPU)
@@ -70,9 +71,21 @@ if (FINUFFT_USE_CPU)
7071 set (FFTW_VERSION 3.3.10)
7172 set (XTL_VERSION 0.7.7)
7273 set (XSIMD_VERSION 13.0.0)
74+ set (DUCC0_VERSION ducc0_0_34_0)
75+ set (FINUFFT_FFTW_LIBRARIES)
7376 include (cmake/setupCPM.cmake)
74- include (cmake/setupFFTW.cmake)
7577 include (cmake/setupXSIMD.cmake)
78+ if (FINUFFT_USE_DUCC0)
79+ include (cmake/setupDUCC.cmake)
80+ else ()
81+ include (cmake/setupFFTW.cmake)
82+ endif ()
83+ endif ()
84+
85+ if (FINUFFT_USE_DUCC0)
86+ set (FINUFFT_FFTLIBS ducc0)
87+ else ()
88+ set (FINUFFT_FFTLIBS ${FINUFFT_FFTW_LIBRARIES} )
7689endif ()
7790
7891if (FINUFFT_BUILD_MATLAB)
@@ -101,7 +114,7 @@ endif ()
101114
102115# This set of sources is compiled twice, once in single precision and once in double precision
103116# The single precision compilation is done with -DSINGLE
104- set (FINUFFT_PRECISION_DEPENDENT_SOURCES src/finufft.cpp src/simpleinterfaces.cpp src/spreadinterp.cpp src/utils.cpp fortran/finufftfort.cpp)
117+ set (FINUFFT_PRECISION_DEPENDENT_SOURCES src/finufft.cpp src/fft.cpp src/ simpleinterfaces.cpp src/spreadinterp.cpp src/utils.cpp fortran/finufftfort.cpp)
105118
106119# Set of compilers which behave like gcc
107120set (FINUFFT_GNU_LIKE_COMPILERS AppleClang Clang GNU)
@@ -122,6 +135,11 @@ endfunction()
122135
123136# Utility function to link static/dynamic lib
124137function (finufft_link_test target )
138+
139+ if (FINUFFT_USE_DUCC0)
140+ target_compile_definitions (${target} PRIVATE FINUFFT_USE_DUCC0)
141+ endif ()
142+
125143 if (FINUFFT_STATIC_LINKING)
126144 target_link_libraries (${target} PRIVATE finufft_static)
127145 if (FINUFFT_USE_OPENMP)
@@ -169,37 +187,52 @@ function(set_finufft_options target)
169187 endif ()
170188 endif ()
171189
172- # FFTW CMAKE file includes the APIs only as an install target, so we need to manually
173- # include them since we need them for build not for install
174- # trying to include them directly into the fftw and fftwf targets causes issues with
175- # the latest version of cmake, so we do it here instead.
176- if ((NOT FFTW_FOUND) OR (FINUFFT_FFTW_LIBRARIES STREQUAL DOWNLOAD))
177- list (GET FINUFFT_FFTW_LIBRARIES 0 element)
178- get_property (FFTW_SOURCE_DIR TARGET ${element} PROPERTY SOURCE_DIR)
179- set (FFTW_INCLUDE_DIR ${FFTW_SOURCE_DIR} /api)
180- target_include_directories (${target} PUBLIC ${FFTW_INCLUDE_DIR} )
190+ if (FINUFFT_USE_DUCC0)
191+ target_compile_definitions (${target} PRIVATE FINUFFT_USE_DUCC0)
192+ else ()
193+ # FFTW CMAKE file includes the APIs only as an install target, so we need to manually
194+ # include them since we need them for build not for install
195+ # trying to include them directly into the fftw and fftwf targets causes issues with
196+ # the latest version of cmake, so we do it here instead.
197+ if ((NOT FFTW_FOUND) OR (FINUFFT_FFTW_LIBRARIES STREQUAL DOWNLOAD))
198+ list (GET FINUFFT_FFTW_LIBRARIES 0 element)
199+ get_property (FFTW_SOURCE_DIR TARGET ${element} PROPERTY SOURCE_DIR)
200+ set (FFTW_INCLUDE_DIR ${FFTW_SOURCE_DIR} /api)
201+ target_include_directories (${target} PUBLIC ${FFTW_INCLUDE_DIR} )
202+ endif ()
181203 endif ()
182- target_link_libraries (${target} PRIVATE xsimd)
183- target_link_libraries (${target} PUBLIC ${FINUFFT_FFTW_LIBRARIES} )
204+ # target_link_libraries(${target} PRIVATE xsimd)
205+ # target_link_libraries(${target} PUBLIC ${FINUFFT_FFTW_LIBRARIES})
184206endfunction ()
185207
186208if (FINUFFT_USE_CPU)
187209 # Main finufft libraries
210+ if (FINUFFT_USE_DUCC0)
211+ # okay for now, to be cleaned up
212+ set_finufft_options(ducc0)
213+ endif ()
214+
188215 add_library (finufft_f32 OBJECT ${FINUFFT_PRECISION_DEPENDENT_SOURCES} )
189216 target_compile_definitions (finufft_f32 PRIVATE SINGLE)
190217 set_finufft_options(finufft_f32)
218+ target_link_libraries (finufft_f32 PUBLIC ${FINUFFT_FFTLIBS} )
219+ target_link_libraries (finufft_f32 PRIVATE xsimd)
191220
192221 add_library (finufft_f64 OBJECT ${FINUFFT_PRECISION_DEPENDENT_SOURCES} )
193222 target_compile_definitions (finufft_f64 PRIVATE )
194223 set_finufft_options(finufft_f64)
224+ target_link_libraries (finufft_f64 PUBLIC ${FINUFFT_FFTLIBS} )
225+ target_link_libraries (finufft_f64 PRIVATE xsimd)
195226 if (WIN32 )
196227 add_library (finufft_f32_dll OBJECT ${FINUFFT_PRECISION_DEPENDENT_SOURCES} )
197228 target_compile_definitions (finufft_f32_dll PRIVATE SINGLE dll_EXPORTS FINUFFT_DLL)
198229 set_finufft_options(finufft_f32_dll)
230+ target_link_libraries (finufft_f32_dll PUBLIC ${FINUFFT_FFTLIBS} )
199231
200232 add_library (finufft_f64_dll OBJECT ${FINUFFT_PRECISION_DEPENDENT_SOURCES} )
201233 target_compile_definitions (finufft_f64_dll PRIVATE dll_EXPORTS FINUFFT_DLL)
202234 set_finufft_options(finufft_f64_dll)
235+ target_link_libraries (finufft_f64_dll PUBLIC ${FINUFFT_FFTLIBS} )
203236 endif ()
204237
205238 add_library (finufft SHARED src/utils_precindep.cpp contrib/legendre_rule_fast.cpp)
0 commit comments