From a63dfc7f11fd58ad611fb5678eadfeec31b930e0 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 30 Oct 2020 02:26:37 +0100 Subject: [PATCH] Build tools + tests with cmake + add VERSION + parallel install --- .travis.yml | 2 +- CMakeLists.txt | 89 ++++++++++++++++++++++++++++++++--------- kissfft-config.cmake.in | 2 +- kissfft.pc.in | 9 +++++ test/CMakeLists.txt | 49 +++++++++++++++++++++++ tools/CMakeLists.txt | 18 +++++++++ 6 files changed, 148 insertions(+), 21 deletions(-) create mode 100644 kissfft.pc.in create mode 100644 test/CMakeLists.txt create mode 100644 tools/CMakeLists.txt diff --git a/.travis.yml b/.travis.yml index 39fced1..1e231e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ language: python python: - "3.7" -dist: bionic +dist: focal before_install: - sudo apt-get install -y libfftw3-dev diff --git a/CMakeLists.txt b/CMakeLists.txt index 3629c03..3a11494 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,11 +5,19 @@ if(NOT KFVER_MATCH) endif() set(MAKEFILE_EXTRACTED_VERSION "${CMAKE_MATCH_1}") -cmake_minimum_required(VERSION 3.3) +cmake_minimum_required(VERSION 3.13) project(kissfft VERSION "${MAKEFILE_EXTRACTED_VERSION}") -option(KISSFFT_SIMD "Build kissfft with SIMD") +option(KISSFFT_SIMD "Build kissfft with SIMD" OFF) option(KISSFFT_FLOAT "Build kissfft with float type" ON) +option(KISSFFT_OPENMP "Build kissfft with openmp" OFF) + +if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|AppleClang") + add_compile_options(-ffast-math -fomit-frame-pointer + -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Waggregate-return + -Wcast-align -Wcast-qual -Wnested-externs -Wshadow -Wbad-function-cast + -Wwrite-strings) +endif() set(KISSFFT_FIXED_WIDTH_VALID 16 32) set(KISSFFT_FIXED_WIDTH "16" CACHE STRING "Width of kissfft fixed integer (16/32)") @@ -33,29 +41,64 @@ target_include_directories(kissfft PUBLIC $ $) -set(KISSFFT_SUFFIX) +set(KISSFFT_COMPILE_DEFINITIONS) if(KISSFFT_SIMD) - target_compile_definitions(kissfft PUBLIC USE_SIMD) - set(KISSFFT_SUFFIX "${KISSFFT_SUFFIX}_simd") -endif() -if(KISSFFT_FLOAT) - target_compile_definitions(kissfft PUBLIC kiss_fft_scalar=${KISSFFT_FLOAT_TYPE}) - set(KISSFFT_SUFFIX "${KISSFFT_SUFFIX}_${KISSFFT_FLOAT_TYPE}") + list(APPEND KISSFFT_COMPILE_DEFINITIONS USE_SIMD) + set(KISSFFT_DATATYPE "simd") else() - target_compile_definitions(kissfft PUBLIC KISSFFT_FIXED_POINT=${KISSFFT_FIXED_WIDTH}) - set(KISSFFT_SUFFIX "${KISSFFT_SUFFIX}_int${KISSFFT_FIXED_WIDTH}") + if(KISSFFT_FLOAT) + list(APPEND KISSFFT_COMPILE_DEFINITIONS kiss_fft_scalar=${KISSFFT_FLOAT_TYPE}) + set(KISSFFT_DATATYPE "${KISSFFT_FLOAT_TYPE}") + else() + list(APPEND KISSFFT_COMPILE_DEFINITIONS KISSFFT_FIXED_POINT=${KISSFFT_FIXED_WIDTH}) + set(KISSFFT_DATATYPE "int${KISSFFT_FIXED_WIDTH}_t") + endif() +endif() +if(KISSFFT_OPENMP) + if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|AppleClang") + target_compile_options(kissfft PRIVATE -fopenmp) + target_link_options(kissfft PUBLIC -fopenmp) + else() + message(FATAL_ERROR "Don't know how to enable openmp for this compiler") + endif() endif() -set_target_properties(kissfft PROPERTIES - OUTPUT_NAME "kissfft${KISSFFT_SUFFIX}" - DEFINE_SYMBOL KISS_FFT_BUILD - EXPORT_NAME "kissfit${KISSFFT_SUFFIX}" - SOVERSION ${PROJECT_VERSION}) +set(KISSFFT_EXPORT_SUFFIX "") if(BUILD_SHARED_LIBS) - target_compile_definitions(kissfft PUBLIC KISS_FFT_SHARED) + list(APPEND KISSFFT_COMPILE_DEFINITIONS KISS_FFT_SHARED) set_target_properties(kissfft PROPERTIES C_VISIBILITY_PRESET hidden) + set(KISSFFT_EXPORT_SUFFIX "-shared") endif() +target_compile_definitions(kissfft PUBLIC ${KISSFFT_COMPILE_DEFINITIONS}) +set(KISSFFT_OUTPUT_NAME "kissfft_${KISSFFT_DATATYPE}") +set_target_properties(kissfft PROPERTIES + OUTPUT_NAME "${KISSFFT_OUTPUT_NAME}" + DEFINE_SYMBOL KISS_FFT_BUILD + EXPORT_NAME "kissfit_${KISSFFT_DATATYPE}${KISSFFT_EXPORT_SUFFIX}" + VERSION ${PROJECT_VERSION}) + +function(add_kissfft_executable NAME) + add_executable(${NAME} ${ARGN}) + target_link_libraries(${NAME} PRIVATE kissfft::kissfft) + set_target_properties(${NAME} PROPERTIES + OUTPUT_NAME "${NAME}_${KISSFFT_DATATYPE}") + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + target_link_libraries(${NAME} PRIVATE m) + endif() +endfunction() + +option(KISSFFT_TOOLS "Build kissfft tools" ON) +if(KISSFFT_TOOLS) + add_subdirectory(tools) +endif() + +option(KISSFFT_TEST "Build and enable kissfft tests" ON) +if(KISSFFT_TEST) + enable_testing() + add_subdirectory(test) +endif() + option(KISSFFT_INSTALL "Enable kissfft install" ON) if (KISSFFT_INSTALL) @@ -64,18 +107,26 @@ if (KISSFFT_INSTALL) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") - install(FILES "kiss_fft.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + install(FILES "kiss_fft.h" "kissfft.hh" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") set(KISSFFT_INSTALL_CMAKE "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" CACHE FILEPATH "Install destination of kissfft cmake modules") mark_as_advanced(KISSFFT_INSTALL_CMAKE) install(EXPORT kissfft DESTINATION "${KISSFFT_INSTALL_CMAKE}" NAMESPACE "kissfft::" - FILE "${PROJECT_NAME}${KISSFFT_SUFFIX}-targets.cmake") + FILE "${PROJECT_NAME}-${KISSFFT_DATATYPE}${KISSFFT_EXPORT_SUFFIX}-targets.cmake") include(CMakePackageConfigHelpers) configure_package_config_file(kissfft-config.cmake.in kissfft-config.cmake INSTALL_DESTINATION "${KISSFFT_INSTALL_CMAKE}") write_basic_package_version_file(kissfft-config-version.cmake COMPATIBILITY AnyNewerVersion) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kissfft-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/kissfft-config-version.cmake" DESTINATION "${KISSFFT_INSTALL_CMAKE}") + + set(PKG_KISSFFT_DEFS) + foreach(_def ${KISSFFT_COMPILE_DEFINITIONS}) + set(PKG_KISSFFT_DEFS "${PKG_KISSFFT_DEFS} -D${_def}") + endforeach() + configure_file(kissfft.pc.in "kissfft-${KISSFFT_DATATYPE}.pc" @ONLY) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kissfft-${KISSFFT_DATATYPE}.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") endif() diff --git a/kissfft-config.cmake.in b/kissfft-config.cmake.in index 8522c1d..5076e5d 100644 --- a/kissfft-config.cmake.in +++ b/kissfft-config.cmake.in @@ -2,7 +2,7 @@ # Load information for all configured kissfft get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -file(GLOB CONFIG_FILES "${_DIR}/kissfft*-targets.cmake") +file(GLOB CONFIG_FILES "${_DIR}/kissfft-*-targets.cmake") foreach(f ${CONFIG_FILES}) include(${f}) endforeach() diff --git a/kissfft.pc.in b/kissfft.pc.in new file mode 100644 index 0000000..0de9c3a --- /dev/null +++ b/kissfft.pc.in @@ -0,0 +1,9 @@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ + +Name: kissfft +Description: A Fast Fourier Transform (FFT) library that tries to Keep it Simple, Stupid +Version: @kissfft_VERSION@ + +Libs: -L${libdir} -l@KISSFFT_OUTPUT_NAME@ +Cflags: -I${includedir} @PKG_KISSFFT_DEFS@ \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..5655e01 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,49 @@ +add_library(kissfft_help_library OBJECT + pstats.c + ../tools/kfc.c + ../tools/kiss_fftnd.c + ../tools/kiss_fftr.c + ../tools/kiss_fftndr.c +) +target_link_libraries(kissfft_help_library PRIVATE kissfft::kissfft) +target_include_directories(kissfft_help_library PRIVATE ../tools) + +function(add_kissfft_test_executable NAME) + add_kissfft_executable(${NAME} ${ARGN} $) + target_include_directories(${NAME} PRIVATE ../tools) + add_test(NAME ${NAME} COMMAND ${NAME}) + set_tests_properties(${NAME} PROPERTIES TIMEOUT 10) +endfunction() + +set(KISSFFT_TEST_NUMFFTS 10000) + +add_kissfft_test_executable(bm_kiss benchkiss.c) +# add_test(NAME benchmar COMMAND ${NAME}) +# set_tests_properties(${NAME} PROPERTIES TIMEOUT 10) + +include(FindPkgConfig) +if(KISSFFT_FLOAT) + set(fftw3_pkg fftw3f) +else() + set(fftw3_pkg fftw3) +endif() +pkg_check_modules(fftw3 REQUIRED IMPORTED_TARGET ${fftw3_pkg}) +add_kissfft_test_executable(bm_fftw benchfftw.c) +target_link_libraries(bm_fftw PRIVATE PkgConfig::fftw3) + +add_kissfft_test_executable(st twotonetest.c) + +add_kissfft_test_executable(tkfc twotonetest.c) +target_compile_definitions(tkfc PRIVATE KFC_TEST) + +add_kissfft_test_executable(ffr twotonetest.c) +add_kissfft_test_executable(tr test_real.c) + +add_kissfft_test_executable(testcpp testcpp.cc) + +find_package(PythonInterp REQUIRED) +add_test(NAME testkiss.py COMMAND "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/testkiss.py") +set_tests_properties(testkiss.py PROPERTIES + TIMEOUT 20 + ENVIRONMENT "DATATYPE=${KISSFFT_DATATYPE}" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000..e0bf7f5 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,18 @@ +add_kissfft_executable(fastconvr kiss_fastfir.c kiss_fftr.c) +target_compile_definitions(fastconvr PRIVATE REAL_FASTFIR FAST_FILT_UTIL) + +add_kissfft_executable(fastconv kiss_fastfir.c) +target_compile_definitions(fastconv PRIVATE FAST_FILT_UTIL) + +add_kissfft_executable(fft fftutil.c kiss_fftnd.c kiss_fftr.c kiss_fftndr.c) + +# psdpng does not build with "simd" datatype +if(NOT KISSFFT_DATATYPE MATCHES "simd") + include(FindPkgConfig) + pkg_check_modules(libpng REQUIRED IMPORTED_TARGET libpng) + add_kissfft_executable(psdpng psdpng.c kiss_fftr.c) + target_link_libraries(psdpng PRIVATE PkgConfig::libpng) +endif() + +#dumphdr.c is not available +#add_kissfft_executable(dumphdr dumphdr.c)