aboutsummaryrefslogtreecommitdiffstats
path: root/wscript
diff options
context:
space:
mode:
Diffstat (limited to 'wscript')
-rw-r--r--wscript193
1 files changed, 193 insertions, 0 deletions
diff --git a/wscript b/wscript
new file mode 100644
index 0000000..c854f5a
--- /dev/null
+++ b/wscript
@@ -0,0 +1,193 @@
+#!/usr/bin/env python
+
+import os
+import shutil
+import subprocess
+
+from waflib import Options
+from waflib.extras import autowaf
+
+BLOP_VERSION = '1.0.1'
+
+# Mandatory waf variables
+APPNAME = 'blop-lv2' # Package name for waf dist
+VERSION = BLOP_VERSION # Package version for waf dist
+top = '.' # Source directory
+out = 'build' # Build directory
+
+def options(ctx):
+ ctx.load('compiler_c')
+ ctx.load('lv2')
+ autowaf.set_options(ctx)
+ opt = ctx.get_option_group('Configuration options')
+ opt.add_option('--rate', type='int', default=48000,
+ dest='rate',
+ help='ideal sample rate for oscillator wave tables [Default: 48000]')
+
+def configure(conf):
+ autowaf.display_header('Blop.LV2 Configuration')
+ conf.load('compiler_c', cache=True)
+ conf.load('lv2', cache=True)
+ conf.load('autowaf', cache=True)
+ autowaf.set_c_lang(conf, 'c99')
+
+ autowaf.check_pkg(conf, 'lv2', atleast_version='1.2.0', uselib_store='LV2')
+
+ autowaf.check_function(conf, 'c', 'sinf',
+ header_name = 'math.h',
+ lib = 'm',
+ define_name = 'HAVE_SINF',
+ mandatory = False)
+
+ conf.check_cc(define_name = 'HAVE_LIBDL',
+ lib = 'dl',
+ mandatory = False)
+
+ autowaf.check_function(conf, 'c', 'getopt_long',
+ header_name = 'getopt.h')
+
+
+ conf.write_config_header('blop_config.h', remove=False)
+
+ # Set env.pluginlib_PATTERN
+ pat = conf.env.cshlib_PATTERN
+ if pat[0:3] == 'lib':
+ pat = pat[3:]
+ conf.env.pluginlib_PATTERN = pat
+ conf.env.pluginlib_EXT = pat[pat.rfind('.'):]
+
+ conf.define('BLOP_SHLIB_EXT', conf.env.pluginlib_EXT)
+
+ autowaf.display_summary(conf,
+ {'LV2 bundle directory': conf.env.LV2DIR,
+ 'Ideal sampling rate': Options.options.rate})
+
+def build_plugin(bld, lang, bundle, name, source, defines=None, lib=[]):
+ # Build plugin library
+ penv = bld.env.derive()
+ penv.cshlib_PATTERN = bld.env.pluginlib_PATTERN
+ obj = bld(features = '%s %sshlib' % (lang,lang),
+ env = penv,
+ source = source,
+ includes = ['.', 'src/include'],
+ name = name,
+ target = os.path.join(bundle, name),
+ uselib = ['LV2'],
+ lib = ['m'] + lib,
+ install_path = '${LV2DIR}/' + bundle)
+ if defines != None:
+ obj.defines = defines
+
+ # Install data file
+ data_file = '%s.ttl' % name
+ bld.install_files('${LV2DIR}/' + bundle, os.path.join(bundle, data_file))
+
+def build(bld):
+ for i in bld.path.ant_glob('blop.lv2/*.ttl'):
+ bld(features = 'subst',
+ is_copy = True,
+ source = i,
+ target = 'blop.lv2/%s' % i.name,
+ install_path = '${LV2DIR}/blop.lv2')
+
+ bld(features = 'subst',
+ source = 'blop.lv2/manifest.ttl.in',
+ target = 'blop.lv2/manifest.ttl',
+ LIB_EXT = bld.env.pluginlib_EXT,
+ install_path = '${LV2DIR}/blop.lv2')
+
+ plugins = '''
+ adsr
+ adsr_gt
+ amp
+ branch
+ dahdsr
+ difference
+ fmod
+ interpolator
+ product
+ random
+ ratio
+ sum
+ sync_pulse
+ sync_square
+ tracker
+ '''.split()
+
+ # Simple (single source file) plugins
+ for i in plugins:
+ build_plugin(bld, 'c', 'blop.lv2', i,
+ ['src/%s.c' % i])
+
+ # Low pass filter
+ build_plugin(bld, 'c', 'blop.lv2', 'lp4pole',
+ ['src/lp4pole.c', 'src/lp4pole_filter.c'])
+
+ # Oscillators
+ for i in ['pulse', 'sawtooth', 'square', 'triangle']:
+ lib = []
+ if bld.is_defined('HAVE_LIBDL'):
+ lib += ['dl']
+ build_plugin(bld, 'c', 'blop.lv2', i,
+ ['src/%s.c' % i, 'src/wavedata.c'],
+ lib=lib)
+
+ # Sequencers
+ for i in [16, 32, 64]:
+ uri = 'http://drobilla.net/plugins/blop/sequencer_%d' % i
+ build_plugin(bld, 'c', 'blop.lv2', 'sequencer_%d' % i,
+ ['src/sequencer.c'],
+ defines=['SEQUENCER_MAX_INPUTS=%d' % i,
+ 'SEQUENCER_URI="%s"' % uri])
+
+ # Quantisers
+ for i in [20, 50, 100]:
+ uri = 'http://drobilla.net/plugins/blop/quantiser_%d' % i
+ build_plugin(bld, 'c', 'blop.lv2', 'quantiser_%d' % i,
+ ['src/quantiser.c'],
+ defines=['QUANTISER_MAX_INPUTS=%d' % i,
+ 'QUANTISER_URI="%s"' % uri])
+
+ # Wavegen
+ wavegen = bld(features = 'c cprogram',
+ source = ['src/wavegen.c', 'src/wdatutil.c'],
+ target = 'src/wavegen',
+ name = 'wavegen',
+ includes = ['.', 'src/include'],
+ lib = ['m'],
+ install_path = None)
+
+ wavegen.post()
+
+ # Waveform data source
+ for i in ['parabola', 'sawtooth', 'square']:
+ bld(rule = '${SRC} -r %d -f 12 -s 1 -m 128 -g 1.0 -w %s -p %s -o ${TGT}' % (
+ Options.options.rate, i, i),
+ source = wavegen.link_task.outputs[0],
+ target = 'src/%s_data.c' % i,
+ name = i)
+
+ penv = bld.env.derive()
+ penv.cshlib_PATTERN = bld.env.pluginlib_PATTERN
+
+ bld(features = 'c cshlib',
+ source = bld.path.get_bld().make_node('src/%s_data.c' % i),
+ target = 'blop.lv2/%s_data' % i,
+ includes = ['.', 'src/include'],
+ env = penv,
+ install_path = '${LV2DIR}/blop.lv2',
+ uselib = ['LV2'])
+
+def lint(ctx):
+ subprocess.call('cpplint.py --filter=+whitespace/comments,-whitespace/tab,-whitespace/braces,-whitespace/labels,-build/header_guard,-readability/casting,-readability/todo,-build/include src/* serd/*', shell=True)
+
+def posts(ctx):
+ path = str(ctx.path.abspath())
+ autowaf.news_to_posts(
+ os.path.join(path, 'NEWS'),
+ {'title' : 'BLOP.LV2',
+ 'description' : autowaf.get_blurb(os.path.join(path, 'README')),
+ 'dist_pattern' : 'http://download.drobilla.net/blop-lv2-%s.tar.bz2'},
+ { 'Author' : 'drobilla',
+ 'Tags' : 'LV2, Blop.lv2' },
+ os.path.join(out, 'posts'))