diff options
Diffstat (limited to 'wscript')
-rw-r--r-- | wscript | 193 |
1 files changed, 193 insertions, 0 deletions
@@ -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')) |