#!/usr/bin/env python import glob import os import shutil from waflib.extras import autowaf as autowaf # A rule for making a link in the build directory to a source file def link(task): if hasattr(os, 'symlink'): func = os.symlink else: func = shutil.copy # Symlinks unavailable, make a copy try: os.remove(task.outputs[0].abspath()) # Remove old target except: pass # No old target, whatever func(task.inputs[0].abspath(), task.outputs[0].abspath()) def configure(conf): pass def options(opt): opt.load('compiler_c') autowaf.set_options(opt) opt.add_option('--test', action='store_true', default=False, dest='build_tests', help="Build unit tests") opt.add_option('--copy-headers', action='store_true', default=False, dest='copy_headers', help='Copy headers instead of linking to bundle') def build(bld): path = bld.path.srcpath()[len('lv2/'):] name = os.path.basename(path) bundle_dir = os.path.join(bld.env['LV2DIR'], name + '.lv2') include_dir = os.path.join(bld.env['INCLUDEDIR'], 'lv2', path) # Copy headers to URI-style include paths in build directory for i in bld.path.ant_glob('*.h'): obj = bld(rule = link, name = 'link', cwd = 'build/lv2/%s' % path, source = '%s' % i, target = 'lv2/%s/%s' % (path, i)) if bld.env['BUILD_TESTS'] and bld.path.find_node('%s-test.c' % name): test_lib = [] test_cflags = [''] if bld.is_defined('HAVE_GCOV'): test_lib += ['gcov'] test_cflags += ['-fprofile-arcs', '-ftest-coverage'] # Unit test program obj = bld(features = 'c cprogram', source = '%s-test.c' % name, lib = test_lib, target = '%s-test' % name, install_path = '', cflags = test_cflags) # Install bundle bld.install_files(bundle_dir, bld.path.ant_glob('?*.*', excl='*.in')) # Install URI-like includes if bld.path.ant_glob('*.h'): if bld.env['COPY_HEADERS']: bld.install_files(include_dir, bld.path.ant_glob('*.h')) else: bld.symlink_as(include_dir, os.path.relpath(bundle_dir, os.path.dirname(include_dir))) def test(ctx): name = os.path.basename(ctx.path.srcpath()[len('lv2/'):]) autowaf.pre_test(ctx, name, dirs=['.']) os.environ['PATH'] = '.' + os.pathsep + os.getenv('PATH') autowaf.run_tests(ctx, name, ['%s-test' % name], dirs=['.']) autowaf.post_test(ctx, name, dirs=['.']) def news(ctx): path = ctx.path.abspath() autowaf.write_news(os.path.basename(path), glob.glob(os.path.join(path, '*.ttl')), os.path.join(path, 'NEWS')) def pre_dist(ctx): # Write NEWS file in source directory news(ctx) def post_dist(ctx): # Delete generated NEWS file from source directory try: os.remove(os.path.join(ctx.path.abspath(), 'NEWS')) except: pass