Skip to content

Commit a2a0a78

Browse files
committed
CMakeLists.txt: Support multi-precision builds
1 parent 632233e commit a2a0a78

File tree

1 file changed

+134
-107
lines changed

1 file changed

+134
-107
lines changed

CMakeLists.txt

Lines changed: 134 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ option (ENABLE_OPENMP "Use OpenMP for multithreading" OFF)
1717
option (ENABLE_THREADS "Use pthread for multithreading" OFF)
1818
option (WITH_COMBINED_THREADS "Merge thread library" OFF)
1919

20-
option (ENABLE_FLOAT "single-precision" OFF)
21-
option (ENABLE_LONG_DOUBLE "long-double precision" OFF)
22-
option (ENABLE_QUAD_PRECISION "quadruple-precision" OFF)
20+
option (ENABLE_FLOAT "Build the single precision library" OFF)
21+
option (ENABLE_DOUBLE "Build the double precision library" ON)
22+
option (ENABLE_LONG_DOUBLE "Build the long double precision library" OFF)
23+
option (ENABLE_QUAD_PRECISION "Build the quadruple precision library" OFF)
2324

2425
option (ENABLE_SSE "Compile with SSE instruction set support" OFF)
2526
option (ENABLE_SSE2 "Compile with SSE2 instruction set support" OFF)
@@ -299,92 +300,132 @@ endif ()
299300

300301
set (FFTW_VERSION 3.3.10)
301302

302-
set (PREC_SUFFIX)
303-
if (ENABLE_FLOAT)
304-
set (FFTW_SINGLE TRUE)
305-
set (BENCHFFT_SINGLE TRUE)
306-
set (PREC_SUFFIX f)
307-
endif ()
303+
set (PRECISIONS SINGLE DOUBLE LDOUBLE QUAD)
304+
foreach (PRECISION ${PRECISIONS})
305+
# Initialize all parameters to false:
306+
foreach (TMPPRECISION ${PRECISIONS})
307+
set (FFTW_${TMPPRECISION} FALSE)
308+
set (BENCHFFT_${TMPPRECISION} FALSE)
309+
endforeach ()
308310

309-
if (ENABLE_LONG_DOUBLE)
310-
set (FFTW_LDOUBLE TRUE)
311-
set (BENCHFFT_LDOUBLE TRUE)
312-
set (PREC_SUFFIX l)
313-
endif ()
311+
if ("${PRECISION}" STREQUAL "SINGLE")
312+
if (NOT "${ENABLE_FLOAT}")
313+
continue ()
314+
endif()
315+
set (PREC_SUFFIX f)
316+
elseif ("${PRECISION}" STREQUAL "DOUBLE")
317+
if (NOT "${ENABLE_DOUBLE}")
318+
continue ()
319+
endif()
320+
set (PREC_SUFFIX)
321+
elseif ("${PRECISION}" STREQUAL "LDOUBLE")
322+
if (NOT "${ENABLE_LONG_DOUBLE}")
323+
continue ()
324+
endif()
325+
set (PREC_SUFFIX l)
326+
elseif ("${PRECISION}" STREQUAL "QUAD")
327+
if (NOT "${ENABLE_QUAD_PRECISION}")
328+
continue ()
329+
endif()
330+
set (PREC_SUFFIX q)
331+
endif ()
314332

315-
if (ENABLE_QUAD_PRECISION)
316-
set (FFTW_QUAD TRUE)
317-
set (BENCHFFT_QUAD TRUE)
318-
set (PREC_SUFFIX q)
319-
endif ()
320-
set (fftw3_lib fftw3${PREC_SUFFIX})
333+
# Enable only one precision per iteration:
334+
set (FFTW_${PRECISION} TRUE)
335+
set (BENCHFFT_${PRECISION} TRUE)
321336

322-
configure_file (cmake.config.h.in config.h @ONLY)
323-
include_directories (${CMAKE_CURRENT_BINARY_DIR})
324337

325-
if (BUILD_SHARED_LIBS)
326-
add_definitions (-DFFTW_DLL)
327-
endif ()
328338

329-
add_library (${fftw3_lib} ${SOURCEFILES})
330-
target_include_directories (${fftw3_lib} INTERFACE $<INSTALL_INTERFACE:include>)
331-
if (MSVC AND NOT (CMAKE_C_COMPILER_ID STREQUAL "Intel"))
332-
target_compile_definitions (${fftw3_lib} PRIVATE /bigobj)
333-
endif ()
334-
if (HAVE_SSE)
335-
target_compile_options (${fftw3_lib} PRIVATE ${SSE_FLAG})
336-
endif ()
337-
if (HAVE_SSE2)
338-
target_compile_options (${fftw3_lib} PRIVATE ${SSE2_FLAG})
339-
endif ()
340-
if (HAVE_AVX)
341-
target_compile_options (${fftw3_lib} PRIVATE ${AVX_FLAG})
342-
endif ()
343-
if (HAVE_AVX2)
344-
target_compile_options (${fftw3_lib} PRIVATE ${AVX2_FLAG})
345-
endif ()
346-
if (HAVE_FMA)
347-
target_compile_options (${fftw3_lib} PRIVATE ${FMA_FLAG})
348-
endif ()
349-
if (HAVE_LIBM)
350-
target_link_libraries (${fftw3_lib} m)
351-
endif ()
339+
set (fftw3_lib fftw3${PREC_SUFFIX})
340+
add_library (${fftw3_lib} ${SOURCEFILES})
341+
list (APPEND FFTW3_LIBRARIES "${fftw3_lib}")
352342

353-
set (subtargets ${fftw3_lib})
343+
configure_file (cmake.config.h.in "${PRECISION}/config.h" @ONLY)
344+
target_include_directories (${fftw3_lib} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${PRECISION}")
354345

355-
if (Threads_FOUND)
356-
if (WITH_COMBINED_THREADS)
357-
target_link_libraries (${fftw3_lib} ${CMAKE_THREAD_LIBS_INIT})
358-
else ()
359-
add_library (${fftw3_lib}_threads ${fftw_threads_SOURCE})
360-
target_include_directories (${fftw3_lib}_threads INTERFACE $<INSTALL_INTERFACE:include>)
361-
target_link_libraries (${fftw3_lib}_threads ${fftw3_lib})
362-
target_link_libraries (${fftw3_lib}_threads ${CMAKE_THREAD_LIBS_INIT})
363-
list (APPEND subtargets ${fftw3_lib}_threads)
346+
target_include_directories (${fftw3_lib} INTERFACE $<INSTALL_INTERFACE:include>)
347+
348+
if (BUILD_SHARED_LIBS)
349+
target_compile_definitions (${fftw3_lib} PRIVATE -DFFTW_DLL)
364350
endif ()
365-
endif ()
366351

367-
if (OPENMP_FOUND)
368-
add_library (${fftw3_lib}_omp ${fftw_omp_SOURCE})
369-
target_include_directories (${fftw3_lib}_omp INTERFACE $<INSTALL_INTERFACE:include>)
370-
target_link_libraries (${fftw3_lib}_omp ${fftw3_lib})
371-
target_link_libraries (${fftw3_lib}_omp ${CMAKE_THREAD_LIBS_INIT})
372-
list (APPEND subtargets ${fftw3_lib}_omp)
373-
target_compile_options (${fftw3_lib}_omp PRIVATE ${OpenMP_C_FLAGS})
374-
endif ()
352+
if (MSVC AND NOT (CMAKE_C_COMPILER_ID STREQUAL "Intel"))
353+
target_compile_definitions (${fftw3_lib} PRIVATE /bigobj)
354+
endif ()
355+
if (HAVE_SSE)
356+
target_compile_options (${fftw3_lib} PRIVATE ${SSE_FLAG})
357+
endif ()
358+
if (HAVE_SSE2)
359+
target_compile_options (${fftw3_lib} PRIVATE ${SSE2_FLAG})
360+
endif ()
361+
if (HAVE_AVX)
362+
target_compile_options (${fftw3_lib} PRIVATE ${AVX_FLAG})
363+
endif ()
364+
if (HAVE_AVX2)
365+
target_compile_options (${fftw3_lib} PRIVATE ${AVX2_FLAG})
366+
endif ()
367+
if (HAVE_FMA)
368+
target_compile_options (${fftw3_lib} PRIVATE ${FMA_FLAG})
369+
endif ()
370+
if (HAVE_LIBM)
371+
target_link_libraries (${fftw3_lib} m)
372+
endif ()
373+
374+
set (subtargets ${fftw3_lib})
375+
376+
if (Threads_FOUND)
377+
if (WITH_COMBINED_THREADS)
378+
target_link_libraries (${fftw3_lib} ${CMAKE_THREAD_LIBS_INIT})
379+
else ()
380+
add_library (${fftw3_lib}_threads ${fftw_threads_SOURCE})
381+
target_include_directories (${fftw3_lib}_threads PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${PRECISION}")
382+
target_include_directories (${fftw3_lib}_threads INTERFACE $<INSTALL_INTERFACE:include>)
383+
target_link_libraries (${fftw3_lib}_threads ${fftw3_lib})
384+
target_link_libraries (${fftw3_lib}_threads ${CMAKE_THREAD_LIBS_INIT})
385+
list (APPEND subtargets ${fftw3_lib}_threads)
386+
endif ()
387+
endif ()
388+
389+
if (OPENMP_FOUND)
390+
add_library (${fftw3_lib}_omp ${fftw_omp_SOURCE})
391+
target_include_directories (${fftw3_lib}_omp PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${PRECISION}")
392+
target_include_directories (${fftw3_lib}_omp INTERFACE $<INSTALL_INTERFACE:include>)
393+
target_link_libraries (${fftw3_lib}_omp ${fftw3_lib})
394+
target_link_libraries (${fftw3_lib}_omp ${CMAKE_THREAD_LIBS_INIT})
395+
list (APPEND subtargets ${fftw3_lib}_omp)
396+
target_compile_options (${fftw3_lib}_omp PRIVATE ${OpenMP_C_FLAGS})
397+
endif ()
398+
399+
foreach(subtarget ${subtargets})
400+
set_target_properties (${subtarget} PROPERTIES SOVERSION 3.6.9 VERSION 3)
401+
install (TARGETS ${subtarget}
402+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
403+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
404+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
405+
endforeach ()
406+
407+
if (BUILD_TESTS)
408+
add_executable (bench${PREC_SUFFIX} ${fftw_libbench2_SOURCE} tests/bench.c tests/hook.c tests/fftw-bench.c)
409+
target_include_directories (bench${PREC_SUFFIX} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${PRECISION}")
410+
411+
if (ENABLE_THREADS AND NOT WITH_COMBINED_THREADS)
412+
target_link_libraries (bench${PREC_SUFFIX} ${fftw3_lib}_threads)
413+
else ()
414+
target_link_libraries (bench${PREC_SUFFIX} ${fftw3_lib})
415+
endif ()
375416

376-
foreach(subtarget ${subtargets})
377-
set_target_properties (${subtarget} PROPERTIES SOVERSION 3.6.9 VERSION 3)
378-
install (TARGETS ${subtarget}
379-
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
380-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
381-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
417+
enable_testing ()
418+
419+
if (Threads_FOUND)
420+
macro (fftw_add_test problem)
421+
add_test (NAME ${problem}${PREC_SUFFIX} COMMAND bench${PREC_SUFFIX} -s ${problem})
422+
endmacro ()
423+
424+
fftw_add_test (32x64)
425+
fftw_add_test (ib256)
426+
endif ()
427+
endif ()
382428
endforeach ()
383-
install(TARGETS ${fftw3_lib}
384-
EXPORT FFTW3LibraryDepends
385-
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
386-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
387-
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
388429

389430
install (FILES api/fftw3.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
390431
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/api/fftw3.f)
@@ -398,26 +439,11 @@ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/api/fftw3.f03.in)
398439
install (FILES ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
399440
endif ()
400441

401-
if (BUILD_TESTS)
402-
add_executable (bench ${fftw_libbench2_SOURCE} tests/bench.c tests/hook.c tests/fftw-bench.c)
403-
404-
if (ENABLE_THREADS AND NOT WITH_COMBINED_THREADS)
405-
target_link_libraries (bench ${fftw3_lib}_threads)
406-
else ()
407-
target_link_libraries (bench ${fftw3_lib})
408-
endif ()
409-
410-
enable_testing ()
411-
412-
if (Threads_FOUND)
413-
macro (fftw_add_test problem)
414-
add_test (NAME ${problem} COMMAND bench -s ${problem})
415-
endmacro ()
416-
417-
fftw_add_test (32x64)
418-
fftw_add_test (ib256)
419-
endif ()
420-
endif ()
442+
install(TARGETS ${FFTW3_LIBRARIES}
443+
EXPORT FFTW3LibraryDepends
444+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
445+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
446+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
421447

422448
# pkgconfig file
423449
set (prefix ${CMAKE_INSTALL_PREFIX})
@@ -431,18 +457,19 @@ install (FILES
431457
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
432458
COMPONENT Development)
433459

434-
# cmake file
435-
set (FFTW3_LIBRARIES "FFTW3::${fftw3_lib}")
436-
configure_file (FFTW3Config.cmake.in FFTW3${PREC_SUFFIX}Config.cmake @ONLY)
437-
configure_file (FFTW3ConfigVersion.cmake.in FFTW3${PREC_SUFFIX}ConfigVersion.cmake @ONLY)
460+
# cmake configuration file
461+
configure_file (FFTW3Config.cmake.in FFTW3Config.cmake @ONLY)
462+
configure_file (FFTW3ConfigVersion.cmake.in FFTW3ConfigVersion.cmake @ONLY)
438463
install (FILES
439-
${CMAKE_CURRENT_BINARY_DIR}/FFTW3${PREC_SUFFIX}Config.cmake
440-
${CMAKE_CURRENT_BINARY_DIR}/FFTW3${PREC_SUFFIX}ConfigVersion.cmake
441-
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fftw3${PREC_SUFFIX}
464+
"${CMAKE_CURRENT_BINARY_DIR}/FFTW3Config.cmake"
465+
"${CMAKE_CURRENT_BINARY_DIR}/FFTW3ConfigVersion.cmake"
466+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/fftw3"
442467
COMPONENT Development)
443468

444-
export (TARGETS ${fftw3_lib} NAMESPACE FFTW3:: FILE ${PROJECT_BINARY_DIR}/FFTW3LibraryDepends.cmake)
469+
export (TARGETS ${FFTW3_LIBRARIES}
470+
NAMESPACE FFTW3::
471+
FILE "${PROJECT_BINARY_DIR}/FFTW3LibraryDepends.cmake")
445472
install(EXPORT FFTW3LibraryDepends
446473
NAMESPACE FFTW3::
447-
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fftw3${PREC_SUFFIX}
474+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/fftw3"
448475
COMPONENT Development)

0 commit comments

Comments
 (0)