#!/usr/bin/env python import os import shutil import subprocess from waflib.extras import autowaf as autowaf # Version of this package (even if built as a child) BLIP_VERSION = '0.0.0' # Variables for 'waf dist' APPNAME = 'blip.lv2' VERSION = BLIP_VERSION # Mandatory variables top = '.' out = 'build' def options(opt): opt.load('compiler_c') autowaf.set_options(opt) def configure(conf): conf.load('compiler_c') autowaf.configure(conf) autowaf.display_header('Blip Configuration') autowaf.check_pkg(conf, 'lv2core', uselib_store='LV2CORE') conf.check(function_name = 'sinf', header_name = 'math.h', linkflags = '-lm', define_name = 'HAVE_SINF', mandatory = False) conf.env.append_unique('CFLAGS', '-std=c99') conf.write_config_header('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('BLIP_SHLIB_EXT', conf.env['pluginlib_EXT']) autowaf.display_msg(conf, "LV2 bundle directory", conf.env['LV2DIR']) print('') def build_plugin(bld, lang, bundle, name, source, cflags=[], libs=[]): # Build plugin library penv = bld.env.derive() penv['cshlib_PATTERN'] = bld.env['pluginlib_PATTERN'] obj = bld(features = '%s %sshlib' % (lang,lang)) obj.env = penv obj.source = source obj.includes = [ '.', './src/include' ] obj.name = name obj.target = os.path.join(bundle, name) obj.uselib = ['LV2CORE'] if cflags != []: obj.cflags = cflags if libs != []: autowaf.use_lib(bld, obj, libs) obj.install_path = '${LV2DIR}/' + bundle # Install data file data_file = '%s.ttl' % name bld.install_files('${LV2DIR}/' + bundle, os.path.join(bundle, data_file)) def build(bld): # Copy data files to build bundle (build/blip.lv2) def do_copy(task): src = task.inputs[0].abspath() tgt = task.outputs[0].abspath() return shutil.copy(src, tgt) for i in bld.path.ant_glob('blip.lv2/*.ttl'): bld(rule = do_copy, source = i, target = bld.path.get_bld().make_node('blip.lv2/%s' % i), install_path = '${LV2DIR}/blip.lv2') bld(features = 'subst', source = 'blip.lv2/manifest.ttl.in', target = bld.path.get_bld().make_node('blip.lv2/manifest.ttl'), LIB_EXT = bld.env['pluginlib_EXT'], install_path = '${LV2DIR}/blip.lv2') plugins = ''' adsr adsr_gt amp branch dahdsr difference fmod interpolator product random ratio sum sync_pulse sync_square tracker '''.split() # quantiser.so # sequencer.so # Simple (single source file) plugins for i in plugins: build_plugin(bld, 'c', 'blip.lv2', i, ['src/%s.c' % i]) # Low pass filter build_plugin(bld, 'c', 'blip.lv2', 'lp4pole', ['src/lp4pole.c', 'src/lp4pole_filter.c']) # Oscillators for i in ['pulse', 'sawtooth', 'square', 'triangle']: build_plugin(bld, 'c', 'blip.lv2', i, ['src/%s.c' % i, 'src/wavedata.c']) # Wavegen wavegen = bld(features = 'c cprogram', source = ['src/wavegen.c', 'src/wdatutil.c'], target = 'src/wavegen', name = 'wavegen', after = ['parabola', 'sawtooth', 'square'], includes = ['./src', './src/include'], linkflags = ['-lm'], install_path = None) penv = bld.env.derive() penv['cshlib_PATTERN'] = bld.env['pluginlib_PATTERN'] bld.add_group() # Ensure wavegen is built before the following objects # Waveform data for i in ['parabola', 'sawtooth', 'square']: obj = bld(rule = '${SRC} -r 48000 -f 12 -s 1 -m 128 -g 1.0 -w %s -p %s -o ${TGT}' % (i, i), source = bld.path.get_bld().make_node('src/wavegen'), target = 'src/%s_data.c' % i, name = i) obj = bld(features = 'c cshlib', source = bld.path.get_bld().make_node('src/%s_data.c' % i), target = 'blip.lv2/%s_data' % i, includes = ['./src', './src/include'], env = penv, install_path = '${LV2DIR}/blip.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)