From 286e739933e0e330008c37397f7c403b53361293 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Fri, 5 Feb 2021 16:42:13 +0000 Subject: [PATCH] First cut at a Meson build --- .hgignore | 1 + meson.build | 416 ++++++++++++++++++++++++++++++++++++++++++++++ meson_options.txt | 18 ++ 3 files changed, 435 insertions(+) create mode 100644 meson.build create mode 100644 meson_options.txt diff --git a/.hgignore b/.hgignore index 2aef9ed..2070702 100644 --- a/.hgignore +++ b/.hgignore @@ -22,3 +22,4 @@ re:^x64/Debug/ re:^x64/Release/ re:^Release/ re:^Debug/ +build/ diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..3a349ad --- /dev/null +++ b/meson.build @@ -0,0 +1,416 @@ + +project( + 'Rubber Band Library', + 'c', 'cpp', + version: '1.9.0', + license: 'GPL-2.0', + default_options: [ + 'cpp_std=c++98', + 'warning_level=2', + 'buildtype=release', + 'b_ndebug=if-release', + 'b_lundef=true', + ], + meson_version: '>= 0.54.0' +) + +rubberband_dynamic_library_version = '2.1.2' + +system = build_machine.system() +architecture = host_machine.cpu_family() +pkg = import('pkgconfig') + + +# Define the project source sets + +public_headers = [ + 'rubberband/rubberband-c.h', + 'rubberband/RubberBandStretcher.h', +] + +library_sources = [ + 'src/rubberband-c.cpp', + 'src/RubberBandStretcher.cpp', + 'src/StretcherProcess.cpp', + 'src/StretchCalculator.cpp', + 'src/base/Profiler.cpp', + 'src/dsp/AudioCurveCalculator.cpp', + 'src/audiocurves/CompoundAudioCurve.cpp', + 'src/audiocurves/SpectralDifferenceAudioCurve.cpp', + 'src/audiocurves/HighFrequencyAudioCurve.cpp', + 'src/audiocurves/SilentAudioCurve.cpp', + 'src/audiocurves/ConstantAudioCurve.cpp', + 'src/audiocurves/PercussiveAudioCurve.cpp', + 'src/dsp/Resampler.cpp', + 'src/dsp/FFT.cpp', + 'src/system/Allocators.cpp', + 'src/system/sysutils.cpp', + 'src/system/Thread.cpp', + 'src/StretcherChannelData.cpp', + 'src/StretcherImpl.cpp', +] + +jni_sources = [ + 'src/jni/RubberBandStretcherJNI.cpp', +] + +java_sources = [ + 'com/breakfastquay/rubberband/RubberBandStretcher.java', +] + +program_sources = [ + 'main/main.cpp', +] + +vamp_sources = [ + 'vamp/RubberBandVampPlugin.cpp', + 'vamp/libmain.cpp', +] + +ladspa_sources = [ + 'ladspa/RubberBandPitchShifter.cpp', + 'ladspa/libmain.cpp', +] + +general_include_dirs = [ + 'rubberband', + 'src', +] + + +# Scan for any dependencies we may use later; all are optional +# We collect these first so our summary messages about selected build +# features all appear together at the end + +fftw3_dep = dependency('fftw3', version: '>= 3.0.0', required: false) +samplerate_dep = dependency('samplerate', version: '>= 0.1.8', required: false) +sndfile_dep = dependency('sndfile', version: '>= 1.0.16', required: false) +vamp_dep = dependency('vamp-sdk', version: '>= 2.9', required: false) +thread_dep = dependency('threads') +have_ladspa = meson.get_compiler('cpp').has_header('ladspa.h') + + +# Check FFT and resampler options and set up dependencies and paths + +feature_dependencies = [] +feature_defines = [] +feature_libraries = [] +feature_sources = [] +pkgconfig_requirements = [] + +resampler = get_option('resampler') +fft = get_option('fft') +ipp_path = get_option('ipp_path') + +if fft == 'auto' + if system == 'darwin' + fft = 'vdsp' + else + fft = 'kissfft' + endif +endif + +if resampler == 'auto' + if samplerate_dep.found() + resampler = 'libsamplerate' + else + resampler = 'speex' + endif +endif + +ipp_needed = false + +if fft == 'kissfft' + message('For FFT: using KissFFT') + if fftw3_dep.found() + message('(to use FFTW instead, reconfigure with -Dfft=fftw)') + endif + feature_sources += ['src/kissfft/kiss_fft.c', 'src/kissfft/kiss_fftr.c'] + feature_defines += ['-DUSE_KISSFFT'] + +elif fft == 'fftw' + if fftw3_dep.found() + message('For FFT: using FFTW') + else + error('For FFT: FFTW selected, but dependency not found') + endif + feature_dependencies += fftw3_dep + feature_defines += ['-DHAVE_FFTW3', '-DFFTW_DOUBLE_ONLY'] + pkgconfig_requirements += fftw3_dep + +elif fft == 'vdsp' + message('For FFT: using vDSP') + feature_defines += ['-DHAVE_VDSP'] + feature_libraries += ['-framework', 'Accelerate'] + +elif fft == 'ipp' + if ipp_path != '' + message('For FFT: IPP selected') + message('IPP path defined as ' + ipp_path) + else + error('For FFT: IPP selected, but ipp_path not specified') + endif + ipp_needed = true + +else + error('Unknown or unsupported FFT option: ' + fft) + +endif # fft + +if resampler == 'libsamplerate' + if samplerate_dep.found() + message('For resampler: using libsamplerate') + else + error('For resampler: libsamplerate selected, but dependency not found') + endif + feature_dependencies += samplerate_dep + feature_defines += ['-DHAVE_LIBSAMPLERATE'] + pkgconfig_requirements += samplerate_dep + +elif resampler == 'speex' + message('For resampler: speex selected') + message('(consider libsamplerate if time-varying pitch shift is required)') + feature_sources += ['src/speex/resample.c'] + feature_defines += ['-DUSE_SPEEX'] + +elif resampler == 'ipp' + if ipp_path != '' + message('For resampler: IPP selected') + message('(consider libsamplerate if time-varying pitch shift is required)') + message('IPP path defined as ' + ipp_path) + else + error('For resampler: IPP selected, but ipp_path not specified') + endif + ipp_needed = true + +else + error('Unknown or unsupported resampler option: ' + resampler) + +endif # resampler + +if ipp_needed + feature_defines += [ + '-DHAVE_IPP', + '-DUSE_IPP_STATIC', + '-I' + ipp_path / 'include' + ] + if architecture == 'x86' + feature_libraries += [ + '-L' + ipp_path / 'lib/ia32', + ] + elif architecture == 'x86_64' + feature_libraries += [ + '-L' + ipp_path / 'lib/intel64', + ] + else + error('IPP is not supported for this architecture') + endif + if system == 'windows' + feature_libraries += [ + '-lippsmt', '-lippvmmt', '-lippcoremt', + ] + elif system == 'linux' + feature_libraries += [ + '-Wl,-Bstatic', '-lipps', '-lippvm', '-lippcore', '-Wl,-Bdynamic', + ] + else + feature_libraries += [ + '-lipps', '-lippvm', '-lippcore', + ] + endif +endif # ipp_needed + + +# General platform and compiler expectations + +ladspa_symbol_args = [] +vamp_symbol_args = [] + +if get_option('buildtype').startswith('release') + feature_defines += ['-DNO_THREAD_CHECKS', '-DNO_TIMING', '-DNDEBUG'] +endif + +if system == 'darwin' + feature_defines += ['-DUSE_PTHREADS', '-DMALLOC_IS_ALIGNED'] + ladspa_symbol_args += [ + '-exported_symbols_list', meson.source_root() / 'ladspa/ladspa-plugin.list' + ] + vamp_symbol_args += [ + '-exported_symbols_list', meson.source_root() / 'vamp/vamp-plugin.list' + ] +elif system == 'windows' + if meson.get_compiler('cpp').get_id() == 'msvc' + feature_defines += ['-D__MSVC__', '-DNOMINMAX', '-D_USE_MATH_DEFINES'] + ladspa_symbol_args += ['-EXPORT:ladspa_descriptor'] + vamp_symbol_args += ['-EXPORT:vampGetPluginDescriptor'] + endif +else + feature_defines += ['-DUSE_PTHREADS', '-DHAVE_POSIX_MEMALIGN'] + ladspa_symbol_args += [ + '-Wl,--version-script=' + meson.source_root() / 'ladspa/ladspa-plugin.map' + ] + vamp_symbol_args += [ + '-Wl,--version-script=' + meson.source_root() / 'vamp/vamp-plugin.map' + ] +endif + + +# And the build targets: Static and dynamic libraries, command-line +# utility, LADSPA plugin, Vamp plugin + +message('Will build Rubber Band Library static library') +rubberband_static = static_library( + 'rubberband', + library_sources, + feature_sources, + include_directories: [ + general_include_dirs, + ], + cpp_args: [ + feature_defines, + ], + c_args: [ + feature_defines, + ], + dependencies: [ + feature_dependencies, + thread_dep, + ], + pic: true, + install: true, +) + +rubberband_static_dep = declare_dependency( + link_with: rubberband_static, +) + +if system != 'windows' + message('Will build Rubber Band Library dynamic library') + rubberband_dynamic = shared_library( + 'rubberband', + objects: rubberband_static.extract_all_objects(), + link_args: [ + feature_libraries, + ], + dependencies: [ + feature_dependencies, + thread_dep, + ], + version: rubberband_dynamic_library_version, + install: true, + ) +endif + +if have_ladspa + message('Will build LADSPA plugin') + rubberband_ladspa = shared_library( + 'ladspa-rubberband', + ladspa_sources, + include_directories: [ + general_include_dirs, + ], + cpp_args: [ + feature_defines, + ], + c_args: [ + feature_defines, + ], + link_args: [ + feature_libraries, + ladspa_symbol_args, + ], + dependencies: [ + rubberband_static_dep, + feature_dependencies, + thread_dep, + ], + name_prefix: '', + install: true, + install_dir: get_option('libdir') / 'ladspa', + ) + install_data( + 'ladspa/ladspa-rubberband.cat', + install_dir: get_option('libdir') / 'ladspa', + ) + install_data( + 'ladspa/ladspa-rubberband.rdf', + install_dir: get_option('datadir') / 'ladspa/rdf', + ) +else + message('Not building LADSPA plugin: ladspa.h header not found') +endif + +if vamp_dep.found() + message('Will build Vamp plugin') + rubberband_vamp = shared_library( + 'vamp-rubberband', + vamp_sources, + include_directories: [ + general_include_dirs, + ], + cpp_args: [ + feature_defines, + ], + c_args: [ + feature_defines, + ], + link_args: [ + feature_libraries, + vamp_symbol_args, + ], + dependencies: [ + rubberband_static_dep, + feature_dependencies, + vamp_dep, + thread_dep, + ], + name_prefix: '', + install: true, + install_dir: get_option('libdir') / 'vamp', + ) + install_data( + 'vamp/vamp-rubberband.cat', + install_dir: get_option('libdir') / 'vamp', + ) +else + message('Not building Vamp plugin: Vamp dependency not found') +endif + +if sndfile_dep.found() + message('Will build command-line utility') + rubberband_program = executable( + 'rubberband', + program_sources, + include_directories: [ + general_include_dirs, + ], + cpp_args: [ + feature_defines, + ], + c_args: [ + feature_defines, + ], + link_args: [ + feature_libraries, + ], + dependencies: [ + rubberband_static_dep, + feature_dependencies, + sndfile_dep, + thread_dep, + ], + install: true, + ) +else + message('Not building command-line utility: dependency libsndfile not found') +endif + +pkg.generate( + name: 'rubberband', + description: 'Audio time-stretching and pitch-shifting library', + url: 'https://breakfastquay.com/rubberband/', + version: meson.project_version(), + requires: pkgconfig_requirements, + libraries: '-L${libdir} -lrubberband', + extra_cflags: '-I${includedir}', +) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..c3e255f --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,18 @@ + +option('fft', + type: 'combo', + choices: ['auto', 'kissfft', 'fftw', 'vdsp', 'ipp'], + value: 'auto', + description: 'FFT library to use. The default (auto) will use vDSP if available, KissFFT otherwise.') + +option('resampler', + type: 'combo', + choices: ['auto', 'libsamplerate', 'speex', 'ipp'], + value: 'auto', + description: 'Resampler library to use. Recommended is libsamplerate. The default (auto) will use libsamplerate if available, speex otherwise.') + +option('ipp_path', + type: 'string', + value: '', + description: 'Path to Intel IPP libraries, if selected for any of the other options.') +