this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #52 from madebr/cmake_install

Add cmake install + MSVC dll support

authored by

mborgerding and committed by
GitHub
15debe8e 0a70dfd0

+310 -10
+1 -1
.travis.yml
··· 3 3 python: 4 4 - "3.7" 5 5 6 - dist: bionic 6 + dist: focal 7 7 8 8 before_install: 9 9 - sudo apt-get install -y libfftw3-dev
+131 -4
CMakeLists.txt
··· 1 - cmake_minimum_required(VERSION 2.8) 2 - project(kissfft) 1 + file(READ Makefile _MAKEFILE_CONTENTS) 2 + string(REGEX MATCH "KFVER=([0-9]+)\n" KFVER_MATCH "${_MAKEFILE_CONTENTS}") 3 + if(NOT KFVER_MATCH) 4 + message(FATAL_ERROR "Cannot extract version from Makefile") 5 + endif() 6 + set(MAKEFILE_EXTRACTED_VERSION "${CMAKE_MATCH_1}") 7 + 8 + cmake_minimum_required(VERSION 3.13) 9 + project(kissfft VERSION "${MAKEFILE_EXTRACTED_VERSION}") 10 + 11 + option(KISSFFT_SIMD "Build kissfft with SIMD" OFF) 12 + option(KISSFFT_FLOAT "Build kissfft with float type" ON) 13 + option(KISSFFT_OPENMP "Build kissfft with openmp" OFF) 14 + 15 + if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|AppleClang") 16 + add_compile_options(-ffast-math -fomit-frame-pointer 17 + -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wshadow -Wwrite-strings 18 + "$<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes;-Wmissing-prototypes;-Wnested-externs;-Wbad-function-cast>") 19 + endif() 20 + 21 + set(KISSFFT_FIXED_WIDTH_VALID 16 32) 22 + set(KISSFFT_FIXED_WIDTH "16" CACHE STRING "Width of kissfft fixed integer (16/32)") 23 + set_property(CACHE KISSFFT_FIXED_WIDTH PROPERTY STRINGS ${KISSFFT_FIXED_WIDTH_VALID}) 24 + if(NOT KISSFFT_FIXED_WIDTH IN_LIST KISSFFT_FIXED_WIDTH_VALID) 25 + message(FATAL_ERROR "KISSFFT_FIXED_WIDTH must be 16 or 32") 26 + endif() 27 + 28 + set(KISSFFT_FLOAT_TYPE_VALID float double) 29 + set(KISSFFT_FLOAT_TYPE "float" CACHE STRING "Floating type of kissfft (float/double)") 30 + set_property(CACHE KISSFFT_FLOAT_TYPE PROPERTY STRINGS ${KISSFFT_FLOAT_TYPE_VALID}) 31 + if(NOT KISSFFT_FLOAT_TYPE IN_LIST KISSFFT_FLOAT_TYPE_VALID) 32 + message(FATAL_ERROR "KISSFFT_FLOAT_TYPE must be float or double") 33 + endif() 3 34 4 35 add_library(kissfft 5 36 kiss_fft.c) 6 37 7 38 target_include_directories(kissfft PUBLIC 8 - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> 9 - $<INSTALL_INTERFACE:.>) 39 + $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> 40 + $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) 41 + 42 + set(KISSFFT_COMPILE_DEFINITIONS) 43 + if(KISSFFT_SIMD) 44 + list(APPEND KISSFFT_COMPILE_DEFINITIONS USE_SIMD) 45 + set(KISSFFT_DATATYPE "simd") 46 + else() 47 + if(KISSFFT_FLOAT) 48 + list(APPEND KISSFFT_COMPILE_DEFINITIONS kiss_fft_scalar=${KISSFFT_FLOAT_TYPE}) 49 + set(KISSFFT_DATATYPE "${KISSFFT_FLOAT_TYPE}") 50 + else() 51 + list(APPEND KISSFFT_COMPILE_DEFINITIONS KISSFFT_FIXED_POINT=${KISSFFT_FIXED_WIDTH}) 52 + set(KISSFFT_DATATYPE "int${KISSFFT_FIXED_WIDTH}") 53 + endif() 54 + endif() 55 + if(KISSFFT_OPENMP) 56 + if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|AppleClang") 57 + target_compile_options(kissfft PRIVATE -fopenmp) 58 + target_link_options(kissfft PUBLIC -fopenmp) 59 + else() 60 + message(FATAL_ERROR "Don't know how to enable openmp for this compiler") 61 + endif() 62 + endif() 63 + message(STATUS "Building KissFFT with datatype=${KISSFFT_DATATYPE}") 64 + 65 + if(BUILD_SHARED_LIBS) 66 + list(APPEND KISSFFT_COMPILE_DEFINITIONS KISS_FFT_SHARED) 67 + set_target_properties(kissfft PROPERTIES 68 + C_VISIBILITY_PRESET hidden) 69 + set(KISSFFT_EXPORT_SUFFIX "-shared") 70 + else() 71 + set(KISSFFT_EXPORT_SUFFIX "-static") 72 + endif() 73 + target_compile_definitions(kissfft PUBLIC ${KISSFFT_COMPILE_DEFINITIONS}) 74 + set(KISSFFT_OUTPUT_NAME "kissfft_${KISSFFT_DATATYPE}") 75 + set_target_properties(kissfft PROPERTIES 76 + OUTPUT_NAME "${KISSFFT_OUTPUT_NAME}" 77 + DEFINE_SYMBOL KISS_FFT_BUILD 78 + EXPORT_NAME "kissfft-${KISSFFT_DATATYPE}" 79 + VERSION ${PROJECT_VERSION}) 80 + add_library(kissfft::kissfft ALIAS kissfft) 81 + add_library(kissfft::kissff-${KISSFFT_DATATYPE} ALIAS kissfft) 82 + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 83 + target_link_libraries(kissfft PRIVATE m) 84 + endif() 85 + 86 + function(add_kissfft_executable NAME) 87 + add_executable(${NAME} ${ARGN}) 88 + target_link_libraries(${NAME} PRIVATE kissfft::kissfft) 89 + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 90 + target_link_libraries(${NAME} PRIVATE m) 91 + endif() 92 + set_target_properties(${NAME} PROPERTIES 93 + OUTPUT_NAME "${NAME}_${KISSFFT_DATATYPE}") 94 + endfunction() 95 + 96 + option(KISSFFT_TOOLS "Build kissfft tools" ON) 97 + if(KISSFFT_TOOLS) 98 + add_subdirectory(tools) 99 + endif() 100 + 101 + option(KISSFFT_TEST "Build and enable kissfft tests" ON) 102 + if(KISSFFT_TEST) 103 + enable_testing() 104 + add_subdirectory(test) 105 + endif() 106 + 107 + option(KISSFFT_INSTALL "Enable kissfft install" ON) 108 + if (KISSFFT_INSTALL) 109 + include(GNUInstallDirs) 110 + install(TARGETS kissfft EXPORT kissfft 111 + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 112 + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" 113 + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") 114 + install(FILES "kiss_fft.h" "kissfft.hh" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 115 + 116 + set(KISSFFT_INSTALL_CMAKE "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" CACHE FILEPATH "Install destination of kissfft cmake modules") 117 + mark_as_advanced(KISSFFT_INSTALL_CMAKE) 118 + 119 + install(EXPORT kissfft DESTINATION "${KISSFFT_INSTALL_CMAKE}" 120 + NAMESPACE "kissfft::" 121 + FILE "${PROJECT_NAME}-${KISSFFT_DATATYPE}${KISSFFT_EXPORT_SUFFIX}-targets.cmake") 122 + include(CMakePackageConfigHelpers) 123 + configure_package_config_file(kissfft-config.cmake.in kissfft-config.cmake 124 + INSTALL_DESTINATION "${KISSFFT_INSTALL_CMAKE}") 125 + write_basic_package_version_file(kissfft-config-version.cmake COMPATIBILITY AnyNewerVersion) 126 + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kissfft-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/kissfft-config-version.cmake" 127 + DESTINATION "${KISSFFT_INSTALL_CMAKE}") 128 + 129 + set(PKG_KISSFFT_DEFS) 130 + foreach(_def ${KISSFFT_COMPILE_DEFINITIONS}) 131 + set(PKG_KISSFFT_DEFS "${PKG_KISSFFT_DEFS} -D${_def}") 132 + endforeach() 133 + configure_file(kissfft.pc.in "kissfft-${KISSFFT_DATATYPE}.pc" @ONLY) 134 + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/kissfft-${KISSFFT_DATATYPE}.pc" 135 + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 136 + endif()
+20 -5
kiss_fft.h
··· 14 14 #include <math.h> 15 15 #include <string.h> 16 16 17 + // Define KISS_FFT_SHARED macro to properly export symbols 18 + #ifdef KISS_FFT_SHARED 19 + # ifdef _WIN32 20 + # ifdef KISS_FFT_BUILD 21 + # define KISS_FFT_API __declspec(dllexport) 22 + # else 23 + # define KISS_FFT_API __declspec(dllimport) 24 + # endif 25 + # else 26 + # define KISS_FFT_API __attribute__ ((visibility ("default"))) 27 + # endif 28 + #else 29 + # define KISS_FFT_API 30 + #endif 31 + 17 32 #ifdef __cplusplus 18 33 extern "C" { 19 34 #endif ··· 99 114 * buffer size in *lenmem. 100 115 * */ 101 116 102 - kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); 117 + kiss_fft_cfg KISS_FFT_API kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); 103 118 104 119 /* 105 120 * kiss_fft(cfg,in_out_buf) ··· 111 126 * Note that each element is complex and can be accessed like 112 127 f[k].r and f[k].i 113 128 * */ 114 - void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); 129 + void KISS_FFT_API kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); 115 130 116 131 /* 117 132 A more generic version of the above function. It reads its input from every Nth sample. 118 133 * */ 119 - void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); 134 + void KISS_FFT_API kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); 120 135 121 136 /* If kiss_fft_alloc allocated a buffer, it is one contiguous 122 137 buffer and can be simply free()d when no longer needed*/ ··· 126 141 Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up 127 142 your compiler output to call this before you exit. 128 143 */ 129 - void kiss_fft_cleanup(void); 144 + void KISS_FFT_API kiss_fft_cleanup(void); 130 145 131 146 132 147 /* 133 148 * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) 134 149 */ 135 - int kiss_fft_next_fast_size(int n); 150 + int KISS_FFT_API kiss_fft_next_fast_size(int n); 136 151 137 152 /* for real ffts, we need an even size */ 138 153 #define kiss_fftr_next_fast_size_real(n) \
+82
kissfft-config.cmake.in
··· 1 + # kissfft-config.ccmake accept the following components: 2 + # 3 + # SHARED/STATIC: 4 + # This components allows one to choose a shared/static kissfft library. 5 + # The default is selected by BUILD_SHARED_LIBS. 6 + # They are to be used exclusively. Using them together is an error. 7 + # 8 + # example: 9 + # find_package(kissfft CONFIG REQUIRED COMPONENTS STATIC) 10 + # 11 + # simd/int16/int32/float/double: 12 + # This components allows one to choose the datatype. 13 + # When using this component, the target kissfft::kissfft becomes available. 14 + # When not using this component, you will have to choose the correct kissfft target. 15 + # 16 + # example: 17 + # find_package(kissfft CONFIG REQUIRED) 18 + # # - kissfft::kissfft-float, kissfft::kissfft-int32_t/ ... are available (if they are installed) 19 + # # - kissfft::kissfft is not available, 20 + # 21 + # find_package(kissfft CONFIG REQUIRED COMPONENTS int32_t) 22 + # # - kissfft::kissfft-float, kissfft::kissfft-int32_t/ ... are available (if they are installed) 23 + # # - kissfft::kissfft is available (as an alias for kissfft::kissfft-int32_t), 24 + 25 + @PACKAGE_INIT@ 26 + 27 + cmake_minimum_required(VERSION 3.3) 28 + 29 + # Set include glob of config files using SHARED/static component, BUILD_SHARED_LIBS by default 30 + set(_kissfft_shared_detected OFF) 31 + set(_kissfft_shared ${BUILD_SHARED_LIBS}) 32 + if("SHARED" IN_LIST kissfft_FIND_COMPONENTS) 33 + set(_kissfft_shared_detected ON) 34 + set(_kissfft_shared ON) 35 + endif() 36 + if("STATIC" IN_LIST kissfft_FIND_COMPONENTS) 37 + if(_kissfft_shared_detected) 38 + message(FATAL_ERROR "SHARED and STATIC components cannot be used together") 39 + endif() 40 + set(_kissfft_shared_detected ON) 41 + set(_kissfft_shared OFF) 42 + endif() 43 + 44 + if(_kissfft_shared) 45 + set(_kissfft_config_glob "kissfft-*-shared-targets.cmake") 46 + else() 47 + set(_kissfft_config_glob "kissfft-*-static-targets.cmake") 48 + endif() 49 + 50 + # Load information for all configured kissfft 51 + get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) 52 + file(GLOB CONFIG_FILES "${_DIR}/${_kissfft_config_glob}") 53 + foreach(f ${CONFIG_FILES}) 54 + include(${f}) 55 + endforeach() 56 + 57 + # If a datatype component is passed, create kissfft::kissfft 58 + set(_kissfft_datatype_detected) 59 + foreach(_kissfft_datatype simd int16 int32 float double) 60 + if(_kissfft_datatype IN_LIST kissfft_FIND_COMPONENTS) 61 + if(_kissfft_datatype_detected) 62 + message(FATAL_ERROR "Cannot define datatype COMPONENT twice: ${_kissfft_datatype_detected} and ${_kissfft_datatype}") 63 + endif() 64 + set(_kissfft_datatype_detected ${_kissfft_datatype}) 65 + endif() 66 + endforeach() 67 + 68 + if(_kissfft_datatype_detected) 69 + if(NOT TARGET kissfft::kissfft-${_kissfft_datatype_detected}) 70 + message(FATAL_ERROR "kissfft with datatype=${_kissfft_datatype_detected} is not installed") 71 + endif() 72 + if(TARGET kissfft::kissfft) 73 + message(SEND_ERROR "kissfft::kissfft already exists. You cannot use 2 find_package's with datatype that are visible to eachother.") 74 + else() 75 + add_library(kissfft::kissfft INTERFACE IMPORTED) 76 + set_property(TARGET kissfft::kissfft PROPERTY INTERFACE_LINK_LIBRARIES kissfft::kissfft-${_kissfft_datatype_detected}) 77 + endif() 78 + endif() 79 + 80 + set(kissfft_FOUND ON) 81 + set(KISSFFT_VERSION @kissfft_VERSION@) 82 +
+9
kissfft.pc.in
··· 1 + libdir=@CMAKE_INSTALL_FULL_LIBDIR@ 2 + includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ 3 + 4 + Name: kissfft 5 + Description: A Fast Fourier Transform (FFT) library that tries to Keep it Simple, Stupid 6 + Version: @kissfft_VERSION@ 7 + 8 + Libs: -L${libdir} -l@KISSFFT_OUTPUT_NAME@ 9 + Cflags: -I${includedir} @PKG_KISSFFT_DEFS@
+49
test/CMakeLists.txt
··· 1 + add_library(kissfft_help_library OBJECT 2 + pstats.c 3 + ../tools/kfc.c 4 + ../tools/kiss_fftnd.c 5 + ../tools/kiss_fftr.c 6 + ../tools/kiss_fftndr.c 7 + ) 8 + target_link_libraries(kissfft_help_library PRIVATE kissfft::kissfft) 9 + target_include_directories(kissfft_help_library PRIVATE ../tools) 10 + 11 + function(add_kissfft_test_executable NAME) 12 + add_kissfft_executable(${NAME} ${ARGN} $<TARGET_OBJECTS:kissfft_help_library>) 13 + target_include_directories(${NAME} PRIVATE ../tools) 14 + add_test(NAME ${NAME} COMMAND ${NAME}) 15 + set_tests_properties(${NAME} PROPERTIES TIMEOUT 10) 16 + endfunction() 17 + 18 + set(KISSFFT_TEST_NUMFFTS 10000) 19 + 20 + add_kissfft_test_executable(bm_kiss benchkiss.c) 21 + # add_test(NAME benchmar COMMAND ${NAME}) 22 + # set_tests_properties(${NAME} PROPERTIES TIMEOUT 10) 23 + 24 + include(FindPkgConfig) 25 + if(KISSFFT_FLOAT) 26 + set(fftw3_pkg fftw3f) 27 + else() 28 + set(fftw3_pkg fftw3) 29 + endif() 30 + pkg_check_modules(fftw3 REQUIRED IMPORTED_TARGET ${fftw3_pkg}) 31 + add_kissfft_test_executable(bm_fftw benchfftw.c) 32 + target_link_libraries(bm_fftw PRIVATE PkgConfig::fftw3) 33 + 34 + add_kissfft_test_executable(st twotonetest.c) 35 + 36 + add_kissfft_test_executable(tkfc twotonetest.c) 37 + target_compile_definitions(tkfc PRIVATE KFC_TEST) 38 + 39 + add_kissfft_test_executable(ffr twotonetest.c) 40 + add_kissfft_test_executable(tr test_real.c) 41 + 42 + add_kissfft_test_executable(testcpp testcpp.cc) 43 + 44 + find_package(PythonInterp REQUIRED) 45 + add_test(NAME testkiss.py COMMAND "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/testkiss.py") 46 + set_tests_properties(testkiss.py PROPERTIES 47 + TIMEOUT 20 48 + ENVIRONMENT "DATATYPE=${KISSFFT_DATATYPE}" 49 + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
+18
tools/CMakeLists.txt
··· 1 + add_kissfft_executable(fastconvr kiss_fastfir.c kiss_fftr.c) 2 + target_compile_definitions(fastconvr PRIVATE REAL_FASTFIR FAST_FILT_UTIL) 3 + 4 + add_kissfft_executable(fastconv kiss_fastfir.c) 5 + target_compile_definitions(fastconv PRIVATE FAST_FILT_UTIL) 6 + 7 + add_kissfft_executable(fft fftutil.c kiss_fftnd.c kiss_fftr.c kiss_fftndr.c) 8 + 9 + # psdpng does not build with "simd" datatype 10 + if(NOT KISSFFT_DATATYPE MATCHES "simd") 11 + include(FindPkgConfig) 12 + pkg_check_modules(libpng REQUIRED IMPORTED_TARGET libpng) 13 + add_kissfft_executable(psdpng psdpng.c kiss_fftr.c) 14 + target_link_libraries(psdpng PRIVATE PkgConfig::libpng) 15 + endif() 16 + 17 + #FIXME: dumphdr.c is not available 18 + #add_kissfft_executable(dumphdr dumphdr.c)