Skip to content

Commit bfe4993

Browse files
authored
Merge pull request #1 from lukas-w/hunter-v3.3.7
CMake: Support building more than one precision
2 parents b5ccc55 + ac2ad83 commit bfe4993

File tree

1 file changed

+135
-120
lines changed

1 file changed

+135
-120
lines changed

CMakeLists.txt

Lines changed: 135 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required (VERSION 3.0)
1+
cmake_minimum_required (VERSION 3.1)
22

33
if (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)
1818
option (WITH_COMBINED_THREADS "Merge thread library" OFF)
1919

2020
option (ENABLE_FLOAT "single-precision" OFF)
21+
option (ENABLE_DOUBLE "double-precision" ON)
2122
option (ENABLE_LONG_DOUBLE "long-double precision" OFF)
2223
option (ENABLE_QUAD_PRECISION "quadruple-precision" OFF)
2324

@@ -263,145 +264,159 @@ endif ()
263264

264265
set (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)
271269
endif ()
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)
336409
endif ()
337410

338411
foreach(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})
344417
endforeach ()
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

351419
install (FILES api/fftw3.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
352420
if (EXISTS api/fftw3.f)
353421
install (FILES api/fftw3.f DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
354422
endif ()
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

Comments
 (0)