diff options
Diffstat (limited to 'wscript')
| -rw-r--r-- | wscript | 486 |
1 files changed, 0 insertions, 486 deletions
diff --git a/wscript b/wscript deleted file mode 100644 index 01f7987..0000000 --- a/wscript +++ /dev/null @@ -1,486 +0,0 @@ -#!/usr/bin/env python -import glob -import os -import re -import shutil -import subprocess -import sys - -from waflib.extras import autowaf as autowaf -import waflib.Context as Context -import waflib.Logs as Logs -import waflib.Options as Options -import waflib.Scripting as Scripting -import waflib.Utils as Utils - -# Variables for 'waf dist' -APPNAME = 'lv2' -VERSION = '1.14.1' - -# Mandatory variables -top = '.' -out = 'build' - -def options(opt): - opt.load('compiler_c') - opt.load('lv2') - autowaf.set_options(opt, False, True) - opt.add_option('--test', action='store_true', dest='build_tests', - help='Build unit tests') - opt.add_option('--no-coverage', action='store_true', dest='no_coverage', - help='Do not use gcov for code coverage') - opt.add_option('--online-docs', action='store_true', dest='online_docs', - help='Build documentation for web hosting') - opt.add_option('--no-plugins', action='store_true', dest='no_plugins', - help='Do not build example plugins') - opt.add_option('--copy-headers', action='store_true', dest='copy_headers', - help='Copy headers instead of linking to bundle') - opt.recurse('lv2/lv2plug.in/ns/lv2core') - -def configure(conf): - try: - conf.load('compiler_c') - except: - Options.options.build_tests = False - Options.options.no_plugins = True - - conf.load('lv2') - autowaf.configure(conf) - autowaf.set_c99_mode(conf) - - if Options.options.online_docs: - Options.options.docs = True - - if Options.options.ultra_strict: - conf.env.append_value('CFLAGS', ['-Wconversion']) - - if Options.platform == 'win32' or not hasattr(os.path, 'relpath'): - Logs.warn('System does not support linking headers, copying') - Options.options.copy_headers = True - - conf.env.BUILD_TESTS = Options.options.build_tests - conf.env.BUILD_PLUGINS = not Options.options.no_plugins - conf.env.COPY_HEADERS = Options.options.copy_headers - conf.env.ONLINE_DOCS = Options.options.online_docs - - if conf.env.DOCS or conf.env.ONLINE_DOCS: - try: - conf.find_program('asciidoc') - conf.env.BUILD_BOOK = True - except: - Logs.warn('Asciidoc not found, book will not be built') - - # Check for gcov library (for test coverage) - if (conf.env.BUILD_TESTS - and not Options.options.no_coverage - and not conf.is_defined('HAVE_GCOV')): - conf.check_cc(lib='gcov', define_name='HAVE_GCOV', mandatory=False) - - autowaf.set_recursive() - - conf.recurse('lv2/lv2plug.in/ns/lv2core') - - conf.env.LV2_BUILD = ['lv2/lv2plug.in/ns/lv2core'] - if conf.env.BUILD_PLUGINS: - for i in conf.path.ant_glob('plugins/*', src=False, dir=True): - try: - conf.recurse(i.srcpath()) - conf.env.LV2_BUILD += [i.srcpath()] - except: - Logs.warn('Configuration failed, %s will not be built\n' % i) - - autowaf.configure(conf) - autowaf.display_header('LV2 Configuration') - autowaf.display_msg(conf, 'Bundle directory', conf.env.LV2DIR) - autowaf.display_msg(conf, 'Copy (not link) headers', conf.env.COPY_HEADERS) - autowaf.display_msg(conf, 'Version', VERSION) - -def chop_lv2_prefix(s): - if s.startswith('lv2/lv2plug.in/'): - return s[len('lv2/lv2plug.in/'):] - return s - -def subst_file(template, output, dict): - i = open(template, 'r') - o = open(output, 'w') - for line in i: - for key in dict: - line = line.replace(key, dict[key]) - o.write(line) - i.close() - o.close() - -def specdirs(path): - return ([path.find_node('lv2/lv2plug.in/ns/lv2core')] + - path.ant_glob('plugins/*', dir=True) + - path.ant_glob('lv2/lv2plug.in/ns/ext/*', dir=True) + - path.ant_glob('lv2/lv2plug.in/ns/extensions/*', dir=True)) - -def ttl_files(path, specdir): - def abspath(node): - return node.abspath() - - return map(abspath, - path.ant_glob(specdir.path_from(path) + '/*.ttl')) - -def load_ttl(files): - import rdflib - model = rdflib.ConjunctiveGraph() - for f in files: - model.parse(f, format='n3') - return model - -# Task to build extension index -def build_index(task): - sys.path.append('./lv2specgen') - import rdflib - import lv2specgen - - doap = rdflib.Namespace('http://usefulinc.com/ns/doap#') - lv2 = rdflib.Namespace('http://lv2plug.in/ns/lv2core#') - rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') - - model = load_ttl(['lv2/lv2plug.in/ns/meta/meta.ttl']) - - # Get date for this version, and list of all LV2 distributions - proj = rdflib.URIRef('http://lv2plug.in/ns/lv2') - date = None - dists = [] - for r in model.triples([proj, doap.release, None]): - revision = model.value(r[2], doap.revision, None) - created = model.value(r[2], doap.created, None) - if str(revision) == VERSION: - date = created - - dist = model.value(r[2], doap['file-release'], None) - if dist and created: - dists += [(created, dist)] - else: - print('warning: %s has no file release\n' % proj) - - # Get history for this LV2 release - entries = lv2specgen.specHistoryEntries(model, proj, {}) - - # Add entries for every spec that has the same distribution - ctx = task.generator.bld - subdirs = specdirs(ctx.path) - for specdir in subdirs: - m = load_ttl(ttl_files(ctx.path, specdir)) - name = os.path.basename(specdir.abspath()) - spec = m.value(None, rdf.type, lv2.Specification) - if spec: - for dist in dists: - release = m.value(None, doap['file-release'], dist[1]) - if release: - entries[dist] += lv2specgen.releaseChangeset(m, release, str(name)) - - # Generate history for all post-unification LV2 distributions - history = lv2specgen.specHistoryMarkup(entries) - - rows = [] - for f in task.inputs: - if not f.abspath().endswith('index.html.in'): - rowfile = open(f.abspath(), 'r') - rows += rowfile.readlines() - rowfile.close() - - if date is None: - import datetime - date = datetime.datetime.now().isoformat() - - subst_file(task.inputs[0].abspath(), task.outputs[0].abspath(), - { '@ROWS@': ''.join(rows), - '@LV2_VERSION@': VERSION, - '@DATE@' : date, - '@HISTORY@' : history}) - -# Task for making a link in the build directory to a source file -def link(task): - if not task.env.COPY_HEADERS and 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 build_ext(bld, path): - name = os.path.basename(path) - bundle_dir = os.path.join(bld.env.LV2DIR, name + '.lv2') - include_dir = os.path.join(bld.env.INCLUDEDIR, path) - - # Copy headers to URI-style include paths in build directory - for i in bld.path.ant_glob(path + '/*.h'): - bld(rule = link, - source = i, - target = bld.path.get_bld().make_node('%s/%s' % (path, i))) - - # Build test program if applicable - if bld.env.BUILD_TESTS and bld.path.find_node(path + '/%s-test.c' % name): - test_lib = [] - test_cflags = [''] - test_linkflags = [''] - if bld.is_defined('HAVE_GCOV'): - test_lib += ['gcov', 'rt'] - test_cflags += ['--coverage'] - test_linkflags += ['--coverage'] - - # Unit test program - bld(features = 'c cprogram', - source = path + '/%s-test.c' % name, - lib = test_lib, - target = path + '/%s-test' % name, - install_path = None, - cflags = test_cflags, - linkflags = test_linkflags) - - # Install bundle - bld.install_files(bundle_dir, - bld.path.ant_glob(path + '/?*.*', excl='*.in')) - - # Install URI-like includes - headers = bld.path.ant_glob(path + '/*.h') - if headers: - if bld.env.COPY_HEADERS: - bld.install_files(include_dir, headers) - else: - bld.symlink_as(include_dir, - os.path.relpath(bundle_dir, - os.path.dirname(include_dir))) - -def build(bld): - exts = (bld.path.ant_glob('lv2/lv2plug.in/ns/ext/*', dir=True) + - bld.path.ant_glob('lv2/lv2plug.in/ns/extensions/*', dir=True)) - - # Copy lv2.h to URI-style include path in build directory - lv2_h_path = 'lv2/lv2plug.in/ns/lv2core/lv2.h' - bld(rule = link, - source = bld.path.find_node(lv2_h_path), - target = bld.path.get_bld().make_node(lv2_h_path)) - - # LV2 pkgconfig file - bld(features = 'subst', - source = 'lv2.pc.in', - target = 'lv2.pc', - install_path = '${LIBDIR}/pkgconfig', - PREFIX = bld.env.PREFIX, - INCLUDEDIR = bld.env.INCLUDEDIR, - VERSION = VERSION) - - # Build extensions - for i in exts: - build_ext(bld, i.srcpath()) - - # Build plugins - for i in bld.env.LV2_BUILD: - bld.recurse(i) - - if bld.env.BUILD_BOOK: - bld.recurse('plugins') - - # Install lv2specgen - bld.install_files('${DATADIR}/lv2specgen/', - ['lv2specgen/style.css', - 'lv2specgen/template.html']) - bld.install_files('${DATADIR}/lv2specgen/DTD/', - bld.path.ant_glob('lv2specgen/DTD/*')) - bld.install_files('${BINDIR}', 'lv2specgen/lv2specgen.py', chmod=Utils.O755) - - # Install schema bundle - bld.install_files('${LV2DIR}/schemas.lv2/', - bld.path.ant_glob('schemas.lv2/*.ttl')) - - if bld.env.DOCS or bld.env.ONLINE_DOCS: - # Prepare spec output directories - specs = exts + [bld.path.find_node('lv2/lv2plug.in/ns/lv2core')] - for i in specs: - # Copy spec files to build dir - for f in bld.path.ant_glob(i.srcpath() + '/*.*'): - bld(features = 'subst', - is_copy = True, - name = 'copy', - source = f, - target = chop_lv2_prefix(f.srcpath())) - - base = i.srcpath()[len('lv2/lv2plug.in'):] - name = os.path.basename(i.srcpath()) - - # Generate .htaccess file - if bld.env.ONLINE_DOCS: - bld(features = 'subst', - source = 'doc/htaccess.in', - target = os.path.join(base, '.htaccess'), - install_path = None, - NAME = name, - BASE = base) - - - # Copy stylesheets to build directory - for i in ['style.css', 'pygments.css']: - bld(features = 'subst', - is_copy = True, - name = 'copy', - source = 'doc/%s' % i, - target = 'aux/%s' % i) - - bld(features = 'subst', - is_copy = True, - name = 'copy', - source = 'doc/doxy-style.css', - target = 'doc/html/doxy-style.css') - - # Build Doxygen documentation (and tags file) - autowaf.build_dox(bld, 'LV2', VERSION, top, out, 'lv2plug.in/doc', False) - bld.add_group() - - index_files = [] - for i in specs: - # Call lv2specgen to generate spec docs - name = os.path.basename(i.srcpath()) - index_file = os.path.join('index_rows', name) - index_files += [index_file] - root_path = os.path.relpath('lv2/lv2plug.in/ns', name) - html_path = '%s/%s.html' % (chop_lv2_prefix(i.srcpath()), name) - out_bundle = os.path.dirname(html_path) - bld(rule = '../lv2specgen/lv2specgen.py --root=' + root_path + - ' --list-email=devel@lists.lv2plug.in' - ' --list-page=http://lists.lv2plug.in/listinfo.cgi/devel-lv2plug.in' - ' ${SRC} ../lv2specgen ' + - os.path.relpath('aux/style.css', out_bundle) + - ' ${TGT} %s doc/tags' % - os.path.relpath('doc/html', os.path.dirname(html_path)), - source = os.path.join(i.srcpath(), name + '.ttl'), - target = [html_path, index_file]) - - # Install documentation - if not bld.env.ONLINE_DOCS: - base = chop_lv2_prefix(i.srcpath()) - bld.install_files('${DOCDIR}/' + i.srcpath(), - bld.path.get_bld().ant_glob(base + '/*.html')) - - index_files.sort() - bld.add_group() - - # Build extension index - bld(rule = build_index, - name = 'index', - source = ['lv2/lv2plug.in/ns/index.html.in'] + index_files, - target = 'ns/index.html') - - # Install main documentation files - if not bld.env.ONLINE_DOCS: - bld.install_files('${DOCDIR}/lv2/lv2plug.in/aux/', 'aux/style.css') - bld.install_files('${DOCDIR}/lv2/lv2plug.in/ns/', 'ns/index.html') - - if bld.env.BUILD_TESTS: - # Generate a compile test .c file that includes all headers - def gen_build_test(task): - out = open(task.outputs[0].abspath(), 'w') - for i in task.inputs: - out.write('#include "%s"\n' % i.bldpath()) - out.write('int main(void) { return 0; }\n') - out.close() - - bld(rule = gen_build_test, - source = bld.path.ant_glob('lv2/**/*.h'), - target = 'build-test.c', - install_path = None) - - bld(features = 'c cprogram', - source = bld.path.get_bld().make_node('build-test.c'), - target = 'build-test', - install_path = None) - -def lint(ctx): - for i in ctx.path.ant_glob('lv2/**/*.h'): - subprocess.call('cpplint.py --filter=+whitespace/comments,-whitespace/tab,-whitespace/braces,-whitespace/labels,-build/header_guard,-readability/casting,-build/include,-runtime/sizeof ' + i.abspath(), shell=True) - -def test(ctx): - "runs unit tests" - autowaf.pre_test(ctx, APPNAME, dirs=['.']) - for i in ctx.path.ant_glob('**/*-test'): - name = os.path.basename(i.abspath()) - os.environ['PATH'] = '.' + os.pathsep + os.getenv('PATH') - autowaf.run_test( - ctx, APPNAME, i.path_from(ctx.path.find_node('build')), dirs=['.'], name=i) - autowaf.post_test(ctx, APPNAME, dirs=['.']) - -class Dist(Scripting.Dist): - def execute(self): - 'Execute but do not call archive() since dist() has already done so.' - self.recurse([os.path.dirname(Context.g_module.root_path)]) - - def get_tar_path(self, node): - 'Resolve symbolic links to avoid broken links in tarball.' - return os.path.realpath(node.abspath()) - -class DistCheck(Dist, Scripting.DistCheck): - def execute(self): - Dist.execute(self) - self.check() - - def archive(self): - Dist.archive(self) - -def posts(ctx): - "generates news posts in Pelican Markdown format" - subdirs = specdirs(ctx.path) - dev_dist = 'http://lv2plug.in/spec/lv2-%s.tar.bz2' % VERSION - - try: - os.mkdir(os.path.join(out, 'posts')) - except: - pass - - # Get all entries (as in dist()) - top_entries = {} - for specdir in subdirs: - entries = autowaf.get_rdf_news(os.path.basename(specdir.abspath()), - ttl_files(ctx.path, specdir), - top_entries, - dev_dist = dev_dist) - - entries = autowaf.get_rdf_news('lv2', - ['lv2/lv2plug.in/ns/meta/meta.ttl'], - None, - top_entries, - dev_dist = dev_dist) - - autowaf.write_posts(entries, - { 'Author': 'drobilla' }, - os.path.join(out, 'posts')) - -def dist(ctx): - subdirs = specdirs(ctx.path) - dev_dist = 'http://lv2plug.in/spec/lv2-%s.tar.bz2' % VERSION - - # Write NEWS files in source directory - top_entries = {} - for specdir in subdirs: - entries = autowaf.get_rdf_news(os.path.basename(specdir.abspath()), - ttl_files(ctx.path, specdir), - top_entries, - dev_dist = dev_dist) - autowaf.write_news(entries, specdir.abspath() + '/NEWS') - - # Write top level amalgamated NEWS file - entries = autowaf.get_rdf_news('lv2', - ['lv2/lv2plug.in/ns/meta/meta.ttl'], - None, - top_entries, - dev_dist = dev_dist) - autowaf.write_news(entries, 'NEWS') - - # Build archive - ctx.archive() - - # Delete generated NEWS files from source directory - for i in subdirs + [ctx.path]: - try: - os.remove(os.path.join(i.abspath(), 'NEWS')) - except: - pass |