Build tools + tests with cmake + add VERSION + parallel install

This commit is contained in:
Anonymous Maarten 2020-10-30 02:26:37 +01:00
parent 609845bc9e
commit a63dfc7f11
6 changed files with 148 additions and 21 deletions

View File

@ -3,7 +3,7 @@ language: python
python: python:
- "3.7" - "3.7"
dist: bionic dist: focal
before_install: before_install:
- sudo apt-get install -y libfftw3-dev - sudo apt-get install -y libfftw3-dev

View File

@ -5,11 +5,19 @@ if(NOT KFVER_MATCH)
endif() endif()
set(MAKEFILE_EXTRACTED_VERSION "${CMAKE_MATCH_1}") 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}") 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_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_VALID 16 32)
set(KISSFFT_FIXED_WIDTH "16" CACHE STRING "Width of kissfft fixed integer (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
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
$<INSTALL_INTERFACE:.>) $<INSTALL_INTERFACE:.>)
set(KISSFFT_SUFFIX) set(KISSFFT_COMPILE_DEFINITIONS)
if(KISSFFT_SIMD) if(KISSFFT_SIMD)
target_compile_definitions(kissfft PUBLIC USE_SIMD) list(APPEND KISSFFT_COMPILE_DEFINITIONS USE_SIMD)
set(KISSFFT_SUFFIX "${KISSFFT_SUFFIX}_simd") set(KISSFFT_DATATYPE "simd")
endif()
if(KISSFFT_FLOAT)
target_compile_definitions(kissfft PUBLIC kiss_fft_scalar=${KISSFFT_FLOAT_TYPE})
set(KISSFFT_SUFFIX "${KISSFFT_SUFFIX}_${KISSFFT_FLOAT_TYPE}")
else() else()
target_compile_definitions(kissfft PUBLIC KISSFFT_FIXED_POINT=${KISSFFT_FIXED_WIDTH}) if(KISSFFT_FLOAT)
set(KISSFFT_SUFFIX "${KISSFFT_SUFFIX}_int${KISSFFT_FIXED_WIDTH}") 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() endif()
set_target_properties(kissfft PROPERTIES set(KISSFFT_EXPORT_SUFFIX "")
OUTPUT_NAME "kissfft${KISSFFT_SUFFIX}"
DEFINE_SYMBOL KISS_FFT_BUILD
EXPORT_NAME "kissfit${KISSFFT_SUFFIX}"
SOVERSION ${PROJECT_VERSION})
if(BUILD_SHARED_LIBS) 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 set_target_properties(kissfft PROPERTIES
C_VISIBILITY_PRESET hidden) C_VISIBILITY_PRESET hidden)
set(KISSFFT_EXPORT_SUFFIX "-shared")
endif() 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) option(KISSFFT_INSTALL "Enable kissfft install" ON)
if (KISSFFT_INSTALL) if (KISSFFT_INSTALL)
@ -64,18 +107,26 @@ if (KISSFFT_INSTALL)
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") 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") set(KISSFFT_INSTALL_CMAKE "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" CACHE FILEPATH "Install destination of kissfft cmake modules")
mark_as_advanced(KISSFFT_INSTALL_CMAKE) mark_as_advanced(KISSFFT_INSTALL_CMAKE)
install(EXPORT kissfft DESTINATION "${KISSFFT_INSTALL_CMAKE}" install(EXPORT kissfft DESTINATION "${KISSFFT_INSTALL_CMAKE}"
NAMESPACE "kissfft::" NAMESPACE "kissfft::"
FILE "${PROJECT_NAME}${KISSFFT_SUFFIX}-targets.cmake") FILE "${PROJECT_NAME}-${KISSFFT_DATATYPE}${KISSFFT_EXPORT_SUFFIX}-targets.cmake")
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
configure_package_config_file(kissfft-config.cmake.in kissfft-config.cmake configure_package_config_file(kissfft-config.cmake.in kissfft-config.cmake
INSTALL_DESTINATION "${KISSFFT_INSTALL_CMAKE}") INSTALL_DESTINATION "${KISSFFT_INSTALL_CMAKE}")
write_basic_package_version_file(kissfft-config-version.cmake COMPATIBILITY AnyNewerVersion) 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" install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kissfft-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/kissfft-config-version.cmake"
DESTINATION "${KISSFFT_INSTALL_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() endif()

View File

@ -2,7 +2,7 @@
# Load information for all configured kissfft # Load information for all configured kissfft
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) 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}) foreach(f ${CONFIG_FILES})
include(${f}) include(${f})
endforeach() endforeach()

9
kissfft.pc.in Normal file
View File

@ -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@

49
test/CMakeLists.txt Normal file
View File

@ -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_OBJECTS:kissfft_help_library>)
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}")

18
tools/CMakeLists.txt Normal file
View File

@ -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)