diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..c265a8c2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,172 @@ +cmake_minimum_required(VERSION 3.15 FATAL_ERROR) +project(rubberband VERSION 2.1.1) + +option(RUBBERBAND_EXAMPLE "Build the Rubberband example app" OFF) + +### Dependencies ### +find_package(Threads REQUIRED) + +# FFTW3 +find_path(FFTW3_INCLUDEDIR fftw3.h) +find_library(FFTW3_LIBRARY fftw3) + +# libsamplerate +if(NOT TARGET samplerate) + find_path(SAMPLERATE_INCLUDEDIR samplerate.h) + find_library(SAMPLERATE_LIBRARY samplerate) +endif() + +# Accelerate framework +if(APPLE) + find_library(ACCELERATE_FRAMEWORK NAMES Accelerate) +endif() + +### Create our target ### +add_library(rubberband) + +### Handle general flags, include paths, etc ### +target_compile_options(rubberband + PRIVATE + $<$:-mmacosx-version-min=10.11> + $<$>,$>:-ffast-math -O3 -ftree-vectorize> +) + +target_compile_definitions(rubberband + PRIVATE + $<$:USE_PTHREADS> + $<$:HAVE_VDSP> + $<$>:__MSVC__ WIN32 _LIB NOMINMAX _USE_MATH_DEFINES USE_KISSFFT USE_SPEEX> + $<$,$>:NDEBUG> + $<$,$>:_DEBUG NO_TIMING NO_THREAD_CHECKS> + MALLOC_IS_ALIGNED + NO_THREAD_CHECKS + NO_TIMING +) + +target_include_directories(rubberband + PUBLIC + $ + $ + PRIVATE + $ + $ +) + +target_link_libraries(rubberband + PRIVATE + Threads::Threads +) + +# Handle FFT library +if(FFTW3_INCLUDEDIR AND FFTW3_LIBRARY) + target_include_directories(rubberband + PRIVATE + ${FFTW3_INCLUDEDIR} + ) + target_compile_definitions(rubberband + PRIVATE + HAVE_FFTW3 + FFTW_DOUBLE_ONLY + ) + target_link_libraries(rubberband + PUBLIC + ${FFTW3_LIBRARY} + ) +else() + target_compile_definitions(rubberband + PRIVATE + USE_KISSFFT + ) + target_sources(rubberband + PRIVATE + src/kissfft/kiss_fft.c + src/kissfft/kiss_fftr.c + ) +endif() + +# Apple framework +if(APPLE) + target_link_libraries(rubberband + PRIVATE + "${ACCELERATE_FRAMEWORK}" + ) +endif() + +# Handle resampling library +if(TARGET samplerate) + target_compile_definitions(rubberband + PRIVATE + HAVE_LIBSAMPLERATE + ) + + target_link_libraries(rubberband + PRIVATE + samplerate + ) +elseif(SAMPLERATE_INCLUDEDIR AND SAMPLERATE_LIBRARY) + target_include_directories(rubberband + PRIVATE + ${SAMPLERATE_INCLUDEDIR} + ) + target_compile_definitions(rubberband + PRIVATE + HAVE_LIBSAMPLERATE + ) + target_link_libraries(rubberband + PUBLIC + ${SAMPLERATE_LIBRARY} + ) +else() + target_compile_definitions(rubberband + PRIVATE + USE_SPEEX + ) + target_sources(rubberband + PRIVATE + src/speex/resample.c + ) +endif() + +### Source files ### +target_sources(rubberband + PRIVATE + src/RubberBandStretcher.cpp + src/StretchCalculator.cpp + src/StretcherChannelData.cpp + src/StretcherImpl.cpp + src/StretcherProcess.cpp + src/audiocurves/CompoundAudioCurve.cpp + src/audiocurves/ConstantAudioCurve.cpp + src/audiocurves/HighFrequencyAudioCurve.cpp + src/audiocurves/PercussiveAudioCurve.cpp + src/audiocurves/SilentAudioCurve.cpp + src/audiocurves/SpectralDifferenceAudioCurve.cpp + src/base/Profiler.cpp + src/dsp/AudioCurveCalculator.cpp + src/dsp/FFT.cpp + src/dsp/Resampler.cpp + src/rubberband-c.cpp + src/system/Allocators.cpp + src/system/Thread.cpp + src/system/VectorOpsComplex.cpp + src/system/sysutils.cpp +) + +### Example ### +if(RUBBERBAND_EXAMPLE) + add_executable(rubberband_test main/main.cpp) + target_include_directories(rubberband_test PRIVATE src Threads::Threads) + target_link_libraries(rubberband_test PRIVATE rubberband -lsndfile) +endif() + +### Installation ### + +install( + TARGETS rubberband + EXPORT rubberband-exports + RUNTIME DESTINATION lib + ARCHIVE DESTINATION lib) + +install(EXPORT rubberband-exports + DESTINATION lib/cmake/rubberband) +export(EXPORT rubberband-exports)