Files
ardour/libs/ardour/wscript
David Robillard 338e83d9dc Implement LV2 worker extension.
This is done by way of a generic Worker object/thread, which currently just
applies to one LV2 plugin, but the idea is to share one thread and set of
buffers among many plugins.  The same pattern may also be useful elsewhere in
Ardour.  The responding part gets a bit tricker when sharing a worker between
plugins, it's not a blocker, and I'm lazy, sooo here's this.

This commit also adds a new portable in-process semaphore to PBD.  The existing
one is pretty weird and uses a named semaphore on OSX for reasons unknown to
me.  Perhaps as a quick fix to avoid POSIX semaphores being utterly broken on
OSX?  It would probably be a good idea to replace that with this new one, which
uses Mach kernel semaphores on OSX which work well, though I am not sure how
pedantically real-time safe they are to signal.


git-svn-id: svn://localhost/ardour2/branches/3.0@11790 d708f5d6-7413-0410-9779-e7cbd77b26cf
2012-04-05 00:15:54 +00:00

521 lines
18 KiB
Python

#!/usr/bin/env python
from waflib.extras import autowaf as autowaf
from waflib import Options
import os
import re
import subprocess
# Version of this package (even if built as a child)
MAJOR = '3'
MINOR = '0'
MICRO = '0'
LIBARDOUR_VERSION = "%s.%s.%s" % (MAJOR, MINOR, MICRO)
# Library version (UNIX style major, minor, micro)
# major increment <=> incompatible changes
# minor increment <=> compatible changes (additions)
# micro increment <=> no interface changes
LIBARDOUR_LIB_VERSION = '3.0.0'
# default state file version for this build
CURRENT_SESSION_FILE_VERSION = 3000
# Variables for 'waf dist'
APPNAME = 'libardour3'
VERSION = LIBARDOUR_VERSION
I18N_PACKAGE = 'libardour3'
# Mandatory variables
top = '.'
out = 'build'
path_prefix = 'libs/ardour/'
libardour_sources = [
'amp.cc',
'analyser.cc',
'audio_buffer.cc',
'audio_diskstream.cc',
'audio_library.cc',
'audio_playlist.cc',
'audio_playlist_importer.cc',
'audio_playlist_source.cc',
'audio_port.cc',
'audio_region_importer.cc',
'audio_track.cc',
'audio_track_importer.cc',
'audioanalyser.cc',
'audioengine.cc',
'audiofile_tagger.cc',
'audiofilesource.cc',
'audioregion.cc',
'audiosource.cc',
'auditioner.cc',
'automatable.cc',
'automation.cc',
'automation_control.cc',
'automation_list.cc',
'beats_frames_converter.cc',
'broadcast_info.cc',
'buffer.cc',
'buffer_manager.cc',
'buffer_set.cc',
'bundle.cc',
'butler.cc',
'callback.cc',
'capturing_processor.cc',
'chan_count.cc',
'chan_mapping.cc',
'configuration.cc',
'config_text.cc',
'control_protocol_manager.cc',
'control_protocol_search_path.cc',
'crossfade.cc',
'crossfade_binder.cc',
'cycle_timer.cc',
'data_type.cc',
'default_click.cc',
'debug.cc',
'delivery.cc',
'directory_names.cc',
'diskstream.cc',
'element_import_handler.cc',
'element_importer.cc',
'enums.cc',
'event_type_map.cc',
'export_channel.cc',
'export_channel_configuration.cc',
'export_failed.cc',
'export_filename.cc',
'export_format_base.cc',
'export_format_manager.cc',
'export_format_specification.cc',
'export_formats.cc',
'export_formats_search_path.cc',
'export_graph_builder.cc',
'export_handler.cc',
'export_preset.cc',
'export_profile_manager.cc',
'export_status.cc',
'export_timespan.cc',
'file_source.cc',
'filename_extensions.cc',
'filesystem_paths.cc',
'filter.cc',
'find_session.cc',
'globals.cc',
'graph.cc',
'graphnode.cc',
'import.cc',
'internal_return.cc',
'internal_send.cc',
'interpolation.cc',
'io.cc',
'io_processor.cc',
'jack_slave.cc',
'ladspa_plugin.cc',
'location.cc',
'location_importer.cc',
'meter.cc',
'midi_automation_list_binder.cc',
'midi_buffer.cc',
'midi_clock_slave.cc',
'midi_diskstream.cc',
'midi_model.cc',
'midi_patch_manager.cc',
'midi_patch_search_path.cc',
'midi_playlist.cc',
'midi_playlist_source.cc',
'midi_port.cc',
'midi_region.cc',
'midi_ring_buffer.cc',
'midi_source.cc',
'midi_state_tracker.cc',
'midi_stretch.cc',
'midi_track.cc',
'midi_ui.cc',
'mix.cc',
'monitor_processor.cc',
'mtc_slave.cc',
'mtdm.cc',
'mute_master.cc',
'named_selection.cc',
'onset_detector.cc',
'operations.cc',
'pan_controllable.cc',
'pannable.cc',
'panner.cc',
'panner_manager.cc',
'panner_search_path.cc',
'panner_shell.cc',
'pcm_utils.cc',
'pi_controller.cc',
'playlist.cc',
'playlist_factory.cc',
'playlist_source.cc',
'plugin.cc',
'plugin_insert.cc',
'plugin_manager.cc',
'port.cc',
'port_insert.cc',
'port_set.cc',
'process_thread.cc',
'processor.cc',
'progress.cc',
'quantize.cc',
'rc_configuration.cc',
'recent_sessions.cc',
'region_factory.cc',
'resampled_source.cc',
'region.cc',
'return.cc',
'reverse.cc',
'route.cc',
'route_graph.cc',
'route_group.cc',
'route_group_member.cc',
'rb_effect.cc',
'send.cc',
'session.cc',
'session_butler.cc',
'session_click.cc',
'session_command.cc',
'session_configuration.cc',
'session_directory.cc',
'session_events.cc',
'session_export.cc',
'session_handle.cc',
'session_metadata.cc',
'session_midi.cc',
'session_object.cc',
'session_playlists.cc',
'session_process.cc',
'session_rtevents.cc',
'session_state.cc',
'session_state_utils.cc',
'session_time.cc',
'session_transport.cc',
'session_utils.cc',
'slave.cc',
'smf_source.cc',
'sndfile_helpers.cc',
'sndfileimportable.cc',
'sndfilesource.cc',
'source.cc',
'source_factory.cc',
'speakers.cc',
'strip_silence.cc',
'svn_revision.cc',
'tape_file_matcher.cc',
'template_utils.cc',
'tempo.cc',
'tempo_map_importer.cc',
'thread_buffers.cc',
'ticker.cc',
'track.cc',
'transient_detector.cc',
'unknown_processor.cc',
'user_bundle.cc',
'utils.cc',
'version.cc',
'worker.cc',
]
def flac_supported():
cmd = subprocess.Popen ("sndfile-info testfile.flac",
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT, shell = True)
out = cmd.communicate()[0].decode('utf-8');
return re.search ('unknown format', out) == None
def ogg_supported():
cmd = subprocess.Popen ("sndfile-info testfile.ogg",
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT, shell = True)
out = cmd.communicate()[0].decode('utf-8');
return re.search ('unknown format', out) == None
def options(opt):
autowaf.set_options(opt)
def configure(conf):
conf.load('compiler_cxx')
conf.load('gas')
autowaf.build_version_files(
path_prefix + 'ardour/version.h',
path_prefix + 'version.cc',
'libardour3', MAJOR, MINOR, MICRO)
autowaf.configure(conf)
autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO',
atleast_version='0.3.2')
autowaf.check_pkg(conf, 'jack', uselib_store='JACK',
atleast_version='0.118.2')
autowaf.check_pkg(conf, 'libxml-2.0', uselib_store='XML')
autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF',
atleast_version='0.4.0')
autowaf.check_pkg(conf, 'samplerate', uselib_store='SAMPLERATE',
atleast_version='0.1.0')
autowaf.check_pkg(conf, 'sigc++-2.0', uselib_store='SIGCPP',
atleast_version='2.0')
if Options.options.lv2:
autowaf.check_pkg(conf, 'lilv-0', uselib_store='LILV',
atleast_version='0.0.0', mandatory=False)
autowaf.check_pkg(conf, 'lilv-0', uselib_store='NEW_LILV',
atleast_version='0.11.0', mandatory=False)
if conf.is_defined('HAVE_LILV'):
autowaf.check_pkg(conf, 'suil-0', uselib_store='SUIL',
atleast_version='0.2.0', mandatory=False)
# autowaf.check_pkg(conf, 'soundtouch-1.0', uselib_store='SOUNDTOUCH',
# mandatory=False)
autowaf.check_pkg(conf, 'cppunit', uselib_store='CPPUNIT',
atleast_version='1.12.0', mandatory=False)
autowaf.check_pkg(conf, 'ogg', uselib_store='OGG', atleast_version='1.1.2')
autowaf.check_pkg(conf, 'flac', uselib_store='FLAC',
atleast_version='1.2.1')
autowaf.check_pkg(conf, 'libcurl', uselib_store='CURL',
atleast_version='7.0.0')
# we don't try to detect this, since its part of our source tree
conf.define('HAVE_RUBBERBAND', 1) # controls whether we think we have it
conf.define('USE_RUBBERBAND', 1) # controls whether we actually use it
conf.define('CURRENT_SESSION_FILE_VERSION', CURRENT_SESSION_FILE_VERSION)
conf.check(header_name='sys/vfs.h', define_name='HAVE_SYS_VFS_H',mandatory=False)
conf.check(header_name='jack/session.h', uselib = [ 'JACK' ],
define_name='HAVE_JACK_SESSION')
conf.check(header_name='unistd.h', define_name='HAVE_UNISTD',mandatory=False)
conf.check_cc(fragment = '''
#include <jack/jack.h>
void callback(jack_status_t code, const char* reason, void* arg) { return; }
int main(int argc, char **argv) {
jack_client_t* c;
jack_on_info_shutdown(c, callback, (void*) 0);
return 0;
}''',
uselib= [ 'JACK' ],
msg = 'Checking for jack_on_info_shutdown',
define_name = 'HAVE_JACK_ON_INFO_SHUTDOWN',
okmsg = 'present')
missing_jack_message = 'missing - a version of JACK that supports jack_port_set_latency_range() is required to compile Ardour3.'
conf.check_cc(fragment = '''
#include <jack/jack.h>
int main(int argc, char **argv) {
jack_port_t* p;
jack_latency_range_t r;
jack_port_set_latency_range(p, JackCaptureLatency, &r);
return 0;
}''',
uselib = [ 'JACK' ],
msg = 'Checking for new JACK latency API',
okmsg = 'present',
mandatory = True,
errmsg = missing_jack_message)
conf.check_cc(fragment = '''
#include <jack/jack.h>
int main(int argc, char **argv) {
jack_port_type_get_buffer_size((jack_client_t*)0, "");
return 0;
}''',
uselib = [ 'JACK' ],
msg = 'Checking for new jack_port_type_get_buffer_size',
okmsg = 'present',
mandatory = True,
errmsg = missing_jack_message)
if flac_supported():
conf.define ('HAVE_FLAC', 1)
if ogg_supported():
conf.define ('HAVE_OGG', 1)
if Options.options.lv2 and conf.is_defined('HAVE_LILV'):
conf.define ('LV2_SUPPORT', 1)
conf.write_config_header('libardour-config.h', remove=False)
# Boost headers
autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp')
autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
autowaf.check_header(conf, 'cxx', 'boost/scoped_ptr.hpp')
autowaf.check_header(conf, 'cxx', 'boost/ptr_container/ptr_list.hpp')
def build(bld):
# Library
obj = bld(features = 'c cxx cshlib cxxshlib')
obj.source = libardour_sources
obj.export_includes = ['.']
obj.includes = ['.', '../surfaces/control_protocol', '..']
obj.name = 'libardour'
obj.target = 'ardour'
obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
'JACK','SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
'OSX','BOOST','CURL','DL']
obj.use = ['libpbd','libmidipp','libevoral','libvamphost',
'libvampplugin','libtaglib','librubberband',
'libaudiographer']
obj.vnum = LIBARDOUR_LIB_VERSION
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
obj.defines = [
'PACKAGE="' + I18N_PACKAGE + '"',
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'MODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
'VAMP_DIR="' + os.path.join(
os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"',
'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"'
]
#obj.source += ' st_stretch.cc st_pitch.cc '
#obj.uselib += ' SOUNDTOUCH '
#obj.add_objects = 'default/libs/surfaces/control_protocol/smpte_1.o'
if bld.is_defined('HAVE_LILV') :
obj.source += ['lv2_plugin.cc', 'lv2_evbuf.c', 'uri_map.cc']
obj.uselib += ['LILV']
if bld.is_defined('HAVE_SUIL'):
obj.uselib += ['SUIL']
if bld.is_defined('WINDOWS_VST_SUPPORT'):
obj.source += [ 'windows_vst_plugin.cc']
obj.includes += [ '../fst' ]
obj.defines += [ 'WINDOWS_VST_SUPPORT' ]
if bld.is_defined('LXVST_SUPPORT'):
obj.source += [ 'lxvst_plugin.cc', 'linux_vst_support.cc', 'linux_vst_info_file.cc' ]
obj.defines += [ 'LXVST_SUPPORT' ]
if bld.is_defined('WINDOWS_VST_SUPPORT') or bld.is_defined('LXVST_SUPPORT'):
obj.source += [ 'session_vst.cc', 'vst_plugin.cc' ]
if bld.is_defined('HAVE_COREAUDIO'):
obj.source += [ 'coreaudiosource.cc', 'caimportable.cc' ]
obj.use += ['libappleutility']
if bld.is_defined('AUDIOUNIT_SUPPORT'):
obj.source += [ 'audio_unit.cc' ]
if Options.options.fpu_optimization:
if (bld.env['build_target'] == 'i386'
or bld.env['build_target'] == 'i686'):
obj.source += [ 'sse_functions_xmm.cc', 'sse_functions.s' ]
elif bld.env['build_target'] == 'x86_64':
obj.source += [ 'sse_functions_xmm.cc', 'sse_functions_64bit.s' ]
# i18n
if bld.is_defined('ENABLE_NLS'):
mo_files = bld.path.ant_glob('po/*.mo')
for mo in mo_files:
lang = os.path.basename(mo.srcpath()).replace('.mo', '')
bld.install_as(os.path.join(bld.env['PREFIX'], 'share', 'locale',
lang, 'LC_MESSAGES', I18N_PACKAGE + '.mo'),
mo)
if bld.env['BUILD_TESTS'] and bld.is_defined('HAVE_CPPUNIT'):
# Unit tests
testobj = bld(features = 'cxx cxxprogram')
testobj.source = '''
test/dummy_lxvst.cc
test/test_needing_session.cc
test/test_needing_playlist_and_regions.cc
test/bbt_test.cc
test/tempo_test.cc
test/interpolation_test.cc
test/midi_clock_slave_test.cc
test/resampled_source_test.cc
test/framewalk_to_beats_test.cc
test/framepos_plus_beats_test.cc
test/framepos_minus_beats_test.cc
test/playlist_layering_test.cc
test/testrunner.cc
'''.split()
# Tests that don't work
# test/mantis_3356_test.cc
testobj.includes = obj.includes + ['test', '../pbd']
testobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
testobj.use = ['libpbd','libmidipp','libardour']
testobj.name = 'libardour-tests'
testobj.target = 'run-tests'
testobj.install_path = ''
testobj.defines = [
'PACKAGE="libardour3test"',
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'MODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
'VAMP_DIR="' + os.path.join(
os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
]
if bld.env['FPU_OPTIMIZATION']:
testobj.source += [ 'sse_functions_xmm.cc' ]
if (bld.env['build_target'] == 'i386'
or bld.env['build_target'] == 'i686'):
testobj.source += [ 'sse_functions.s' ]
elif bld.env['build_target'] == 'x86_64':
testobj.source += [ 'sse_functions_64bit.s' ]
# Profiling
profilingobj = bld(features = 'cxx cxxprogram')
profilingobj.source = '''
test/dummy_lxvst.cc
test/profiling/runpc.cc
'''.split()
profilingobj.includes = obj.includes
profilingobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
profilingobj.use = ['libpbd','libmidipp','libardour']
profilingobj.name = 'libardour-profiling'
profilingobj.target = 'run-profiling'
profilingobj.install_path = ''
profilingobj.defines = [
'PACKAGE="libardour3profile"',
'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
'MODULE_DIR="' + os.path.normpath(bld.env['LIBDIR']) + '"',
'LOCALEDIR="' + os.path.join(
os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
'VAMP_DIR="' + os.path.join(
os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
]
if bld.env['FPU_OPTIMIZATION']:
profilingobj.source += [ 'sse_functions_xmm.cc' ]
if (bld.env['build_target'] == 'i386'
or bld.env['build_target'] == 'i686'):
profilingobj.source += [ 'sse_functions.s' ]
elif bld.env['build_target'] == 'x86_64':
profilingobj.source += [ 'sse_functions_64bit.s' ]
def shutdown():
autowaf.shutdown()
def i18n(bld):
autowaf.build_i18n(bld, top, 'libs/ardour', I18N_PACKAGE, libardour_sources,
'Paul Davis')
def i18n_pot(bld):
autowaf.build_i18n(bld, top, 'libs/ardour', I18N_PACKAGE, libardour_sources,
'Paul Davis')
def i18n_po(bld):
autowaf.build_i18n_po(bld, top, 'libs/ardour', I18N_PACKAGE, libardour_sources,
'Paul Davis')
def i18n_mo(bld):
autowaf.build_i18n_mo(bld, top, 'libs/ardour', I18N_PACKAGE, libardour_sources,
'Paul Davis')