#!/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)
OMINS_VERSION = '0.0.0'

# Variables for 'waf dist'
APPNAME = 'omins.lv2'
VERSION = OMINS_VERSION

# Mandatory variables
top = '.'
out = 'build'

def options(opt):
    opt.load('compiler_c')
    opt.load('lv2')
    autowaf.set_options(opt)

def configure(conf):
    conf.load('compiler_c')
    conf.load('lv2')
    autowaf.configure(conf)
    autowaf.set_c99_mode(conf)
    autowaf.display_header('Omins.LV2 Configuration')

    autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0', uselib_store='LV2')

    # 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('.'):]

    autowaf.display_msg(conf, "LV2 bundle directory", conf.env.LV2DIR)
    print('')

def build_plugin(bld, lang, bundle, name, source, defines=None):
    # 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'],
              install_path = '${LV2DIR}/' + bundle,
              lib          = ['m'])
    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):
    # Copy data files to build bundle (build/omins.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('omins.lv2/*.ttl'):
        bld(features     = 'subst',
            is_copy      = True,
            source       = i,
            target       = bld.path.get_bld().make_node('omins.lv2/%s' % i),
            install_path = '${LV2DIR}/omins.lv2')

    bld(features     = 'subst',
        source       = 'omins.lv2/manifest.ttl.in',
        target       = bld.path.get_bld().make_node('omins.lv2/manifest.ttl'),
        LIB_EXT      = bld.env.pluginlib_EXT,
        install_path = '${LV2DIR}/omins.lv2')

    plugins = ['adenv',
               'adenv_lvl',
               'comparison',
               'dahdsr_fexp',
               'dahdsr_hexp',
               'fast_crossfade',
               'formant_filter',
               'hz_voct',
               'masher',
               'multiplexer',
               'prob_switch',
               'range_trans',
               'sample_and_hold',
               'signal_abs',
               'slew_limiter',
               'slide',
               'waveguide_mesh']

    for i in plugins:
        build_plugin(bld, 'c', 'omins.lv2', i,
                     ['src/%s.c' % i])
              
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)