forked from breakfastquay/rubberband
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCMakeLists.txt
201 lines (176 loc) · 4.75 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(rubberband VERSION 2.1.1)
option(RUBBERBAND_EXAMPLE "Build the Rubberband example app" OFF)
option(RUBBERBAND_OPTIMIZED "Build Rubberband optimized for the build machine's CPU" OFF)
option(RUBBERBAND_KISSFFT "Enable KissFFT" OFF)
option(RUBBERBAND_FFTW "Enable FFTW (if available)" ON)
option(RUBBERBAND_BUILTIN_FFT "Enable built-in FFT" ON)
### Dependencies ###
# ARM cross-compilers do not support march=native, only mtune=native
set(MARCH_NATIVE_FLAG)
include(CheckCXXCompilerFlag)
if(RUBBERBAND_OPTIMIZED)
check_cxx_compiler_flag("-march=native" MARCH_NATIVE_SUPPORTED)
if(MARCH_NATIVE_SUPPORTED)
set(MARCH_NATIVE_FLAG "-march=native")
else()
endif()
endif()
find_package(Threads REQUIRED)
# FFTW3
if(RUBBERBAND_FFTW)
find_path(FFTW3_INCLUDEDIR fftw3.h)
find_library(FFTW3_LIBRARY fftw3)
endif()
# 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
$<$<BOOL:${APPLE}>:-mmacosx-version-min=10.11>
$<$<AND:$<NOT:$<CXX_COMPILER_ID:MSVC>>,$<CONFIG:Release>>:-ffast-math ${MARCH_NATIVE_FLAG} -O3 -ftree-vectorize>
)
target_compile_definitions(rubberband
PRIVATE
$<$<BOOL:${UNIX}>:USE_PTHREADS>
$<$<BOOL:${APPLE}>:HAVE_VDSP>
$<$<BOOL:$<CXX_COMPILER_ID:MSVC>>:__MSVC__ WIN32 _LIB NOMINMAX _USE_MATH_DEFINES USE_KISSFFT>
$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Release>>:NDEBUG>
$<$<AND:$<CXX_COMPILER_ID:MSVC>,$<CONFIG:Debug>>:_DEBUG NO_TIMING NO_THREAD_CHECKS>
MALLOC_IS_ALIGNED
NO_THREAD_CHECKS
NO_TIMING
)
target_include_directories(rubberband
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/rubberband>
$<INSTALL_INTERFACE:rubberband>
PRIVATE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
)
target_link_libraries(rubberband
PRIVATE
Threads::Threads
)
# Handle FFT library
if(RUBBERBAND_FFTW AND 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}
)
endif()
if(RUBBERBAND_KISSFFT)
target_compile_definitions(rubberband
PRIVATE
HAVE_KISSFFT
)
target_sources(rubberband
PRIVATE
src/kissfft/kiss_fft.c
src/kissfft/kiss_fftr.c
)
endif()
if(RUBBERBAND_BUILTIN_FFT)
target_compile_definitions(rubberband
PRIVATE
USE_BUILTIN_FFT
)
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)