• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1cmake_minimum_required(VERSION 2.8)
2project(PRETTY_FAST_FFT)
3
4# smaller library size?
5option(PFFFT_USE_TYPE_FLOAT  "activate single precision 'float'?" ON)
6option(PFFFT_USE_TYPE_DOUBLE "activate 'double' precision float?" ON)
7
8# architecture/optimization options
9option(PFFFT_USE_SIMD        "use SIMD (SSE/AVX/NEON/ALTIVEC) CPU features? - " ON)
10option(PFFFT_USE_SCALAR_VECT "use 4-element vector scalar operations (if no other SIMD)" ON)
11
12# what to install?
13option(INSTALL_PFFFT      "install pffft to CMAKE_INSTALL_PREFIX?" ON)
14option(INSTALL_PFDSP      "install pfdsp to CMAKE_INSTALL_PREFIX?" OFF)
15option(INSTALL_PFFASTCONV "install pffastconv to CMAKE_INSTALL_PREFIX?" OFF)
16
17# test options
18option(PFFFT_USE_BENCH_FFTW   "use (system-installed) FFTW3 in fft benchmark?" OFF)
19option(PFFFT_USE_BENCH_GREEN  "use Green FFT in fft benchmark? - if exists in subdir" ON)
20option(PFFFT_USE_BENCH_KISS   "use KissFFT in fft benchmark? - if exists in subdir" ON)
21option(PFFFT_USE_BENCH_POCKET "use PocketFFT in fft benchmark? - if exists in subdir" ON)
22option(PFFFT_USE_BENCH_MKL    "use Intel MKL in fft benchmark? needs to be installed" OFF)
23option(PFFFT_USE_FFTPACK      "compile and use FFTPACK in fft benchmark & validation?" ON)
24
25option(PFFFT_USE_DEBUG_ASAN  "use GCC's address sanitizer?" OFF)
26
27option(PFFFT_DISABLE_LINK_WITH_M "Disables linking with m library to build with clangCL from MSVC" OFF)
28
29# C90 requires the gcc extensions for function attributes like always_inline
30# C99 provides the function attributes: no gcc extensions required
31set(CMAKE_C_STANDARD 99)
32set(CMAKE_C_EXTENSIONS OFF)
33
34set(CMAKE_CXX_STANDARD 98)
35set(CMAKE_CXX_STANDARD_REQUIRED ON)
36set(CMAKE_CXX_EXTENSIONS OFF)
37
38# populate what to install
39set(INSTALL_TARGETS "")
40set(INSTALL_HEADERS "")
41
42
43if ( (NOT PFFFT_USE_TYPE_FLOAT) AND (NOT PFFFT_USE_TYPE_DOUBLE) )
44  message(FATAL_ERROR "activate at least one of PFFFT_USE_TYPE_FLOAT or PFFFT_USE_TYPE_DOUBLE")
45endif()
46
47list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
48include(cmake/target_optimizations.cmake)
49include(cmake/compiler_warnings.cmake)
50find_package(PAPI)
51find_package(MIPP)
52if (MIPP_FOUND)
53# if (TARGET MIPP)
54    message(STATUS "found MIPP")
55else()
56    message(STATUS "NOT found MIPP")
57endif()
58
59
60if (PFFFT_USE_DEBUG_ASAN)
61  set(ASANLIB "asan")
62else()
63  set(ASANLIB "")
64endif()
65
66message(STATUS "INFO: CMAKE_C_COMPILER_ID is ${CMAKE_C_COMPILER_ID}")
67message(STATUS "INFO: CMAKE_CXX_COMPILER_ID is ${CMAKE_CXX_COMPILER_ID}")
68if (WIN32)
69  message(STATUS "INFO: detected WIN32")
70else()
71  message(STATUS "INFO: NOT WIN32")
72endif()
73if (MINGW)
74  message(STATUS "INFO: detected MINGW with compiler ${CMAKE_C_COMPILER_ID}")
75else()
76  message(STATUS "INFO: NOT MINGW")
77endif()
78if ( CMAKE_C_COMPILER_ID MATCHES "MSVC" )
79  message(STATUS "INFO: detected MSVC with compiler ${CMAKE_C_COMPILER_ID}")
80endif()
81
82
83if (PFFFT_USE_BENCH_GREEN)
84  if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/greenffts/CMakeLists.txt")
85    message(STATUS "found subdir greenffts")
86    set(PATH_GREEN "${CMAKE_CURRENT_LIST_DIR}/greenffts")
87    add_subdirectory( "${PATH_GREEN}" )
88  else()
89    message(WARNING "GreenFFT not found in subdir greenffts")
90  endif()
91endif()
92
93if (PFFFT_USE_BENCH_KISS)
94  # git submodule add https://github.com/hayguen/kissfft.git
95  if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/kissfft/CMakeLists.txt")
96    message(STATUS "found subdir kissfft")
97    set(PATH_KISS "${CMAKE_CURRENT_LIST_DIR}/kissfft")
98    add_subdirectory( "${PATH_KISS}" )
99  else()
100    message(WARNING "KissFFT not found in subdir kissfft")
101  endif()
102endif()
103
104if (PFFFT_USE_BENCH_POCKET)
105  # git submodule add https://github.com/hayguen/pocketfft.git
106  if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/pocketfft/pocketfft_double.c")
107    message(STATUS "found subdir pocketfft")
108    set(PATH_POCKET "${CMAKE_CURRENT_LIST_DIR}/pocketfft")
109    add_subdirectory( "${PATH_POCKET}" )
110  else()
111    message(WARNING "PocketFFT not found in subdir pocketfft")
112  endif()
113endif()
114
115
116########################################################################
117# select the release build type by default to get optimization flags
118########################################################################
119if(NOT CMAKE_BUILD_TYPE)
120   set(CMAKE_BUILD_TYPE "Release")
121   message(STATUS "Build type not specified: defaulting to release.")
122endif(NOT CMAKE_BUILD_TYPE)
123
124if ( CMAKE_C_COMPILER_ID MATCHES "MSVC" )
125  # using Visual Studio C++
126  message(STATUS "INFO: detected MSVC: will not link math lib m")
127  set(MATHLIB "")
128
129  add_definitions("/D_CRT_SECURE_NO_WARNINGS")
130
131  set(MSVC_DISABLED_WARNINGS_LIST
132      "C4996"
133  )
134
135else()
136  if(PFFFT_DISABLE_LINK_WITH_M)
137  else()
138    message(STATUS "INFO: detected NO MSVC: ${CMAKE_C_COMPILER_ID}: will link math lib m")
139    set(MATHLIB "m")
140  endif()
141endif()
142
143set(STDCXXLIB "")
144if (MINGW)
145  set(STDCXXLIB "stdc++")
146endif()
147
148
149set( SIMD_FLOAT_HDRS simd/pf_float.h simd/pf_sse1_float.h simd/pf_altivec_float.h simd/pf_neon_float.h simd/pf_scalar_float.h )
150set( SIMD_DOUBLE_HDRS simd/pf_double.h simd/pf_avx_double.h simd/pf_scalar_double.h )
151
152if (PFFFT_USE_TYPE_FLOAT)
153  set( FLOAT_SOURCES pffft.c pffft.h ${SIMD_FLOAT_HDRS} )
154  if (INSTALL_PFFFT)
155    set(INSTALL_HEADERS ${INSTALL_HEADERS} pffft.h)
156  endif()
157else()
158  set( FLOAT_SOURCES  )
159endif()
160
161
162if (PFFFT_USE_TYPE_DOUBLE)
163  set( DOUBLE_SOURCES pffft_double.c pffft_double.h ${SIMD_DOUBLE_HDRS} )
164  if (INSTALL_PFFFT)
165    set(INSTALL_HEADERS ${INSTALL_HEADERS} pffft_double.h)
166  endif()
167else()
168  set( DOUBLE_SOURCES )
169endif()
170
171######################################################
172
173add_library(PFFFT STATIC ${FLOAT_SOURCES} ${DOUBLE_SOURCES} pffft_common.c pffft_priv_impl.h pffft.hpp )
174set_target_properties(PFFFT PROPERTIES OUTPUT_NAME "pffft")
175target_compile_definitions(PFFFT PRIVATE _USE_MATH_DEFINES)
176target_activate_c_compiler_warnings(PFFFT)
177if (PFFFT_USE_SCALAR_VECT)
178  target_compile_definitions(PFFFT PRIVATE PFFFT_SCALVEC_ENABLED=1)
179endif()
180if (PFFFT_USE_DEBUG_ASAN)
181  target_compile_options(PFFFT PRIVATE "-fsanitize=address")
182endif()
183target_set_c_arch_flags(PFFFT)
184if (NOT PFFFT_USE_SIMD)
185  target_compile_definitions(PFFFT PRIVATE PFFFT_SIMD_DISABLE=1)
186endif()
187target_link_libraries( PFFFT ${ASANLIB} ${MATHLIB} )
188set_property(TARGET PFFFT APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
189  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
190)
191if (INSTALL_PFFFT)
192  set(INSTALL_TARGETS ${INSTALL_TARGETS} PFFFT)
193  set(INSTALL_HEADERS ${INSTALL_HEADERS} pffft.hpp)
194endif()
195
196######################################################
197
198if (PFFFT_USE_TYPE_FLOAT)
199  add_library(PFDSP STATIC pf_mixer.cpp pf_mixer.h pf_cplx.h pf_carrier.cpp pf_carrier.h pf_cic.cpp pf_cic.h fmv.h )
200  set_property(TARGET PFDSP PROPERTY CXX_STANDARD 11)
201  set_property(TARGET PFDSP PROPERTY CXX_STANDARD_REQUIRED ON)
202  set_target_properties(PFDSP PROPERTIES OUTPUT_NAME "pfdsp")
203  target_compile_definitions(PFDSP PRIVATE _USE_MATH_DEFINES)
204  target_activate_cxx_compiler_warnings(PFDSP)
205  if (PFFFT_USE_DEBUG_ASAN)
206      target_compile_options(PFDSP PRIVATE "-fsanitize=address")
207  endif()
208  if (PFFFT_USE_SIMD)
209      target_set_cxx_arch_flags(PFDSP)
210  else()
211      target_compile_definitions(PFDSP PRIVATE PFFFT_SIMD_DISABLE=1)
212  endif()
213  target_link_libraries( PFDSP ${MATHLIB} )
214  set_property(TARGET PFDSP APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
215      $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
216  )
217  if (INSTALL_PFDSP)
218      set(INSTALL_TARGETS ${INSTALL_TARGETS} PFDSP)
219      set(INSTALL_HEADERS ${INSTALL_HEADERS} pf_mixer.h pf_cplx.h pf_carrier.h pf_cic.h)
220  endif()
221endif()
222
223######################################################
224
225if (PFFFT_USE_FFTPACK)
226
227  # float / single precision
228  add_library(FFTPACK_FLOAT STATIC fftpack.c fftpack.h)
229  target_compile_definitions(FFTPACK_FLOAT PRIVATE _USE_MATH_DEFINES)
230  target_activate_c_compiler_warnings(FFTPACK_FLOAT)
231  target_link_libraries( FFTPACK_FLOAT ${MATHLIB} )
232  set_property(TARGET FFTPACK_FLOAT APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
233    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
234  )
235
236  # double precision
237  add_library(FFTPACK_DOUBLE STATIC fftpack.c fftpack.h)
238  target_compile_definitions(FFTPACK_DOUBLE PRIVATE _USE_MATH_DEFINES)
239  target_compile_definitions(FFTPACK_DOUBLE PUBLIC FFTPACK_DOUBLE_PRECISION)
240  target_activate_c_compiler_warnings(FFTPACK_DOUBLE)
241  target_link_libraries( FFTPACK_DOUBLE ${MATHLIB} )
242  set_property(TARGET FFTPACK_DOUBLE APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
243    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
244  )
245
246  # builtin test program of fftpack
247  add_executable(test_fftpack_float fftpack.c fftpack.h)
248  target_compile_definitions(test_fftpack_float PRIVATE _USE_MATH_DEFINES TESTING_FFTPACK)
249  target_link_libraries(test_fftpack_float ${MATHLIB})
250
251  add_executable(test_fftpack_double fftpack.c fftpack.h)
252  target_compile_definitions(test_fftpack_double PRIVATE _USE_MATH_DEFINES FFTPACK_DOUBLE_PRECISION TESTING_FFTPACK)
253  target_link_libraries(test_fftpack_double ${MATHLIB})
254
255endif()
256
257######################################################
258
259if (PFFFT_USE_TYPE_FLOAT)
260  # only 'float' supported in PFFASTCONV
261  add_library(PFFASTCONV STATIC pffastconv.c pffastconv.h pffft.h )
262  set_target_properties(PFFASTCONV PROPERTIES OUTPUT_NAME "pffastconv")
263  target_compile_definitions(PFFASTCONV PRIVATE _USE_MATH_DEFINES)
264  target_activate_c_compiler_warnings(PFFASTCONV)
265  if (PFFFT_USE_DEBUG_ASAN)
266    target_compile_options(PFFASTCONV PRIVATE "-fsanitize=address")
267  endif()
268  target_link_libraries( PFFASTCONV PFFFT ${ASANLIB} ${MATHLIB} )
269  set_property(TARGET PFFASTCONV APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
270    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
271  )
272  if (INSTALL_PFFASTCONV)
273    set(INSTALL_TARGETS ${INSTALL_TARGETS} PFFASTCONV)
274    set(INSTALL_HEADERS ${INSTALL_HEADERS} pffastconv.h)
275  endif()
276endif()
277
278
279######################################################
280
281install( TARGETS ${INSTALL_TARGETS}  DESTINATION lib)
282install( FILES  ${INSTALL_HEADERS}  DESTINATION include)
283
284add_custom_target(uninstall
285    "${CMAKE_COMMAND}" -P "${CMAKE_SOURCE_DIR}/uninstall.cmake"
286)
287
288#######################################################
289
290if (PFFFT_USE_TYPE_FLOAT)
291  add_executable( test_pffft_float  test_pffft.c )
292  target_compile_definitions(test_pffft_float PRIVATE _USE_MATH_DEFINES)
293  target_compile_definitions(test_pffft_float PRIVATE PFFFT_ENABLE_FLOAT)
294  target_link_libraries( test_pffft_float  PFFFT ${ASANLIB} )
295endif()
296
297######################################################
298
299if (PFFFT_USE_TYPE_DOUBLE)
300  add_executable( test_pffft_double  test_pffft.c )
301  target_compile_definitions(test_pffft_double PRIVATE _USE_MATH_DEFINES)
302  target_compile_definitions(test_pffft_double PRIVATE PFFFT_ENABLE_DOUBLE)
303  target_link_libraries( test_pffft_double  PFFFT ${ASANLIB} )
304endif()
305
306######################################################
307
308add_executable( test_fft_factors  test_fft_factors.c )
309if (PFFFT_USE_TYPE_FLOAT)
310  target_compile_definitions(test_fft_factors PRIVATE PFFFT_ENABLE_FLOAT)
311endif()
312if (PFFFT_USE_TYPE_DOUBLE)
313  target_compile_definitions(test_fft_factors PRIVATE PFFFT_ENABLE_DOUBLE)
314endif()
315target_link_libraries(test_fft_factors PFFFT ${ASANLIB} ${MATHLIB})
316
317######################################################
318
319add_executable( test_pffft_cpp test_pffft.cpp )
320target_compile_definitions(test_pffft_cpp PRIVATE _USE_MATH_DEFINES)
321if (PFFFT_USE_TYPE_FLOAT)
322  target_compile_definitions(test_pffft_cpp PRIVATE PFFFT_ENABLE_FLOAT)
323endif()
324if (PFFFT_USE_TYPE_DOUBLE)
325  target_compile_definitions(test_pffft_cpp PRIVATE PFFFT_ENABLE_DOUBLE)
326endif()
327target_link_libraries( test_pffft_cpp  PFFFT ${STDCXXLIB} ${ASANLIB} )
328
329######################################################
330
331add_executable( test_pffft_cpp_11 test_pffft.cpp )
332target_compile_definitions(test_pffft_cpp_11 PRIVATE _USE_MATH_DEFINES)
333if (PFFFT_USE_TYPE_FLOAT)
334  target_compile_definitions(test_pffft_cpp_11 PRIVATE PFFFT_ENABLE_FLOAT)
335endif()
336if (PFFFT_USE_TYPE_DOUBLE)
337  target_compile_definitions(test_pffft_cpp_11 PRIVATE PFFFT_ENABLE_DOUBLE)
338endif()
339target_link_libraries( test_pffft_cpp_11  PFFFT ${STDCXXLIB} ${ASANLIB} )
340
341set_property(TARGET test_pffft_cpp_11 PROPERTY CXX_STANDARD 11)
342set_property(TARGET test_pffft_cpp_11 PROPERTY CXX_STANDARD_REQUIRED ON)
343
344######################################################
345
346if (PFFFT_USE_TYPE_FLOAT)
347  add_executable(test_pffastconv   test_pffastconv.c
348    ${SIMD_FLOAT_HDRS} ${SIMD_DOUBLE_HDRS}
349  )
350  target_compile_definitions(test_pffastconv PRIVATE _USE_MATH_DEFINES)
351  if (PFFFT_USE_DEBUG_ASAN)
352    target_compile_options(test_pffastconv PRIVATE "-fsanitize=address")
353  endif()
354  target_set_c_arch_flags(test_pffastconv)
355  if (NOT PFFFT_USE_SIMD)
356    target_compile_definitions(test_pffastconv PRIVATE PFFFT_SIMD_DISABLE=1)
357  endif()
358  target_link_libraries( test_pffastconv  PFFASTCONV ${ASANLIB} ${MATHLIB} )
359
360endif()
361
362######################################################
363
364if (PFFFT_USE_TYPE_FLOAT)
365  add_executable(bench_pffft_float   bench_pffft.c pffft.h)
366  target_compile_definitions(bench_pffft_float PRIVATE _USE_MATH_DEFINES)
367  target_compile_definitions(bench_pffft_float PRIVATE PFFFT_ENABLE_FLOAT)
368  if (PFFFT_USE_DEBUG_ASAN)
369    target_compile_options(bench_pffft_float PRIVATE "-fsanitize=address")
370  endif()
371
372  target_link_libraries( bench_pffft_float  PFFFT ${ASANLIB} )
373
374  if (PFFFT_USE_FFTPACK)
375    target_compile_definitions(bench_pffft_float PRIVATE HAVE_FFTPACK=1)
376    target_link_libraries(bench_pffft_float  FFTPACK_FLOAT)
377  endif()
378
379  if (PFFFT_USE_BENCH_FFTW)
380    target_compile_definitions(bench_pffft_float PRIVATE HAVE_FFTW=1)
381    target_link_libraries(bench_pffft_float  fftw3f)
382  endif()
383
384  if (PATH_GREEN AND PFFFT_USE_BENCH_GREEN)
385    target_compile_definitions(bench_pffft_float PRIVATE HAVE_GREEN_FFTS=1)
386    target_link_libraries(bench_pffft_float  GreenFFT)
387  endif()
388
389  if (PATH_KISS AND PFFFT_USE_BENCH_KISS)
390    target_compile_definitions(bench_pffft_float PRIVATE HAVE_KISS_FFT=1)
391    target_link_libraries(bench_pffft_float  KissFFT)
392  endif()
393
394  if (PATH_POCKET AND PFFFT_USE_BENCH_POCKET)
395    target_compile_definitions(bench_pffft_float PRIVATE HAVE_POCKET_FFT=1)
396    target_link_libraries(bench_pffft_float  PocketFFT)
397  endif()
398
399  if (PFFFT_USE_BENCH_MKL)
400    if ( (CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") OR (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") )
401      # has chances to work
402    else()
403      # other PROCESSORs could be "ppc", "ppc64",  "arm", "aarch64", "armv7l" - or something else?!
404      message(WARNING "using Intel MKL on '${CMAKE_SYSTEM_PROCESSOR}' might fail.")
405    endif()
406    message(STATUS "In case compiling/linking with Intel MKL fails, check CMakeLists.txt or deactivate PFFFT_USE_BENCH_MKL")
407    target_compile_definitions(bench_pffft_float PRIVATE HAVE_MKL=1)
408    target_link_libraries(bench_pffft_float  mkl_intel_lp64 mkl_sequential -lmkl_core)
409  endif()
410endif()
411
412if (PFFFT_USE_TYPE_DOUBLE)
413  add_executable(bench_pffft_double   bench_pffft.c pffft.h)
414  target_compile_definitions(bench_pffft_double PRIVATE _USE_MATH_DEFINES)
415  target_compile_definitions(bench_pffft_double PRIVATE PFFFT_ENABLE_DOUBLE)
416  if (PFFFT_USE_DEBUG_ASAN)
417    target_compile_options(bench_pffft_double PRIVATE "-fsanitize=address")
418  endif()
419  target_link_libraries( bench_pffft_double  PFFFT ${ASANLIB} )
420
421  if (PFFFT_USE_FFTPACK)
422    target_compile_definitions(bench_pffft_double PRIVATE HAVE_FFTPACK=1)
423    target_link_libraries(bench_pffft_double  FFTPACK_DOUBLE)
424  endif()
425
426  if (PFFFT_USE_BENCH_FFTW)
427    target_compile_definitions(bench_pffft_double PRIVATE HAVE_FFTW=1)
428    target_link_libraries(bench_pffft_double  fftw3)
429  endif()
430
431  if (PATH_POCKET AND PFFFT_USE_BENCH_POCKET)
432    target_compile_definitions(bench_pffft_double PRIVATE HAVE_POCKET_FFT=1)
433    target_link_libraries(bench_pffft_double  PocketFFT)
434  endif()
435
436  if (PFFFT_USE_BENCH_MKL)
437    if ( (CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") OR (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") )
438      # has chances to work
439    else()
440      # other PROCESSORs could be "ppc", "ppc64",  "arm", "aarch64", "armv7l" - or something else?!
441      message(WARNING "using Intel MKL on '${CMAKE_SYSTEM_PROCESSOR}' might fail.")
442    endif()
443    message(STATUS "In case compiling/linking with Intel MKL fails, check CMakeLists.txt or deactivate PFFFT_USE_BENCH_MKL")
444    target_compile_definitions(bench_pffft_double PRIVATE HAVE_MKL=1)
445    target_link_libraries(bench_pffft_double  mkl_intel_lp64 mkl_sequential -lmkl_core)
446  endif()
447endif()
448
449######################################################
450
451if (PFFFT_USE_TYPE_FLOAT)
452
453    add_executable(bench_pf_mixer_float   bench_mixers.cpp papi_perf_counter.h)
454    target_compile_definitions(bench_pf_mixer_float PRIVATE _USE_MATH_DEFINES)
455    target_compile_definitions(bench_pf_mixer_float PRIVATE PFFFT_ENABLE_FLOAT)
456    target_link_libraries( bench_pf_mixer_float  ${ASANLIB} )
457    if (PFFFT_USE_DEBUG_ASAN)
458      target_compile_options(bench_pf_mixer_float PRIVATE "-fsanitize=address")
459    endif()
460    if (PAPI_FOUND)
461        target_compile_definitions(bench_pf_mixer_float PRIVATE HAVE_PAPI=1)
462        target_link_libraries(bench_pf_mixer_float ${PAPI_LIBRARIES})
463    endif()
464    target_link_libraries( bench_pf_mixer_float  PFDSP $<$<CXX_COMPILER_ID:GNU>:stdc++> )
465
466
467  ############################################################################
468
469  add_library(pf_conv_arch_none pf_conv.cpp pf_conv.h pf_cplx.h)
470  target_compile_definitions(pf_conv_arch_none PRIVATE CONV_ARCH_POST=none MIPP_NO_INTRINSICS=1)
471  set_property(TARGET pf_conv_arch_none PROPERTY CXX_STANDARD 11)
472  set_property(TARGET pf_conv_arch_none PROPERTY CXX_STANDARD_REQUIRED ON)
473  target_activate_cxx_compiler_warnings(pf_conv_arch_none)
474  add_library(pf_conv_dispatcher  pf_conv_dispatcher.cpp pf_conv_dispatcher.h pf_conv.h pf_cplx.h)
475  set_property(TARGET pf_conv_dispatcher PROPERTY CXX_STANDARD 11)
476  set_property(TARGET pf_conv_dispatcher PROPERTY CXX_STANDARD_REQUIRED ON)
477  target_activate_cxx_compiler_warnings(pf_conv_dispatcher)
478
479  add_library(pf_conv_arch_dflt pf_conv.cpp pf_conv.h pf_cplx.h)
480  target_compile_definitions(pf_conv_arch_dflt PRIVATE CONV_ARCH_POST=dflt)
481  set_property(TARGET pf_conv_arch_dflt PROPERTY CXX_STANDARD 11)
482  set_property(TARGET pf_conv_arch_dflt PROPERTY CXX_STANDARD_REQUIRED ON)
483  target_activate_cxx_compiler_warnings(pf_conv_arch_dflt)
484  target_set_cxx_arch_flags(pf_conv_arch_dflt)
485
486  target_link_libraries(pf_conv_dispatcher pf_conv_arch_none pf_conv_arch_dflt)
487
488  if ((CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") OR (CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64"))
489
490    if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
491        set(PF_CONV_ARCHES "sse3;sse4;avx;avx2")
492        set(PF_CONV_OPT_sse3 "core2")  # emulate a map
493        set(PF_CONV_OPT_sse4 "nehalem")
494        set(PF_CONV_OPT_avx  "sandybridge")
495        set(PF_CONV_OPT_avx2 "haswell")
496        target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_AMD64)
497    elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
498        set(PF_CONV_ARCHES "sse2;avx;avx2")
499        set(PF_CONV_OPT_sse2 "SSE2")  # emulate a map
500        set(PF_CONV_OPT_avx  "AVX")
501        set(PF_CONV_OPT_avx2 "AVX2")
502        target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_MSVC_AMD64)
503    else()
504        set(PF_CONV_ARCHES "")
505        message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation")
506    endif()
507
508  elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
509
510      if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
511          set(PF_CONV_ARCHES "armv8a")
512          set(PF_CONV_OPT_armv8a   "armv8-a")  # emulate a map for arch
513
514          target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_AARCH64)
515      else()
516          set(PF_CONV_ARCHES "")
517          message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation")
518      endif()
519
520  elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "armv7l")
521
522    if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
523        set(PF_CONV_ARCHES "neon_vfpv4;neon_rpi3_a53;neon_rpi4_a72")
524        set(PF_CONV_OPT_neon_vfpv4        "armv7-a")    # emulate a map for arch
525        set(PF_CONV_EXTRA_neon_vfpv4      "neon_vfpv4") # emulate a map for additional options (EXTRA)
526        set(PF_CONV_OPT_neon_rpi3_a53     "armv7-a")
527        set(PF_CONV_EXTRA_neon_rpi3_a53   "neon_rpi3_a53")
528        set(PF_CONV_OPT_neon_rpi4_a72     "armv7-a")
529        set(PF_CONV_EXTRA_neon_rpi4_a72   "neon_rpi4_a72")
530
531        target_compile_definitions(pf_conv_dispatcher PRIVATE CONV_ARCH_GCC_ARM32NEON)
532    else()
533        set(PF_CONV_ARCHES "")
534        message(WARNING "unknown compiler ${CMAKE_CXX_COMPILER_ID} on CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation")
535    endif()
536
537  else()
538      message(WARNING "this is unforseen CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}: can't do architecture specific compilation")
539  endif()
540
541  foreach (arch_opt ${PF_CONV_ARCHES})
542      add_library(pf_conv_arch_${arch_opt} pf_conv.cpp pf_conv.h pf_cplx.h)
543      set_property(TARGET pf_conv_arch_${arch_opt} PROPERTY CXX_STANDARD 11)
544      set_property(TARGET pf_conv_arch_${arch_opt} PROPERTY CXX_STANDARD_REQUIRED ON)
545      target_activate_cxx_compiler_warnings(pf_conv_arch_${arch_opt})
546      target_compile_definitions(pf_conv_arch_${arch_opt} PRIVATE CONV_ARCH_POST=${arch_opt})
547
548      target_set_cxx_arch_option(pf_conv_arch_${arch_opt} "${PF_CONV_OPT_${arch_opt}}" "${PF_CONV_EXTRA_${arch_opt}}"  "${PF_CONV_OPT_${arch_opt}}")
549      target_link_libraries(pf_conv_dispatcher  pf_conv_arch_${arch_opt})
550      message(STATUS "added library pf_conv_arch_${arch_opt}  with CONV_ARCH_POST=${arch_opt}")
551  endforeach()
552
553  if (PFFFT_USE_DEBUG_ASAN)
554      foreach (arch_opt ${PF_CONV_ARCHES})
555          target_compile_options(pf_conv_arch_${arch_opt} PRIVATE "-fsanitize=address")
556          target_link_libraries( pf_conv_arch_${arch_opt} ${ASANLIB})
557      endforeach()
558
559      target_compile_options(pf_conv_arch_none  PRIVATE "-fsanitize=address")
560      target_link_libraries( pf_conv_arch_none  ${ASANLIB})
561
562      target_compile_options(pf_conv_dispatcher  PRIVATE "-fsanitize=address")
563      target_link_libraries(pf_conv_dispatcher ${ASANLIB})
564  endif()
565
566  if(MIPP_FOUND)
567      foreach (arch_opt ${PF_CONV_ARCHES})
568          message(STATUS "link pf_conv_arch_${arch_opt} against MIPP")
569          target_link_libraries(pf_conv_arch_${arch_opt} MIPP)
570      endforeach()
571
572      message(STATUS "link pf_conv_arch_none against MIPP")
573      target_link_libraries(pf_conv_arch_none MIPP)
574  endif()
575
576  ############################################################################
577
578  add_executable(bench_pf_conv_float   bench_conv.cpp papi_perf_counter.h)
579  set_property(TARGET bench_pf_conv_float PROPERTY CXX_STANDARD 11)
580  set_property(TARGET bench_pf_conv_float PROPERTY CXX_STANDARD_REQUIRED ON)
581  target_compile_definitions(bench_pf_conv_float PRIVATE _USE_MATH_DEFINES)
582  target_compile_definitions(bench_pf_conv_float PRIVATE PFFFT_ENABLE_FLOAT)
583  if (PFFFT_USE_DEBUG_ASAN)
584      target_compile_options(bench_pf_conv_float PRIVATE "-fsanitize=address")
585  endif()
586  target_link_libraries( bench_pf_conv_float  ${ASANLIB} )
587  if (PAPI_FOUND)
588      target_compile_definitions(bench_pf_conv_float PRIVATE HAVE_PAPI=1)
589      target_link_libraries(bench_pf_conv_float ${PAPI_LIBRARIES})
590  endif()
591  if(MIPP_FOUND)
592      target_link_libraries(bench_pf_conv_float MIPP)
593  endif()
594  target_link_libraries( bench_pf_conv_float  pf_conv_dispatcher PFDSP $<$<CXX_COMPILER_ID:GNU>:stdc++> )
595
596endif()
597
598######################################################
599
600add_subdirectory(examples)
601
602######################################################
603
604enable_testing()
605
606
607add_test(NAME test_fft_factors
608  COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_fft_factors"
609  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
610)
611
612if (PFFFT_USE_FFTPACK)
613  add_test(NAME test_fftpack_float
614    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_fftpack_float"
615    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
616  )
617
618  add_test(NAME test_fftpack_double
619    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_fftpack_double"
620    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
621  )
622endif()
623
624
625if (PFFFT_USE_TYPE_FLOAT)
626
627  add_test(NAME bench_pffft_pow2
628    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/bench_pffft_float" "--max-len" "128" "--quick"
629    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
630  )
631
632  add_test(NAME bench_pffft_non2
633    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/bench_pffft_float" "--non-pow2" "--max-len" "192" "--quick"
634    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
635  )
636
637  # add_test(NAME bench_plots
638  #   COMMAND bash "-c" "${CMAKE_CURRENT_SOURCE_DIR}/plots.sh"
639  #   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
640  # )
641
642  add_test(NAME test_pfconv_lens_symetric
643    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-bench" "--quick" "--sym"
644    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
645  )
646
647  add_test(NAME test_pfconv_lens_non_sym
648    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-bench" "--quick"
649    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
650  )
651
652  add_test(NAME bench_pfconv_symetric
653    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-len" "--quick" "--sym"
654    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
655  )
656
657  add_test(NAME bench_pfconv_non_sym
658    COMMAND "${CMAKE_CURRENT_BINARY_DIR}/test_pffastconv" "--no-len" "--quick"
659    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
660  )
661
662endif()
663
664