1- cmake_minimum_required (VERSION 3.0 )
1+ cmake_minimum_required (VERSION 3.1 )
22
33if (NOT DEFINED CMAKE_BUILD_TYPE )
44 set (CMAKE_BUILD_TYPE Release CACHE STRING "Build type" )
@@ -18,6 +18,7 @@ option (ENABLE_THREADS "Use pthread for multithreading" OFF)
1818option (WITH_COMBINED_THREADS "Merge thread library" OFF )
1919
2020option (ENABLE_FLOAT "single-precision" OFF )
21+ option (ENABLE_DOUBLE "double-precision" ON )
2122option (ENABLE_LONG_DOUBLE "long-double precision" OFF )
2223option (ENABLE_QUAD_PRECISION "quadruple-precision" OFF )
2324
@@ -263,145 +264,159 @@ endif ()
263264
264265set (FFTW_VERSION 3.3.7)
265266
266- set (PREC_SUFFIX)
267- if (ENABLE_FLOAT)
268- set (FFTW_SINGLE TRUE )
269- set (BENCHFFT_SINGLE TRUE )
270- set (PREC_SUFFIX f)
267+ if (BUILD_SHARED_LIBS )
268+ add_definitions (-DFFTW_DLL)
271269endif ()
272270
273- if (ENABLE_LONG_DOUBLE)
274- set (FFTW_LDOUBLE TRUE )
275- set (BENCHFFT_LDOUBLE TRUE )
276- set (PREC_SUFFIX l)
277- endif ()
271+ function (add_fftw_library PRECISION)
272+ if (PRECISION MATCHES "^(SINGLE|LDOUBLE|QUAD)$" )
273+ set (FFTW_${PRECISION} TRUE )
274+ set (BENCHFFT_${PRECISION} TRUE )
275+ if (PRECISION STREQUAL SINGLE)
276+ set (PREC_SUFFIX f)
277+ else ()
278+ string (SUBSTRING ${PRECISION} 0 1 PREC_SUFFIX)
279+ string (TOLOWER ${PREC_SUFFIX} PREC_SUFFIX)
280+ endif ()
281+ endif ()
278282
279- if (ENABLE_QUAD_PRECISION)
280- set (FFTW_QUAD TRUE )
281- set (BENCHFFT_QUAD TRUE )
282- set (PREC_SUFFIX q)
283- endif ()
284- set (fftw3_lib fftw3${PREC_SUFFIX} )
283+ set (fftw3_lib fftw3${PREC_SUFFIX} )
285284
286- configure_file (cmake.config.h.in config.h @ONLY)
287- include_directories (${CMAKE_CURRENT_BINARY_DIR} )
285+ add_library (${fftw3_lib} ${SOURCEFILES} )
288286
289- if (BUILD_SHARED_LIBS )
290- add_definitions (-DFFTW_DLL)
291- endif ()
287+ configure_file (cmake.config.h.in ${CMAKE_CURRENT_BINARY_DIR} /${fftw3_lib} /config.h @ONLY)
288+ target_include_directories (${fftw3_lib} PRIVATE "${CMAKE_CURRENT_BINARY_DIR} /${fftw3_lib} " )
292289
290+ if (MSVC )
291+ target_compile_definitions (${fftw3_lib} PRIVATE /bigobj)
292+ endif ()
293+ if (HAVE_SSE)
294+ target_compile_options (${fftw3_lib} PRIVATE ${SSE_FLAG} )
295+ endif ()
296+ if (HAVE_SSE2)
297+ target_compile_options (${fftw3_lib} PRIVATE ${SSE2_FLAG} )
298+ endif ()
299+ if (HAVE_AVX)
300+ target_compile_options (${fftw3_lib} PRIVATE ${AVX_FLAG} )
301+ endif ()
302+ if (HAVE_AVX2)
303+ target_compile_options (${fftw3_lib} PRIVATE ${AVX2_FLAG} )
304+ endif ()
305+ if (HAVE_FMA)
306+ target_compile_options (${fftw3_lib} PRIVATE ${FMA_FLAG} )
307+ endif ()
308+ if (HAVE_LIBM)
309+ target_link_libraries (${fftw3_lib} m)
310+ endif ()
293311
294- add_library (${fftw3_lib} ${SOURCEFILES} )
295- if (MSVC )
296- target_compile_definitions (${fftw3_lib} PRIVATE /bigobj)
297- endif ()
298- if (HAVE_SSE)
299- target_compile_options (${fftw3_lib} PRIVATE ${SSE_FLAG} )
300- endif ()
301- if (HAVE_SSE2)
302- target_compile_options (${fftw3_lib} PRIVATE ${SSE2_FLAG} )
303- endif ()
304- if (HAVE_AVX)
305- target_compile_options (${fftw3_lib} PRIVATE ${AVX_FLAG} )
306- endif ()
307- if (HAVE_AVX2)
308- target_compile_options (${fftw3_lib} PRIVATE ${AVX2_FLAG} )
309- endif ()
310- if (HAVE_FMA)
311- target_compile_options (${fftw3_lib} PRIVATE ${FMA_FLAG} )
312- endif ()
313- if (HAVE_LIBM)
314- target_link_libraries (${fftw3_lib} m)
315- endif ()
312+ list (APPEND subtargets ${fftw3_lib} )
316313
317- set (subtargets ${fftw3_lib} )
314+ if (ENABLE_THREADS AND Threads_FOUND)
315+ if (WITH_COMBINED_THREADS)
316+ target_link_libraries (${fftw3_lib} Threads::Threads)
317+ else ()
318+ add_library (${fftw3_lib} _threads ${fftw_threads_SOURCE} )
319+ target_link_libraries (${fftw3_lib} _threads ${fftw3_lib} )
320+ target_link_libraries (${fftw3_lib} _threads Threads::Threads)
321+ list (APPEND subtargets ${fftw3_lib} _threads)
322+ endif ()
323+ endif ()
318324
319- if (Threads_FOUND)
320- if (WITH_COMBINED_THREADS)
321- target_link_libraries (${fftw3_lib} ${CMAKE_THREAD_LIBS_INIT} )
322- else ()
323- add_library (${fftw3_lib} _threads ${fftw_threads_SOURCE} )
324- target_link_libraries (${fftw3_lib} _threads ${fftw3_lib} )
325- target_link_libraries (${fftw3_lib} _threads ${CMAKE_THREAD_LIBS_INIT} )
326- list (APPEND subtargets ${fftw3_lib} _threads)
325+ if (ENABLE_OPENMP AND OPENMP_FOUND)
326+ add_library (${fftw3_lib} _omp ${fftw_omp_SOURCE} )
327+ target_link_libraries (${fftw3_lib} _omp ${fftw3_lib} )
328+ target_link_libraries (${fftw3_lib} _omp ${CMAKE_THREAD_LIBS_INIT} )
329+ list (APPEND subtargets ${fftw3_lib} _omp)
330+ target_compile_options (${fftw3_lib} _omp PRIVATE ${OpenMP_C_FLAGS} )
327331 endif ()
328- endif ()
329332
330- if (OPENMP_FOUND)
331- add_library (${fftw3_lib} _omp ${fftw_omp_SOURCE} )
332- target_link_libraries (${fftw3_lib} _omp ${fftw3_lib} )
333- target_link_libraries (${fftw3_lib} _omp ${CMAKE_THREAD_LIBS_INIT} )
334- list (APPEND subtargets ${fftw3_lib} _omp)
335- target_compile_options (${fftw3_lib} _omp PRIVATE ${OpenMP_C_FLAGS} )
333+ install (TARGETS ${fftw3_lib}
334+ EXPORT FFTW3LibraryDepends
335+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
336+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
337+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} )
338+
339+
340+ # pkgconfig file
341+ set (prefix ${CMAKE_INSTALL_PREFIX} )
342+ set (exec_prefix ${CMAKE_INSTALL_PREFIX} )
343+ set (libdir ${CMAKE_INSTALL_FULL_LIBDIR} )
344+ set (includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR} )
345+ set (VERSION ${FFTW_VERSION} )
346+ configure_file (fftw.pc.in fftw${PREC_SUFFIX} .pc @ONLY)
347+ install (FILES
348+ ${CMAKE_CURRENT_BINARY_DIR} /fftw${PREC_SUFFIX} .pc
349+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /pkgconfig
350+ COMPONENT Development)
351+
352+ # cmake file
353+ set (FFTW3_LIBRARIES "FFTW3::${fftw3_lib} " )
354+ configure_file (FFTW3Config.cmake.in FFTW3${PREC_SUFFIX} Config.cmake @ONLY)
355+ configure_file (FFTW3ConfigVersion.cmake.in FFTW3${PREC_SUFFIX} ConfigVersion.cmake @ONLY)
356+ install (FILES
357+ ${CMAKE_CURRENT_BINARY_DIR} /FFTW3${PREC_SUFFIX} Config.cmake
358+ ${CMAKE_CURRENT_BINARY_DIR} /FFTW3${PREC_SUFFIX} ConfigVersion.cmake
359+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/fftw3${PREC_SUFFIX}
360+ COMPONENT Development)
361+
362+ export (TARGETS ${fftw3_lib} NAMESPACE FFTW3:: FILE ${PROJECT_BINARY_DIR} /FFTW3LibraryDepends.cmake)
363+ install (EXPORT FFTW3LibraryDepends
364+ NAMESPACE FFTW3::
365+ DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/fftw3${PREC_SUFFIX}
366+ COMPONENT Development)
367+
368+
369+ if (BUILD_TESTS)
370+
371+ set (bench bench${PREC_SUFFIX} )
372+ add_executable (${bench} ${fftw_libbench2_SOURCE} tests/bench.c tests/hook.c tests/fftw-bench.c)
373+
374+ if (ENABLE_THREADS AND NOT WITH_COMBINED_THREADS)
375+ target_link_libraries (${bench} ${fftw3_lib} _threads)
376+ else ()
377+ target_link_libraries (${bench} ${fftw3_lib} )
378+ endif ()
379+
380+ enable_testing ()
381+
382+ if (Threads_FOUND)
383+
384+ macro (fftw_add_test problem)
385+ add_test (NAME ${problem} COMMAND ${bench} -s ${problem} )
386+ endmacro ()
387+
388+ fftw_add_test (32x64)
389+ fftw_add_test (ib256)
390+
391+ endif ()
392+
393+ target_include_directories (${bench} PRIVATE "${CMAKE_CURRENT_BINARY_DIR} /${fftw3_lib} " )
394+ endif ()
395+
396+ endfunction ()
397+
398+ if (ENABLE_FLOAT)
399+ add_fftw_library (SINGLE)
400+ endif ()
401+ if (ENABLE_DOUBLE)
402+ add_fftw_library (DOUBLE)
403+ endif ()
404+ if (ENABLE_LONG_DOUBLE)
405+ add_fftw_library (LDOUBLE)
406+ endif ()
407+ if (ENABLE_QUAD_PRECISION)
408+ add_fftw_library (QUAD)
336409endif ()
337410
338411foreach (subtarget ${subtargets} )
339412 set_target_properties (${subtarget} PROPERTIES SOVERSION 3.5.7 VERSION 3)
340413 install (TARGETS ${subtarget}
341- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
342- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
414+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
415+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
343416 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} )
344417endforeach ()
345- install (TARGETS ${fftw3_lib}
346- EXPORT FFTW3LibraryDepends
347- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
348- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
349- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} )
350418
351419install (FILES api/fftw3.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
352420if (EXISTS api/fftw3.f)
353421 install (FILES api/fftw3.f DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} )
354422endif ()
355-
356- if (BUILD_TESTS)
357-
358- add_executable (bench ${fftw_libbench2_SOURCE} tests/bench.c tests/hook.c tests/fftw-bench.c)
359-
360- if (ENABLE_THREADS AND NOT WITH_COMBINED_THREADS)
361- target_link_libraries (bench ${fftw3_lib} _threads)
362- else ()
363- target_link_libraries (bench ${fftw3_lib} )
364- endif ()
365-
366-
367- enable_testing ()
368-
369- if (Threads_FOUND)
370-
371- macro (fftw_add_test problem)
372- add_test (NAME ${problem} COMMAND bench -s ${problem} )
373- endmacro ()
374-
375- fftw_add_test (32x64)
376- fftw_add_test (ib256)
377-
378- endif ()
379- endif ()
380-
381- # pkgconfig file
382- set (prefix ${CMAKE_INSTALL_PREFIX} )
383- set (exec_prefix ${CMAKE_INSTALL_PREFIX} )
384- set (libdir ${CMAKE_INSTALL_FULL_LIBDIR} )
385- set (includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR} )
386- set (VERSION ${FFTW_VERSION} )
387- configure_file (fftw.pc.in fftw${PREC_SUFFIX} .pc @ONLY)
388- install (FILES
389- ${CMAKE_CURRENT_BINARY_DIR} /fftw${PREC_SUFFIX} .pc
390- DESTINATION ${CMAKE_INSTALL_LIBDIR} /pkgconfig
391- COMPONENT Development)
392-
393- # cmake file
394- set (FFTW3_LIBRARIES "FFTW3::${fftw3_lib} " )
395- configure_file (FFTW3Config.cmake.in FFTW3${PREC_SUFFIX} Config.cmake @ONLY)
396- configure_file (FFTW3ConfigVersion.cmake.in FFTW3${PREC_SUFFIX} ConfigVersion.cmake @ONLY)
397- install (FILES
398- ${CMAKE_CURRENT_BINARY_DIR} /FFTW3${PREC_SUFFIX} Config.cmake
399- ${CMAKE_CURRENT_BINARY_DIR} /FFTW3${PREC_SUFFIX} ConfigVersion.cmake
400- DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/fftw3${PREC_SUFFIX}
401- COMPONENT Development)
402-
403- export (TARGETS ${fftw3_lib} NAMESPACE FFTW3:: FILE ${PROJECT_BINARY_DIR} /FFTW3LibraryDepends.cmake)
404- install (EXPORT FFTW3LibraryDepends
405- NAMESPACE FFTW3::
406- DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/fftw3${PREC_SUFFIX}
407- COMPONENT Development)
0 commit comments