@@ -1,42 +0,0 @@ | |||||
--- src/state.c | |||||
+++ src/state.c | |||||
@@ -415,35 +415,18 @@ | |||||
LILV_API void | |||||
lilv_state_restore(const LilvState* state, | |||||
- LilvInstance* instance, | |||||
+ const LV2_State_Interface* iface, | |||||
+ LV2_Handle handle, | |||||
LilvSetPortValueFunc set_value, | |||||
void* user_data, | |||||
uint32_t flags, | |||||
const LV2_Feature *const * features) | |||||
{ | |||||
- if (!state) { | |||||
- LILV_ERROR("lilv_state_restore() called on NULL state\n"); | |||||
- return; | |||||
- } | |||||
- | |||||
- LV2_State_Map_Path map_path = { | |||||
- (LilvState*)state, abstract_path, absolute_path }; | |||||
- LV2_Feature map_feature = { LV2_STATE__mapPath, &map_path }; | |||||
- | |||||
- const LV2_Feature** sfeatures = add_features(features, &map_feature, NULL); | |||||
- | |||||
- const LV2_Descriptor* desc = instance ? instance->lv2_descriptor : NULL; | |||||
- const LV2_State_Interface* iface = (desc && desc->extension_data) | |||||
- ? (const LV2_State_Interface*)desc->extension_data(LV2_STATE__interface) | |||||
- : NULL; | |||||
- | |||||
if (iface) { | |||||
- iface->restore(instance->lv2_handle, retrieve_callback, | |||||
- (LV2_State_Handle)state, flags, sfeatures); | |||||
+ iface->restore(handle, retrieve_callback, | |||||
+ (LV2_State_Handle)state, flags, features); | |||||
} | |||||
- free(sfeatures); | |||||
- | |||||
if (set_value) { | |||||
lilv_state_emit_port_values(state, set_value, user_data); | |||||
} |
@@ -1,10 +0,0 @@ | |||||
--- src/util.c | |||||
+++ src/util.c | |||||
@@ -29,7 +29,6 @@ | |||||
#include <string.h> | |||||
#ifdef _WIN32 | |||||
-# define _WIN32_WINNT 0x0600 /* for CreateSymbolicLink */ | |||||
# include <windows.h> | |||||
# include <direct.h> | |||||
# include <io.h> |
@@ -1,470 +0,0 @@ | |||||
#!/usr/bin/env python | |||||
import os | |||||
import shutil | |||||
import subprocess | |||||
import sys | |||||
import waflib.Options as Options | |||||
import waflib.extras.autowaf as autowaf | |||||
import waflib.Build as Build | |||||
import waflib.Logs as Logs | |||||
# Library and package version (UNIX style major, minor, micro) | |||||
# major increment <=> incompatible changes | |||||
# minor increment <=> compatible changes (additions) | |||||
# micro increment <=> no interface changes | |||||
LILV_VERSION = '0.24.0' | |||||
LILV_MAJOR_VERSION = '0' | |||||
# Mandatory waf variables | |||||
APPNAME = 'lilv' # Package name for waf dist | |||||
VERSION = LILV_VERSION # Package version for waf dist | |||||
top = '.' # Source directory | |||||
out = 'build' # Build directory | |||||
test_plugins = [ | |||||
'bad_syntax', | |||||
'failed_instantiation', | |||||
'failed_lib_descriptor', | |||||
'lib_descriptor', | |||||
'missing_descriptor', | |||||
'missing_name', | |||||
'missing_plugin', | |||||
'missing_port', | |||||
'missing_port_name', | |||||
'new_version', | |||||
'old_version' | |||||
] | |||||
def options(opt): | |||||
opt.load('compiler_c') | |||||
opt.load('compiler_cxx') | |||||
opt.load('python') | |||||
autowaf.set_options(opt, test=True) | |||||
opt.add_option('--no-utils', action='store_true', dest='no_utils', | |||||
help='Do not build command line utilities') | |||||
opt.add_option('--bindings', action='store_true', dest='bindings', | |||||
help='Build python bindings') | |||||
opt.add_option('--dyn-manifest', action='store_true', dest='dyn_manifest', | |||||
help='Build support for dynamic manifests') | |||||
opt.add_option('--no-bash-completion', action='store_true', | |||||
dest='no_bash_completion', | |||||
help='Do not install bash completion script in CONFIGDIR') | |||||
opt.add_option('--static', action='store_true', dest='static', | |||||
help='Build static library') | |||||
opt.add_option('--no-shared', action='store_true', dest='no_shared', | |||||
help='Do not build shared library') | |||||
opt.add_option('--static-progs', action='store_true', dest='static_progs', | |||||
help='Build programs as static binaries') | |||||
opt.add_option('--default-lv2-path', type='string', default='', | |||||
dest='default_lv2_path', | |||||
help='Default LV2 path to use if LV2_PATH is unset') | |||||
def configure(conf): | |||||
conf.load('compiler_c') | |||||
if Options.options.bindings: | |||||
try: | |||||
conf.load('python') | |||||
conf.load('compiler_cxx') | |||||
conf.check_python_headers() | |||||
autowaf.define(conf, 'LILV_PYTHON', 1); | |||||
except: | |||||
Logs.warn('Failed to configure Python (%s)\n' % sys.exc_info()[1]) | |||||
autowaf.configure(conf) | |||||
autowaf.set_c99_mode(conf) | |||||
autowaf.display_header('Lilv Configuration') | |||||
conf.env.BASH_COMPLETION = not Options.options.no_bash_completion | |||||
conf.env.BUILD_UTILS = not Options.options.no_utils | |||||
conf.env.BUILD_SHARED = not Options.options.no_shared | |||||
conf.env.STATIC_PROGS = Options.options.static_progs | |||||
conf.env.BUILD_STATIC = (Options.options.static or | |||||
Options.options.static_progs) | |||||
if not conf.env.BUILD_SHARED and not conf.env.BUILD_STATIC: | |||||
conf.fatal('Neither a shared nor a static build requested') | |||||
autowaf.check_pkg(conf, 'lv2', uselib_store='LV2', | |||||
atleast_version='1.14.0', mandatory=True) | |||||
autowaf.check_pkg(conf, 'serd-0', uselib_store='SERD', | |||||
atleast_version='0.14.0', mandatory=True) | |||||
autowaf.check_pkg(conf, 'sord-0', uselib_store='SORD', | |||||
atleast_version='0.13.0', mandatory=True) | |||||
autowaf.check_pkg(conf, 'sratom-0', uselib_store='SRATOM', | |||||
atleast_version='0.4.0', mandatory=True) | |||||
autowaf.check_pkg(conf, 'sndfile', uselib_store='SNDFILE', | |||||
atleast_version='1.0.0', mandatory=False) | |||||
defines = ['_POSIX_C_SOURCE=200809L', '_BSD_SOURCE', '_DEFAULT_SOURCE'] | |||||
if conf.env.DEST_OS == 'darwin': | |||||
defines += ['_DARWIN_C_SOURCE'] | |||||
conf.check_cc(function_name='flock', | |||||
header_name='sys/file.h', | |||||
defines=defines, | |||||
define_name='HAVE_FLOCK', | |||||
mandatory=False) | |||||
conf.check_cc(function_name='fileno', | |||||
header_name='stdio.h', | |||||
defines=defines, | |||||
define_name='HAVE_FILENO', | |||||
mandatory=False) | |||||
conf.check_cc(function_name='clock_gettime', | |||||
header_name=['sys/time.h','time.h'], | |||||
defines=['_POSIX_C_SOURCE=200809L'], | |||||
define_name='HAVE_CLOCK_GETTIME', | |||||
uselib_store='CLOCK_GETTIME', | |||||
lib=['rt'], | |||||
mandatory=False) | |||||
conf.check_cc(define_name = 'HAVE_LIBDL', | |||||
lib = 'dl', | |||||
mandatory = False) | |||||
autowaf.define(conf, 'LILV_VERSION', LILV_VERSION) | |||||
if Options.options.dyn_manifest: | |||||
autowaf.define(conf, 'LILV_DYN_MANIFEST', 1) | |||||
lilv_path_sep = ':' | |||||
lilv_dir_sep = '/' | |||||
if conf.env.DEST_OS == 'win32': | |||||
lilv_path_sep = ';' | |||||
lilv_dir_sep = '\\\\' | |||||
autowaf.define(conf, 'LILV_PATH_SEP', lilv_path_sep) | |||||
autowaf.define(conf, 'LILV_DIR_SEP', lilv_dir_sep) | |||||
# Set default LV2 path | |||||
lv2_path = Options.options.default_lv2_path | |||||
if lv2_path == '': | |||||
if conf.env.DEST_OS == 'darwin': | |||||
lv2_path = lilv_path_sep.join(['~/Library/Audio/Plug-Ins/LV2', | |||||
'~/.lv2', | |||||
'/usr/local/lib/lv2', | |||||
'/usr/lib/lv2', | |||||
'/Library/Audio/Plug-Ins/LV2']) | |||||
elif conf.env.DEST_OS == 'haiku': | |||||
lv2_path = lilv_path_sep.join(['~/.lv2', | |||||
'/boot/common/add-ons/lv2']) | |||||
elif conf.env.DEST_OS == 'win32': | |||||
lv2_path = lilv_path_sep.join(['%APPDATA%\\\\LV2', | |||||
'%COMMONPROGRAMFILES%\\\\LV2']) | |||||
else: | |||||
libdirname = os.path.basename(conf.env.LIBDIR) | |||||
lv2_path = lilv_path_sep.join(['~/.lv2', | |||||
'/usr/%s/lv2' % libdirname, | |||||
'/usr/local/%s/lv2' % libdirname]) | |||||
autowaf.define(conf, 'LILV_DEFAULT_LV2_PATH', lv2_path) | |||||
autowaf.set_lib_env(conf, 'lilv', LILV_VERSION) | |||||
conf.write_config_header('lilv_config.h', remove=False) | |||||
autowaf.display_msg(conf, 'Default LV2_PATH', | |||||
conf.env.LILV_DEFAULT_LV2_PATH) | |||||
autowaf.display_msg(conf, 'Utilities', | |||||
bool(conf.env.BUILD_UTILS)) | |||||
autowaf.display_msg(conf, 'Unit tests', | |||||
bool(conf.env.BUILD_TESTS)) | |||||
autowaf.display_msg(conf, 'Dynamic manifest support', | |||||
bool(conf.env.LILV_DYN_MANIFEST)) | |||||
autowaf.display_msg(conf, 'Python bindings', | |||||
conf.is_defined('LILV_PYTHON')) | |||||
conf.undefine('LILV_DEFAULT_LV2_PATH') # Cmd line errors with VC++ | |||||
print('') | |||||
def build_util(bld, name, defines, libs=''): | |||||
obj = bld(features = 'c cprogram', | |||||
source = name + '.c', | |||||
includes = ['.', './src', './utils'], | |||||
use = 'liblilv', | |||||
target = name, | |||||
defines = defines, | |||||
install_path = '${BINDIR}') | |||||
autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2 ' + libs) | |||||
if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS: | |||||
obj.use = 'liblilv_static' | |||||
if bld.env.STATIC_PROGS: | |||||
if not bld.env.MSVC_COMPILER: | |||||
obj.lib = ['m'] | |||||
obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER | |||||
obj.linkflags = ['-static', '-Wl,--start-group'] | |||||
return obj | |||||
def build(bld): | |||||
# C/C++ Headers | |||||
includedir = '${INCLUDEDIR}/lilv-%s/lilv' % LILV_MAJOR_VERSION | |||||
bld.install_files(includedir, bld.path.ant_glob('lilv/*.h')) | |||||
bld.install_files(includedir, bld.path.ant_glob('lilv/*.hpp')) | |||||
lib_source = ''' | |||||
src/collections.c | |||||
src/instance.c | |||||
src/lib.c | |||||
src/node.c | |||||
src/plugin.c | |||||
src/pluginclass.c | |||||
src/port.c | |||||
src/query.c | |||||
src/scalepoint.c | |||||
src/state.c | |||||
src/ui.c | |||||
src/util.c | |||||
src/world.c | |||||
src/zix/tree.c | |||||
'''.split() | |||||
lib = [] | |||||
libflags = ['-fvisibility=hidden'] | |||||
defines = [] | |||||
if bld.is_defined('HAVE_LIBDL'): | |||||
lib += ['dl'] | |||||
if bld.env.DEST_OS == 'win32': | |||||
lib = [] | |||||
if bld.env.MSVC_COMPILER: | |||||
libflags = [] | |||||
defines = ['snprintf=_snprintf'] | |||||
# Pkgconfig file | |||||
autowaf.build_pc(bld, 'LILV', LILV_VERSION, LILV_MAJOR_VERSION, [], | |||||
{'LILV_MAJOR_VERSION' : LILV_MAJOR_VERSION, | |||||
'LILV_PKG_DEPS' : 'lv2 serd-0 sord-0 sratom-0', | |||||
'LILV_PKG_LIBS' : ' -l'.join([''] + lib)}) | |||||
# Shared Library | |||||
if bld.env.BUILD_SHARED: | |||||
obj = bld(features = 'c cshlib', | |||||
export_includes = ['.'], | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
name = 'liblilv', | |||||
target = 'lilv-%s' % LILV_MAJOR_VERSION, | |||||
vnum = LILV_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
defines = ['LILV_SHARED', 'LILV_INTERNAL'], | |||||
cflags = libflags, | |||||
lib = lib) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') | |||||
# Static library | |||||
if bld.env.BUILD_STATIC: | |||||
obj = bld(features = 'c cstlib', | |||||
export_includes = ['.'], | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
name = 'liblilv_static', | |||||
target = 'lilv-%s' % LILV_MAJOR_VERSION, | |||||
vnum = LILV_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
defines = defines + ['LILV_INTERNAL']) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') | |||||
if bld.env.BUILD_TESTS: | |||||
test_libs = lib | |||||
test_cflags = [''] | |||||
test_linkflags = [''] | |||||
if not bld.env.NO_COVERAGE: | |||||
test_cflags += ['--coverage'] | |||||
test_linkflags += ['--coverage'] | |||||
# Test plugin library | |||||
penv = bld.env.derive() | |||||
shlib_pattern = penv.cshlib_PATTERN | |||||
if shlib_pattern.startswith('lib'): | |||||
shlib_pattern = shlib_pattern[3:] | |||||
penv.cshlib_PATTERN = shlib_pattern | |||||
shlib_ext = shlib_pattern[shlib_pattern.rfind('.'):] | |||||
for p in ['test'] + test_plugins: | |||||
obj = bld(features = 'c cshlib', | |||||
env = penv, | |||||
source = 'test/%s.lv2/%s.c' % (p, p), | |||||
name = p, | |||||
target = 'test/%s.lv2/%s' % (p, p), | |||||
install_path = None, | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags, | |||||
lib = test_libs, | |||||
uselib = 'LV2') | |||||
for p in test_plugins: | |||||
if not bld.path.find_node('test/%s.lv2/test_%s.c' % (p, p)): | |||||
continue | |||||
obj = bld(features = 'c cprogram', | |||||
source = 'test/%s.lv2/test_%s.c' % (p, p), | |||||
target = 'test/test_%s' % p, | |||||
includes = ['.', './src'], | |||||
use = 'liblilv_profiled', | |||||
install_path = None, | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags, | |||||
lib = test_libs, | |||||
uselib = 'LV2') | |||||
autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') | |||||
# Test plugin data files | |||||
for p in ['test'] + test_plugins: | |||||
for i in [ 'manifest.ttl.in', p + '.ttl.in' ]: | |||||
bundle = 'test/%s.lv2/' % p | |||||
bld(features = 'subst', | |||||
source = bundle + i, | |||||
target = bundle + i.replace('.in', ''), | |||||
install_path = None, | |||||
SHLIB_EXT = shlib_ext) | |||||
# Static profiled library (for unit test code coverage) | |||||
obj = bld(features = 'c cstlib', | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
name = 'liblilv_profiled', | |||||
target = 'lilv_profiled', | |||||
install_path = None, | |||||
defines = defines + ['LILV_INTERNAL'], | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags, | |||||
lib = test_libs) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') | |||||
# Unit test program | |||||
testdir = os.path.abspath(autowaf.build_dir(APPNAME, 'test')) | |||||
bpath = os.path.join(testdir, 'test.lv2') | |||||
bpath = bpath.replace('\\', '/') | |||||
testdir = testdir.replace('\\', '/') | |||||
obj = bld(features = 'c cprogram', | |||||
source = 'test/lilv_test.c', | |||||
includes = ['.', './src'], | |||||
use = 'liblilv_profiled', | |||||
lib = test_libs, | |||||
target = 'test/lilv_test', | |||||
install_path = None, | |||||
defines = (defines + ['LILV_TEST_BUNDLE=\"%s/\"' % bpath] + | |||||
['LILV_TEST_DIR=\"%s/\"' % testdir]), | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD SRATOM LV2') | |||||
if bld.is_defined('LILV_PYTHON'): | |||||
# Copy Python bindings to build directory | |||||
bld(features = 'subst', | |||||
is_copy = True, | |||||
source = 'bindings/python/lilv.py', | |||||
target = 'lilv.py', | |||||
install_path = '${PYTHONDIR}') | |||||
# Copy Python unittest files | |||||
for i in [ 'test_api.py' ]: | |||||
bld(features = 'subst', | |||||
is_copy = True, | |||||
source = 'bindings/test/python/' + i, | |||||
target = 'bindings/' + i, | |||||
install_path = None) | |||||
# Build bindings test plugin | |||||
obj = bld(features = 'c cshlib', | |||||
env = penv, | |||||
source = 'bindings/test/bindings_test_plugin.c', | |||||
name = 'bindings_test_plugin', | |||||
target = 'bindings/bindings_test_plugin.lv2/bindings_test_plugin', | |||||
install_path = None, | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags, | |||||
lib = test_libs, | |||||
uselib = 'LV2') | |||||
# Bindings test plugin data files | |||||
for i in [ 'manifest.ttl.in', 'bindings_test_plugin.ttl.in' ]: | |||||
bld(features = 'subst', | |||||
source = 'bindings/test/' + i, | |||||
target = 'bindings/bindings_test_plugin.lv2/' + i.replace('.in', ''), | |||||
install_path = None, | |||||
SHLIB_EXT = shlib_ext) | |||||
# Utilities | |||||
if bld.env.BUILD_UTILS: | |||||
utils = ''' | |||||
utils/lilv-bench | |||||
utils/lv2info | |||||
utils/lv2ls | |||||
''' | |||||
for i in utils.split(): | |||||
build_util(bld, i, defines) | |||||
if bld.env.HAVE_SNDFILE: | |||||
obj = build_util(bld, 'utils/lv2apply', defines, 'SNDFILE') | |||||
# lv2bench (less portable than other utilities) | |||||
if bld.is_defined('HAVE_CLOCK_GETTIME') and not bld.env.STATIC_PROGS: | |||||
obj = build_util(bld, 'utils/lv2bench', defines) | |||||
if not bld.env.MSVC_COMPILER: | |||||
obj.lib = ['rt'] | |||||
# Documentation | |||||
autowaf.build_dox(bld, 'LILV', LILV_VERSION, top, out) | |||||
# Man pages | |||||
bld.install_files('${MANDIR}/man1', bld.path.ant_glob('doc/*.1')) | |||||
# Bash completion | |||||
if bld.env.BASH_COMPLETION: | |||||
bld.install_as( | |||||
'${SYSCONFDIR}/bash_completion.d/lilv', 'utils/lilv.bash_completion') | |||||
bld.add_post_fun(autowaf.run_ldconfig) | |||||
if bld.env.DOCS: | |||||
bld.add_post_fun(fix_docs) | |||||
def fix_docs(ctx): | |||||
if ctx.cmd == 'build': | |||||
autowaf.make_simple_dox(APPNAME) | |||||
def upload_docs(ctx): | |||||
import glob | |||||
os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/lilv/') | |||||
for page in glob.glob('doc/*.[1-8]'): | |||||
os.system('soelim %s | pre-grohtml troff -man -wall -Thtml | post-grohtml > build/%s.html' % (page, page)) | |||||
os.system('rsync -avz --delete -e ssh build/%s.html drobilla@drobilla.net:~/drobilla.net/man/' % page) | |||||
def test(ctx): | |||||
assert ctx.env.BUILD_TESTS, "You have run waf configure without the --test flag. No tests were run." | |||||
autowaf.pre_test(ctx, APPNAME) | |||||
if ctx.is_defined('LILV_PYTHON'): | |||||
os.environ['LD_LIBRARY_PATH'] = os.getcwd() | |||||
autowaf.run_tests(ctx, APPNAME, ['python -m unittest discover bindings/']) | |||||
os.environ['PATH'] = 'test' + os.pathsep + os.getenv('PATH') | |||||
Logs.pprint('GREEN', '') | |||||
autowaf.run_test(ctx, APPNAME, 'lilv_test', dirs=['./src','./test'], name='lilv_test') | |||||
for p in test_plugins: | |||||
test_prog = 'test_' + p + ' ' + ('test/%s.lv2/' % p) | |||||
if os.path.exists('test/test_' + p): | |||||
autowaf.run_test(ctx, APPNAME, test_prog, 0, | |||||
dirs=['./src','./test','./test/%s.lv2' % p]) | |||||
autowaf.post_test(ctx, APPNAME) | |||||
try: | |||||
shutil.rmtree('state') | |||||
except: | |||||
pass | |||||
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,-runtime/sizeof src/* lilv/*', shell=True) | |||||
def posts(ctx): | |||||
path = str(ctx.path.abspath()) | |||||
autowaf.news_to_posts( | |||||
os.path.join(path, 'NEWS'), | |||||
{'title' : 'Lilv', | |||||
'description' : autowaf.get_blurb(os.path.join(path, 'README')), | |||||
'dist_pattern' : 'http://download.drobilla.net/lilv-%s.tar.bz2'}, | |||||
{ 'Author' : 'drobilla', | |||||
'Tags' : 'Hacking, LAD, LV2, Lilv' }, | |||||
os.path.join(out, 'posts')) |
@@ -1,535 +0,0 @@ | |||||
#!/usr/bin/env python | |||||
import glob | |||||
import os | |||||
import shutil | |||||
import subprocess | |||||
import waflib.Logs as Logs | |||||
import waflib.Options as Options | |||||
import waflib.extras.autowaf as autowaf | |||||
# Library and package version (UNIX style major, minor, micro) | |||||
# major increment <=> incompatible changes | |||||
# minor increment <=> compatible changes (additions) | |||||
# micro increment <=> no interface changes | |||||
SERD_VERSION = '0.24.0' | |||||
SERD_MAJOR_VERSION = '0' | |||||
# Mandatory waf variables | |||||
APPNAME = 'serd' # Package name for waf dist | |||||
VERSION = SERD_VERSION # Package version for waf dist | |||||
top = '.' # Source directory | |||||
out = 'build' # Build directory | |||||
def options(opt): | |||||
opt.load('compiler_c') | |||||
autowaf.set_options(opt, test=True) | |||||
opt.add_option('--no-utils', action='store_true', dest='no_utils', | |||||
help='Do not build command line utilities') | |||||
opt.add_option('--stack-check', action='store_true', dest='stack_check', | |||||
help='Include runtime stack sanity checks') | |||||
opt.add_option('--static', action='store_true', dest='static', | |||||
help='Build static library') | |||||
opt.add_option('--no-shared', action='store_true', dest='no_shared', | |||||
help='Do not build shared library') | |||||
opt.add_option('--static-progs', action='store_true', dest='static_progs', | |||||
help='Build programs as static binaries') | |||||
opt.add_option('--largefile', action='store_true', dest='largefile', | |||||
help='Build with large file support on 32-bit systems') | |||||
opt.add_option('--no-posix', action='store_true', dest='no_posix', | |||||
help='Do not use posix_memalign, posix_fadvise, and fileno, even if present') | |||||
def configure(conf): | |||||
conf.load('compiler_c') | |||||
autowaf.configure(conf) | |||||
autowaf.display_header('Serd Configuration') | |||||
autowaf.set_c99_mode(conf) | |||||
conf.env.BUILD_UTILS = not Options.options.no_utils | |||||
conf.env.BUILD_SHARED = not Options.options.no_shared | |||||
conf.env.STATIC_PROGS = Options.options.static_progs | |||||
conf.env.BUILD_STATIC = (Options.options.static or | |||||
Options.options.static_progs) | |||||
if not conf.env.BUILD_SHARED and not conf.env.BUILD_STATIC: | |||||
conf.fatal('Neither a shared nor a static build requested') | |||||
if Options.options.stack_check: | |||||
autowaf.define(conf, 'SERD_STACK_CHECK', SERD_VERSION) | |||||
if Options.options.largefile: | |||||
conf.env.append_unique('DEFINES', ['_FILE_OFFSET_BITS=64']) | |||||
if not Options.options.no_posix: | |||||
conf.check(function_name = 'posix_memalign', | |||||
header_name = 'stdlib.h', | |||||
define_name = 'HAVE_POSIX_MEMALIGN', | |||||
defines = ['_POSIX_C_SOURCE=200809L'], | |||||
mandatory = False) | |||||
conf.check(function_name = 'posix_fadvise', | |||||
header_name = 'fcntl.h', | |||||
define_name = 'HAVE_POSIX_FADVISE', | |||||
defines = ['_POSIX_C_SOURCE=200809L'], | |||||
mandatory = False) | |||||
conf.check(function_name = 'fileno', | |||||
header_name = 'stdio.h', | |||||
define_name = 'HAVE_FILENO', | |||||
defines = ['_POSIX_C_SOURCE=200809L'], | |||||
mandatory = False) | |||||
autowaf.define(conf, 'SERD_VERSION', SERD_VERSION) | |||||
autowaf.set_lib_env(conf, 'serd', SERD_VERSION) | |||||
conf.write_config_header('serd_config.h', remove=False) | |||||
autowaf.display_msg(conf, 'Utilities', bool(conf.env.BUILD_UTILS)) | |||||
autowaf.display_msg(conf, 'Unit tests', bool(conf.env.BUILD_TESTS)) | |||||
print('') | |||||
lib_source = [ | |||||
'src/env.c', | |||||
'src/node.c', | |||||
'src/reader.c', | |||||
'src/string.c', | |||||
'src/uri.c', | |||||
'src/writer.c', | |||||
] | |||||
def build(bld): | |||||
# C Headers | |||||
includedir = '${INCLUDEDIR}/serd-%s/serd' % SERD_MAJOR_VERSION | |||||
bld.install_files(includedir, bld.path.ant_glob('serd/*.h')) | |||||
# Pkgconfig file | |||||
autowaf.build_pc(bld, 'SERD', SERD_VERSION, SERD_MAJOR_VERSION, [], | |||||
{'SERD_MAJOR_VERSION' : SERD_MAJOR_VERSION}) | |||||
libflags = ['-fvisibility=hidden'] | |||||
libs = ['m'] | |||||
defines = [] | |||||
if bld.env.MSVC_COMPILER: | |||||
libflags = [] | |||||
libs = [] | |||||
defines = ['snprintf=_snprintf'] | |||||
# Shared Library | |||||
if bld.env.BUILD_SHARED: | |||||
bld(features = 'c cshlib', | |||||
export_includes = ['.'], | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
lib = libs, | |||||
name = 'libserd', | |||||
target = 'serd-%s' % SERD_MAJOR_VERSION, | |||||
vnum = SERD_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
defines = defines + ['SERD_SHARED', 'SERD_INTERNAL'], | |||||
cflags = libflags) | |||||
# Static library | |||||
if bld.env.BUILD_STATIC: | |||||
bld(features = 'c cstlib', | |||||
export_includes = ['.'], | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
lib = libs, | |||||
name = 'libserd_static', | |||||
target = 'serd-%s' % SERD_MAJOR_VERSION, | |||||
vnum = SERD_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
defines = defines + ['SERD_INTERNAL']) | |||||
if bld.env.BUILD_TESTS: | |||||
test_libs = libs | |||||
test_cflags = [''] | |||||
test_linkflags = [''] | |||||
if not bld.env.NO_COVERAGE: | |||||
test_cflags += ['--coverage'] | |||||
test_linkflags += ['--coverage'] | |||||
# Profiled static library for test coverage | |||||
bld(features = 'c cstlib', | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
lib = test_libs, | |||||
name = 'libserd_profiled', | |||||
target = 'serd_profiled', | |||||
install_path = '', | |||||
defines = defines + ['SERD_INTERNAL'], | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
# Static profiled serdi for tests | |||||
bld(features = 'c cprogram', | |||||
source = 'src/serdi.c', | |||||
includes = ['.', './src'], | |||||
use = 'libserd_profiled', | |||||
lib = test_libs, | |||||
target = 'serdi_static', | |||||
install_path = '', | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
# Unit test program | |||||
bld(features = 'c cprogram', | |||||
source = 'tests/serd_test.c', | |||||
includes = ['.', './src'], | |||||
use = 'libserd_profiled', | |||||
lib = test_libs, | |||||
target = 'serd_test', | |||||
install_path = '', | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
# Utilities | |||||
if bld.env.BUILD_UTILS: | |||||
obj = bld(features = 'c cprogram', | |||||
source = 'src/serdi.c', | |||||
target = 'serdi', | |||||
includes = ['.', './src'], | |||||
use = 'libserd', | |||||
lib = libs, | |||||
install_path = '${BINDIR}') | |||||
if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS: | |||||
obj.use = 'libserd_static' | |||||
if bld.env.STATIC_PROGS: | |||||
obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER | |||||
obj.linkflags = ['-static'] | |||||
# Documentation | |||||
autowaf.build_dox(bld, 'SERD', SERD_VERSION, top, out) | |||||
# Man page | |||||
bld.install_files('${MANDIR}/man1', 'doc/serdi.1') | |||||
bld.add_post_fun(autowaf.run_ldconfig) | |||||
if bld.env.DOCS: | |||||
bld.add_post_fun(fix_docs) | |||||
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 amalgamate(ctx): | |||||
shutil.copy('serd/serd.h', 'build/serd.h') | |||||
amalgamation = open('build/serd.c', 'w') | |||||
serd_internal_h = open('src/serd_internal.h') | |||||
for l in serd_internal_h: | |||||
if l == '#include "serd/serd.h"\n': | |||||
amalgamation.write('#include "serd.h"\n') | |||||
else: | |||||
amalgamation.write(l) | |||||
serd_internal_h.close() | |||||
for f in lib_source: | |||||
fd = open(f) | |||||
amalgamation.write('\n/**\n @file %s\n*/' % f) | |||||
header = True | |||||
for l in fd: | |||||
if header: | |||||
if l == '*/\n': | |||||
header = False | |||||
else: | |||||
if l != '#include "serd_internal.h"\n': | |||||
amalgamation.write(l) | |||||
fd.close() | |||||
amalgamation.close() | |||||
for i in ['c', 'h']: | |||||
Logs.info('Wrote build/serd.%s' % i) | |||||
def fix_docs(ctx): | |||||
if ctx.cmd == 'build': | |||||
autowaf.make_simple_dox(APPNAME) | |||||
def upload_docs(ctx): | |||||
os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/serd/') | |||||
for page in glob.glob('doc/*.[1-8]'): | |||||
os.system('soelim %s | pre-grohtml troff -man -wall -Thtml | post-grohtml > build/%s.html' % (page, page)) | |||||
os.system('rsync -avz --delete -e ssh build/%s.html drobilla@drobilla.net:~/drobilla.net/man/' % page) | |||||
def file_equals(patha, pathb, subst_from='', subst_to=''): | |||||
fa = open(patha, 'rU') | |||||
fb = open(pathb, 'rU') | |||||
for line in fa: | |||||
if line.replace(subst_from, subst_to) != fb.readline().replace(subst_from, subst_to): | |||||
return False | |||||
fa.close() | |||||
fb.close() | |||||
return True | |||||
def earl_assertion(test, passed, asserter): | |||||
import datetime | |||||
asserter_str = '' | |||||
if asserter is not None: | |||||
asserter_str = '\n\tearl:assertedBy <%s> ;' % asserter | |||||
passed_str = 'earl:failed' | |||||
if passed: | |||||
passed_str = 'earl:passed' | |||||
return ''' | |||||
[] | |||||
a earl:Assertion ;%s | |||||
earl:subject <http://drobilla.net/sw/serd> ; | |||||
earl:test <%s> ; | |||||
earl:result [ | |||||
a earl:TestResult ; | |||||
earl:outcome %s ; | |||||
dc:date "%s"^^xsd:dateTime | |||||
] . | |||||
''' % (asserter_str, | |||||
test, | |||||
passed_str, | |||||
datetime.datetime.now().replace(microsecond=0).isoformat()) | |||||
def check_output(out_filename, check_filename, subst_from='', subst_to=''): | |||||
if not os.access(out_filename, os.F_OK): | |||||
Logs.pprint('RED', 'FAIL: output %s is missing' % out_filename) | |||||
elif not file_equals(check_filename, out_filename, subst_from, subst_to): | |||||
Logs.pprint('RED', 'FAIL: %s != %s' % (os.path.abspath(out_filename), | |||||
check_filename)) | |||||
else: | |||||
return True | |||||
return False | |||||
def test_thru(ctx, base, path, check_filename, flags): | |||||
in_filename = os.path.join(ctx.path.abspath(), path); | |||||
out_filename = path + '.thru' | |||||
command = ('%s %s -i turtle -o turtle -p foo "%s" "%s" | ' | |||||
'%s -i turtle -o ntriples -c foo - "%s" > %s') % ( | |||||
'serdi_static', flags.ljust(5), | |||||
in_filename, base, | |||||
'serdi_static', base, out_filename) | |||||
if autowaf.run_test(ctx, APPNAME, command, 0, name=out_filename): | |||||
autowaf.run_test(ctx, APPNAME, | |||||
[out_filename + '.check', check_output(out_filename, check_filename, '_:docid', '_:genid')], | |||||
1) | |||||
else: | |||||
Logs.pprint('RED', 'FAIL: error running %s' % command) | |||||
def test_manifest(ctx, srcdir, testdir, report, base_uri): | |||||
import rdflib | |||||
import urlparse | |||||
rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#') | |||||
rdfs = rdflib.Namespace('http://www.w3.org/2000/01/rdf-schema#') | |||||
mf = rdflib.Namespace('http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#') | |||||
rdft = rdflib.Namespace('http://www.w3.org/ns/rdftest#') | |||||
earl = rdflib.Namespace('http://www.w3.org/ns/earl#') | |||||
model = rdflib.ConjunctiveGraph() | |||||
model.parse(os.path.join(srcdir, 'tests', testdir, 'manifest.ttl'), | |||||
rdflib.URIRef(base_uri + 'manifest.ttl'), | |||||
format='n3') | |||||
asserter = '' | |||||
if os.getenv('USER') == 'drobilla': | |||||
asserter = 'http://drobilla.net/drobilla#me' | |||||
def run_test(action_node, expected_return): | |||||
output = os.path.join('tests', testdir, action_node + '.out') | |||||
action = os.path.join(srcdir, 'tests', testdir, action_node) | |||||
rel = os.path.relpath(action, os.path.join(srcdir, 'tests', testdir)) | |||||
command = 'serdi_static -f "%s" "%s" > %s' % (action, base_uri + rel, output) | |||||
return autowaf.run_test(ctx, APPNAME, command, expected_return, name=str(action)) | |||||
def run_tests(test_class, expected_return, check_result=False): | |||||
autowaf.begin_tests(ctx, APPNAME, str(test_class)) | |||||
for i in sorted(model.triples([None, rdf.type, test_class])): | |||||
test = i[0] | |||||
name = model.value(test, mf.name, None) | |||||
action_node = model.value(test, mf.action, None)[len(base_uri):] | |||||
passed = run_test(action_node, expected_return) | |||||
if passed and check_result: | |||||
result_node = model.value(test, mf.result, None)[len(base_uri):] | |||||
action = os.path.join('tests', testdir, action_node) | |||||
output = action + '.out' | |||||
result = os.path.join(srcdir, 'tests', testdir, result_node) | |||||
passed = check_output(output, result) | |||||
test_thru(ctx, base_uri + action_node, action, result, "") | |||||
report.write(earl_assertion(test, passed, asserter)) | |||||
autowaf.end_tests(ctx, APPNAME, str(test_class)) | |||||
run_tests(rdft.TestTurtlePositiveSyntax, 0) | |||||
run_tests(rdft.TestTurtleNegativeSyntax, 1) | |||||
run_tests(rdft.TestTurtleNegativeEval, 1) | |||||
run_tests(rdft.TestTurtleEval, 0, True) | |||||
def test(ctx): | |||||
blddir = autowaf.build_dir(APPNAME, 'tests') | |||||
for i in ['', 'bad', 'good', 'new', 'TurtleTests', 'extra']: | |||||
try: | |||||
os.makedirs(os.path.join(blddir, i)) | |||||
except: | |||||
pass | |||||
for i in glob.glob(blddir + '/*.*'): | |||||
os.remove(i) | |||||
srcdir = ctx.path.abspath() | |||||
orig_dir = os.path.abspath(os.curdir) | |||||
os.chdir(os.path.join(srcdir, 'tests', 'good')) | |||||
old_good_tests = glob.glob('*.ttl') | |||||
old_good_tests.sort() | |||||
old_good_tests.remove('manifest.ttl') | |||||
good_tests = { 'good': old_good_tests } | |||||
os.chdir(orig_dir) | |||||
os.chdir(srcdir) | |||||
bad_tests = glob.glob('tests/bad/*.ttl') | |||||
bad_tests.sort() | |||||
os.chdir(orig_dir) | |||||
autowaf.pre_test(ctx, APPNAME) | |||||
os.environ['PATH'] = '.' + os.pathsep + os.getenv('PATH') | |||||
autowaf.run_test(ctx, APPNAME, 'serd_test', dirs=['.']) | |||||
autowaf.run_tests(ctx, APPNAME, [ | |||||
'serdi_static -q -o turtle "%s/tests/good/base.ttl" "base.ttl" > tests/good/base.ttl.out' % srcdir | |||||
], 0, name='base') | |||||
if not file_equals('%s/tests/good/base.ttl' % srcdir, 'tests/good/base.ttl.out'): | |||||
Logs.pprint('RED', 'FAIL: build/tests/base.ttl.out is incorrect') | |||||
nul = os.devnull | |||||
autowaf.run_tests(ctx, APPNAME, [ | |||||
'serdi_static "file://%s/tests/good/manifest.ttl" > %s' % (srcdir, nul), | |||||
# 'serdi_static %s/tests/good/UTF-8.ttl > %s' % (srcdir, nul), | |||||
'serdi_static -v > %s' % nul, | |||||
'serdi_static -h > %s' % nul, | |||||
'serdi_static -s "<foo> a <#Thingie> ." > %s' % nul, | |||||
'serdi_static %s > %s' % (nul, nul) | |||||
], 0, name='serdi-cmd-good') | |||||
# Test read error by reading a directory | |||||
autowaf.run_test(ctx, APPNAME, 'serdi_static "file://%s/"' % srcdir, | |||||
1, name='read_error') | |||||
# Test write error by writing to /dev/full | |||||
if os.path.exists('/dev/full'): | |||||
autowaf.run_test(ctx, APPNAME, | |||||
'serdi_static "file://%s/tests/good/manifest.ttl" > /dev/full' % srcdir, | |||||
1, name='write_error') | |||||
autowaf.run_tests(ctx, APPNAME, [ | |||||
'serdi_static -q "file://%s/tests/bad-id-clash.ttl" > %s' % (srcdir, nul), | |||||
'serdi_static > %s' % nul, | |||||
'serdi_static ftp://example.org/unsupported.ttl > %s' % nul, | |||||
'serdi_static -i > %s' % nul, | |||||
'serdi_static -o > %s' % nul, | |||||
'serdi_static -z > %s' % nul, | |||||
'serdi_static -p > %s' % nul, | |||||
'serdi_static -c > %s' % nul, | |||||
'serdi_static -r > %s' % nul, | |||||
'serdi_static -i illegal > %s' % nul, | |||||
'serdi_static -o illegal > %s' % nul, | |||||
'serdi_static -i turtle > %s' % nul, | |||||
'serdi_static /no/such/file > %s' % nul], | |||||
1, name='serdi-cmd-bad') | |||||
def test_base(test): | |||||
return ('http://www.w3.org/2001/sw/DataAccess/df1/tests/' | |||||
+ test.replace('\\', '/')) | |||||
# Good tests | |||||
for tdir, tests in good_tests.items(): | |||||
commands = [] | |||||
for test in tests: | |||||
for lax in ['', '-l']: | |||||
path = os.path.join('tests', tdir, test) | |||||
commands += [ 'serdi_static %s -f "%s" "%s" > %s.out' % ( | |||||
lax, os.path.join(srcdir, path), test_base(test), path) ] | |||||
autowaf.run_tests(ctx, APPNAME, commands, 0, name=tdir) | |||||
verify_tests = [] | |||||
for test in tests: | |||||
check_filename = os.path.join( | |||||
srcdir, 'tests', tdir, test.replace('.ttl', '.nt')) | |||||
out_filename = os.path.join('tests', tdir, test + '.out') | |||||
if check_output(out_filename, check_filename): | |||||
verify_tests += [[out_filename, 0]] | |||||
else: | |||||
verify_tests += [[out_filename, 1]] | |||||
autowaf.run_tests(ctx, APPNAME, verify_tests, name='verify_turtle_to_ntriples') | |||||
# Bad tests | |||||
commands = [] | |||||
for test in bad_tests: | |||||
for lax in ['', '-l']: | |||||
commands += [ 'serdi_static %s -q "%s" "%s" > %s.out' % ( | |||||
lax, os.path.join(srcdir, test), test_base(test), test) ] | |||||
autowaf.run_tests(ctx, APPNAME, commands, 1, name='bad') | |||||
# Don't do a round-trip test for test-id.ttl, IDs have changed | |||||
good_tests['good'].remove('test-id.ttl') | |||||
# Round-trip good tests | |||||
autowaf.begin_tests(ctx, APPNAME, 'round_trip_good') | |||||
for tdir, tests in good_tests.items(): | |||||
thru_tests = tests; | |||||
commands = [] | |||||
num = 0 | |||||
for test in thru_tests: | |||||
num += 1 | |||||
flags = '' | |||||
if (num % 2 == 0): | |||||
flags += '-b' | |||||
if (num % 5 == 0): | |||||
flags += ' -f' | |||||
if (num % 3 == 0): | |||||
flags += ' -r http://www.w3.org/' | |||||
if (num % 7 == 0): | |||||
flags += ' -e' | |||||
path = os.path.join('tests', tdir, test) | |||||
check = os.path.join(srcdir, path.replace('.ttl', '.nt')) | |||||
test_thru(ctx, test_base(test), path, check, flags) | |||||
autowaf.end_tests(ctx, APPNAME, 'round_trip_good') | |||||
# New manifest-driven tests | |||||
try: | |||||
report = open('earl.ttl', 'w') | |||||
report.write('''@prefix earl: <http://www.w3.org/ns/earl#> . | |||||
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n''') | |||||
serd_ttl = open(os.path.join(srcdir, 'serd.ttl')) | |||||
for line in serd_ttl: | |||||
report.write(line) | |||||
serd_ttl.close() | |||||
turtle_tests = 'http://www.w3.org/2013/TurtleTests/' | |||||
test_manifest(ctx, srcdir, 'TurtleTests', report, turtle_tests) | |||||
report.close() | |||||
except: | |||||
pass | |||||
autowaf.post_test(ctx, APPNAME) | |||||
def posts(ctx): | |||||
path = str(ctx.path.abspath()) | |||||
autowaf.news_to_posts( | |||||
os.path.join(path, 'NEWS'), | |||||
{'title' : 'Serd', | |||||
'description' : autowaf.get_blurb(os.path.join(path, 'README')), | |||||
'dist_pattern' : 'http://download.drobilla.net/serd-%s.tar.bz2'}, | |||||
{ 'Author' : 'drobilla', | |||||
'Tags' : 'Hacking, RDF, Serd' }, | |||||
os.path.join(out, 'posts')) |
@@ -1,356 +0,0 @@ | |||||
#!/usr/bin/env python | |||||
import glob | |||||
import os | |||||
import subprocess | |||||
import sys | |||||
import waflib.Logs as Logs | |||||
import waflib.Options as Options | |||||
import waflib.extras.autowaf as autowaf | |||||
# Library and package version (UNIX style major, minor, micro) | |||||
# major increment <=> incompatible changes | |||||
# minor increment <=> compatible changes (additions) | |||||
# micro increment <=> no interface changes | |||||
SORD_VERSION = '0.16.0' | |||||
SORD_MAJOR_VERSION = '0' | |||||
# Mandatory waf variables | |||||
APPNAME = 'sord' # Package name for waf dist | |||||
VERSION = SORD_VERSION # Package version for waf dist | |||||
top = '.' # Source directory | |||||
out = 'build' # Build directory | |||||
def options(opt): | |||||
opt.load('compiler_c') | |||||
opt.load('compiler_cxx') | |||||
autowaf.set_options(opt, test=True) | |||||
opt.add_option('--no-utils', action='store_true', dest='no_utils', | |||||
help='Do not build command line utilities') | |||||
opt.add_option('--static', action='store_true', dest='static', | |||||
help='Build static library') | |||||
opt.add_option('--no-shared', action='store_true', dest='no_shared', | |||||
help='Do not build shared library') | |||||
opt.add_option('--static-progs', action='store_true', dest='static_progs', | |||||
help='Build programs as static binaries') | |||||
opt.add_option('--dump', type='string', default='', dest='dump', | |||||
help='Dump debugging output (iter, search, write, all)') | |||||
def configure(conf): | |||||
conf.load('compiler_c') | |||||
if Options.options.build_tests: | |||||
try: | |||||
conf.load('compiler_cxx') | |||||
except: | |||||
Logs.warn("No C++ compiler, sordmm.hpp compile test skipped") | |||||
pass | |||||
autowaf.configure(conf) | |||||
autowaf.set_c99_mode(conf) | |||||
autowaf.display_header('Sord configuration') | |||||
conf.env.BUILD_UTILS = not Options.options.no_utils | |||||
conf.env.BUILD_SHARED = not Options.options.no_shared | |||||
conf.env.STATIC_PROGS = Options.options.static_progs | |||||
conf.env.BUILD_STATIC = (Options.options.static or | |||||
Options.options.static_progs) | |||||
autowaf.check_pkg(conf, 'serd-0', uselib_store='SERD', | |||||
atleast_version='0.22.4', mandatory=True) | |||||
autowaf.check_pkg(conf, 'libpcre', uselib_store='PCRE', mandatory=False) | |||||
if conf.env.HAVE_PCRE: | |||||
if conf.check(cflags=['-pthread'], mandatory=False): | |||||
conf.env.PTHREAD_CFLAGS = ['-pthread'] | |||||
conf.env.PTHREAD_LINKFLAGS = ['-pthread'] | |||||
elif conf.check(linkflags=['-lpthread'], mandatory=False): | |||||
conf.env.PTHREAD_CFLAGS = [] | |||||
conf.env.PTHREAD_LINKFLAGS = ['-lpthread'] | |||||
else: | |||||
conf.env.PTHREAD_CFLAGS = [] | |||||
conf.env.PTHREAD_LINKFLAGS = [] | |||||
# Parse dump options and define things accordingly | |||||
dump = Options.options.dump.split(',') | |||||
all = 'all' in dump | |||||
if all or 'iter' in dump: | |||||
autowaf.define(conf, 'SORD_DEBUG_ITER', 1) | |||||
if all or 'search' in dump: | |||||
autowaf.define(conf, 'SORD_DEBUG_SEARCH', 1) | |||||
if all or 'write' in dump: | |||||
autowaf.define(conf, 'SORD_DEBUG_WRITE', 1) | |||||
autowaf.define(conf, 'SORD_VERSION', SORD_VERSION) | |||||
autowaf.set_lib_env(conf, 'sord', SORD_VERSION) | |||||
conf.write_config_header('sord_config.h', remove=False) | |||||
autowaf.display_msg(conf, 'Utilities', bool(conf.env.BUILD_UTILS)) | |||||
autowaf.display_msg(conf, 'Unit tests', bool(conf.env.BUILD_TESTS)) | |||||
autowaf.display_msg(conf, 'Debug dumping', dump) | |||||
print('') | |||||
def build(bld): | |||||
# C/C++ Headers | |||||
includedir = '${INCLUDEDIR}/sord-%s/sord' % SORD_MAJOR_VERSION | |||||
bld.install_files(includedir, bld.path.ant_glob('sord/*.h')) | |||||
bld.install_files(includedir, bld.path.ant_glob('sord/*.hpp')) | |||||
# Pkgconfig file | |||||
autowaf.build_pc(bld, 'SORD', SORD_VERSION, SORD_MAJOR_VERSION, 'SERD', | |||||
{'SORD_MAJOR_VERSION' : SORD_MAJOR_VERSION}) | |||||
source = 'src/sord.c src/syntax.c' | |||||
libflags = ['-fvisibility=hidden'] | |||||
libs = ['m'] | |||||
defines = [] | |||||
if bld.env.MSVC_COMPILER: | |||||
libflags = [] | |||||
libs = [] | |||||
defines = ['snprintf=_snprintf'] | |||||
# Shared Library | |||||
if bld.env.BUILD_SHARED: | |||||
obj = bld(features = 'c cshlib', | |||||
source = source, | |||||
includes = ['.', './src'], | |||||
export_includes = ['.'], | |||||
name = 'libsord', | |||||
target = 'sord-%s' % SORD_MAJOR_VERSION, | |||||
vnum = SORD_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
libs = libs, | |||||
defines = defines + ['SORD_SHARED', 'SORD_INTERNAL'], | |||||
cflags = libflags) | |||||
autowaf.use_lib(bld, obj, 'SERD') | |||||
# Static Library | |||||
if bld.env.BUILD_STATIC: | |||||
obj = bld(features = 'c cstlib', | |||||
source = source, | |||||
includes = ['.', './src'], | |||||
export_includes = ['.'], | |||||
name = 'libsord_static', | |||||
target = 'sord-%s' % SORD_MAJOR_VERSION, | |||||
vnum = SORD_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
libs = libs, | |||||
defines = ['SORD_INTERNAL']) | |||||
autowaf.use_lib(bld, obj, 'SERD') | |||||
if bld.env.BUILD_TESTS: | |||||
test_libs = libs | |||||
test_cflags = [''] | |||||
test_linkflags = [''] | |||||
if not bld.env.NO_COVERAGE: | |||||
test_cflags += ['--coverage'] | |||||
test_linkflags += ['--coverage'] | |||||
# Profiled static library for test coverage | |||||
obj = bld(features = 'c cstlib', | |||||
source = source, | |||||
includes = ['.', './src'], | |||||
name = 'libsord_profiled', | |||||
target = 'sord_profiled', | |||||
install_path = '', | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags, | |||||
lib = test_libs) | |||||
autowaf.use_lib(bld, obj, 'SERD') | |||||
# Unit test program | |||||
obj = bld(features = 'c cprogram', | |||||
source = 'src/sord_test.c', | |||||
includes = ['.', './src'], | |||||
use = 'libsord_profiled', | |||||
lib = test_libs, | |||||
target = 'sord_test', | |||||
install_path = '', | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
autowaf.use_lib(bld, obj, 'SERD') | |||||
# Static profiled sordi for tests | |||||
obj = bld(features = 'c cprogram', | |||||
source = 'src/sordi.c', | |||||
includes = ['.', './src'], | |||||
use = 'libsord_profiled', | |||||
lib = test_libs, | |||||
target = 'sordi_static', | |||||
install_path = '', | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
autowaf.use_lib(bld, obj, 'SERD') | |||||
# C++ build test | |||||
if bld.env.COMPILER_CXX: | |||||
obj = bld(features = 'cxx cxxprogram', | |||||
source = 'src/sordmm_test.cpp', | |||||
includes = ['.', './src'], | |||||
use = 'libsord_profiled', | |||||
lib = test_libs, | |||||
target = 'sordmm_test', | |||||
install_path = '', | |||||
defines = defines, | |||||
cxxflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
autowaf.use_lib(bld, obj, 'SERD') | |||||
# Utilities | |||||
if bld.env.BUILD_UTILS: | |||||
utils = ['sordi'] | |||||
if bld.env.HAVE_PCRE: | |||||
utils += ['sord_validate'] | |||||
for i in utils: | |||||
obj = bld(features = 'c cprogram', | |||||
source = 'src/%s.c' % i, | |||||
includes = ['.', './src'], | |||||
use = 'libsord', | |||||
lib = libs, | |||||
target = i, | |||||
install_path = '${BINDIR}', | |||||
defines = defines) | |||||
if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS: | |||||
obj.use = 'libsord_static' | |||||
if bld.env.STATIC_PROGS: | |||||
obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER | |||||
obj.linkflags = ['-static', '-Wl,--start-group'] | |||||
autowaf.use_lib(bld, obj, 'SERD') | |||||
if i == 'sord_validate': | |||||
autowaf.use_lib(bld, obj, 'PCRE') | |||||
obj.cflags = bld.env.PTHREAD_CFLAGS | |||||
obj.linkflags = bld.env.PTHREAD_LINKFLAGS | |||||
# Documentation | |||||
autowaf.build_dox(bld, 'SORD', SORD_VERSION, top, out) | |||||
# Man pages | |||||
bld.install_files('${MANDIR}/man1', bld.path.ant_glob('doc/*.1')) | |||||
bld.add_post_fun(autowaf.run_ldconfig) | |||||
if bld.env.DOCS: | |||||
bld.add_post_fun(fix_docs) | |||||
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/*.* sord/* src/zix/*.*', shell=True) | |||||
def fix_docs(ctx): | |||||
if ctx.cmd == 'build': | |||||
autowaf.make_simple_dox(APPNAME) | |||||
def upload_docs(ctx): | |||||
os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/sord/') | |||||
for page in glob.glob('doc/*.[1-8]'): | |||||
os.system('soelim %s | pre-grohtml troff -man -wall -Thtml | post-grohtml > build/%s.html' % (page, page)) | |||||
os.system('rsync -avz --delete -e ssh build/%s.html drobilla@drobilla.net:~/drobilla.net/man/' % page) | |||||
def test(ctx): | |||||
blddir = autowaf.build_dir(APPNAME, 'tests') | |||||
try: | |||||
os.makedirs(blddir) | |||||
except: | |||||
pass | |||||
for i in glob.glob(blddir + '/*.*'): | |||||
os.remove(i) | |||||
srcdir = ctx.path.abspath() | |||||
orig_dir = os.path.abspath(os.curdir) | |||||
os.chdir(srcdir) | |||||
good_tests = glob.glob('tests/test-*.ttl') | |||||
good_tests.sort() | |||||
os.chdir(orig_dir) | |||||
autowaf.pre_test(ctx, APPNAME) | |||||
os.environ['PATH'] = '.' + os.pathsep + os.getenv('PATH') | |||||
nul = os.devnull | |||||
snippet = '<s> <p> <o> .' | |||||
if sys.platform == "win32": | |||||
snippet = snippet.replace('<', '^<').replace('>', '^>') | |||||
else: | |||||
snippet = '"%s"' % snippet | |||||
autowaf.run_tests(ctx, APPNAME, [ | |||||
'sordi_static "file://%s/tests/manifest.ttl" > %s' % (srcdir, nul), | |||||
'sordi_static "%s/tests/UTF-8.ttl" > %s' % (srcdir, nul), | |||||
'sordi_static -v > %s' % nul, | |||||
'sordi_static -h > %s' % nul, | |||||
'sordi_static -s "<foo> a <#Thingie> ." file:///test > %s' % nul, | |||||
'echo %s | sordi_static - http://example.org/' % snippet, | |||||
'echo %s | sordi_static -o turtle - http://example.org/' % snippet, | |||||
'sordi_static %s > %s' % (nul, nul)], | |||||
0, name='sordi-cmd-good') | |||||
# Test read error by reading a directory | |||||
autowaf.run_test(ctx, APPNAME, 'sordi_static "file://%s/"' % srcdir, | |||||
1, name='read_error') | |||||
# Test write error by writing to /dev/full | |||||
if os.path.exists('/dev/full'): | |||||
autowaf.run_test(ctx, APPNAME, | |||||
'sordi_static "file://%s/tests/good/manifest.ttl" > /dev/full' % srcdir, | |||||
1, name='write_error') | |||||
autowaf.run_tests(ctx, APPNAME, [ | |||||
'sordi_static > %s' % nul, | |||||
'sordi_static ftp://example.org/unsupported.ttl > %s' % nul, | |||||
'sordi_static -i > %s' % nul, | |||||
'sordi_static -o > %s' % nul, | |||||
'sordi_static -z > %s' % nul, | |||||
'sordi_static -p > %s' % nul, | |||||
'sordi_static -c > %s' % nul, | |||||
'sordi_static -i illegal > %s' % nul, | |||||
'sordi_static -o illegal > %s' % nul, | |||||
'sordi_static -i turtle > %s' % nul, | |||||
'sordi_static -i ntriples > %s' % nul, | |||||
'echo "<s> <p> <o> ." | sordi_static -', | |||||
'sordi_static /no/such/file > %s' % nul], | |||||
1, name='sordi-cmd-bad') | |||||
Logs.pprint('GREEN', '') | |||||
autowaf.run_test(ctx, APPNAME, 'sord_test', name='sord_test') | |||||
commands = [] | |||||
for test in good_tests: | |||||
base_uri = 'http://www.w3.org/2001/sw/DataAccess/df1/' + test.replace('\\', '/') | |||||
commands += [ 'sordi_static "%s" "%s" > %s.out' % ( | |||||
os.path.join(srcdir, test), base_uri, test) ] | |||||
autowaf.run_tests(ctx, APPNAME, commands, 0, name='good') | |||||
verify_tests = [] | |||||
for test in good_tests: | |||||
out_filename = test + '.out' | |||||
cmp_filename = srcdir + '/' + test.replace('.ttl', '.out') | |||||
if not os.access(out_filename, os.F_OK): | |||||
Logs.pprint('RED', '** FAIL %s output is missing' % test) | |||||
verify_tests += [[out_filename, 1]] | |||||
else: | |||||
out_lines = sorted(open(out_filename).readlines()) | |||||
cmp_lines = sorted(open(cmp_filename).readlines()) | |||||
if out_lines != cmp_lines: | |||||
verify_tests += [[out_filename, 1]] | |||||
else: | |||||
verify_tests += [[out_filename, 0]] | |||||
autowaf.run_tests(ctx, APPNAME, verify_tests, name='verify_turtle_to_ntriples') | |||||
autowaf.post_test(ctx, APPNAME) | |||||
def posts(ctx): | |||||
path = str(ctx.path.abspath()) | |||||
autowaf.news_to_posts( | |||||
os.path.join(path, 'NEWS'), | |||||
{'title' : 'Sord', | |||||
'description' : autowaf.get_blurb(os.path.join(path, 'README')), | |||||
'dist_pattern' : 'http://download.drobilla.net/sord-%s.tar.bz2'}, | |||||
{ 'Author' : 'drobilla', | |||||
'Tags' : 'Hacking, RDF, Sord' }, | |||||
os.path.join(out, 'posts')) |
@@ -1,172 +0,0 @@ | |||||
#!/usr/bin/env python | |||||
import os | |||||
import subprocess | |||||
import waflib.Logs as Logs | |||||
import waflib.Options as Options | |||||
import waflib.extras.autowaf as autowaf | |||||
# Library and package version (UNIX style major, minor, micro) | |||||
# major increment <=> incompatible changes | |||||
# minor increment <=> compatible changes (additions) | |||||
# micro increment <=> no interface changes | |||||
SRATOM_VERSION = '0.6.0' | |||||
SRATOM_MAJOR_VERSION = '0' | |||||
# Mandatory waf variables | |||||
APPNAME = 'sratom' # Package name for waf dist | |||||
VERSION = SRATOM_VERSION # Package version for waf dist | |||||
top = '.' # Source directory | |||||
out = 'build' # Build directory | |||||
def options(opt): | |||||
opt.load('compiler_c') | |||||
autowaf.set_options(opt, test=True) | |||||
opt.add_option('--static', action='store_true', dest='static', | |||||
help="Build static library") | |||||
opt.add_option('--no-shared', action='store_true', dest='no_shared', | |||||
help='Do not build shared library') | |||||
def configure(conf): | |||||
conf.load('compiler_c') | |||||
autowaf.configure(conf) | |||||
autowaf.set_c99_mode(conf) | |||||
autowaf.display_header('Sratom Configuration') | |||||
conf.env.BUILD_SHARED = not Options.options.no_shared | |||||
conf.env.BUILD_STATIC = Options.options.static | |||||
if not conf.env.BUILD_SHARED and not conf.env.BUILD_STATIC: | |||||
conf.fatal('Neither a shared nor a static build requested') | |||||
autowaf.check_pkg(conf, 'lv2', uselib_store='LV2', | |||||
atleast_version='1.10.0', mandatory=True) | |||||
autowaf.check_pkg(conf, 'serd-0', uselib_store='SERD', | |||||
atleast_version='0.23.0', mandatory=True) | |||||
autowaf.check_pkg(conf, 'sord-0', uselib_store='SORD', | |||||
atleast_version='0.12.0', mandatory=True) | |||||
autowaf.define(conf, 'SRATOM_VERSION', SRATOM_VERSION) | |||||
autowaf.set_lib_env(conf, 'sratom', SRATOM_VERSION) | |||||
conf.write_config_header('sratom_config.h', remove=False) | |||||
autowaf.display_msg(conf, "Unit tests", bool(conf.env.BUILD_TESTS)) | |||||
print('') | |||||
lib_source = ['src/sratom.c'] | |||||
def build(bld): | |||||
# C Headers | |||||
includedir = '${INCLUDEDIR}/sratom-%s/sratom' % SRATOM_MAJOR_VERSION | |||||
bld.install_files(includedir, bld.path.ant_glob('sratom/*.h')) | |||||
# Pkgconfig file | |||||
autowaf.build_pc(bld, 'SRATOM', SRATOM_VERSION, SRATOM_MAJOR_VERSION, | |||||
['SERD', 'SORD', 'LV2'], | |||||
{'SRATOM_MAJOR_VERSION' : SRATOM_MAJOR_VERSION}) | |||||
libflags = ['-fvisibility=hidden'] | |||||
libs = ['m'] | |||||
defines = [] | |||||
if bld.env.MSVC_COMPILER: | |||||
libflags = [] | |||||
libs = [] | |||||
defines = ['snprintf=_snprintf'] | |||||
# Shared Library | |||||
if bld.env.BUILD_SHARED: | |||||
obj = bld(features = 'c cshlib', | |||||
export_includes = ['.'], | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
lib = libs, | |||||
name = 'libsratom', | |||||
target = 'sratom-%s' % SRATOM_MAJOR_VERSION, | |||||
vnum = SRATOM_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
defines = defines + ['SRATOM_SHARED', 'SRATOM_INTERNAL'], | |||||
cflags = libflags) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD LV2') | |||||
# Static library | |||||
if bld.env.BUILD_STATIC: | |||||
obj = bld(features = 'c cstlib', | |||||
export_includes = ['.'], | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
lib = libs, | |||||
name = 'libsratom_static', | |||||
target = 'sratom-%s' % SRATOM_MAJOR_VERSION, | |||||
vnum = SRATOM_VERSION, | |||||
install_path = '${LIBDIR}', | |||||
defines = defines + ['SRATOM_INTERNAL']) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD LV2') | |||||
if bld.env.BUILD_TESTS: | |||||
test_libs = libs | |||||
test_cflags = [''] | |||||
test_linkflags = [''] | |||||
if not bld.env.NO_COVERAGE: | |||||
test_cflags += ['--coverage'] | |||||
test_linkflags += ['--coverage'] | |||||
# Static library (for unit test code coverage) | |||||
obj = bld(features = 'c cstlib', | |||||
source = lib_source, | |||||
includes = ['.', './src'], | |||||
lib = test_libs, | |||||
name = 'libsratom_profiled', | |||||
target = 'sratom_profiled', | |||||
install_path = '', | |||||
defines = defines + ['SRATOM_INTERNAL'], | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD LV2') | |||||
# Unit test program | |||||
obj = bld(features = 'c cprogram', | |||||
source = 'tests/sratom_test.c', | |||||
includes = ['.', './src'], | |||||
use = 'libsratom_profiled', | |||||
lib = test_libs, | |||||
target = 'sratom_test', | |||||
install_path = '', | |||||
defines = defines, | |||||
cflags = test_cflags, | |||||
linkflags = test_linkflags) | |||||
autowaf.use_lib(bld, obj, 'SERD SORD LV2') | |||||
# Documentation | |||||
autowaf.build_dox(bld, 'SRATOM', SRATOM_VERSION, top, out) | |||||
bld.add_post_fun(autowaf.run_ldconfig) | |||||
if bld.env.DOCS: | |||||
bld.add_post_fun(fix_docs) | |||||
def test(ctx): | |||||
autowaf.pre_test(ctx, APPNAME) | |||||
os.environ['PATH'] = '.' + os.pathsep + os.getenv('PATH') | |||||
Logs.pprint('GREEN', '') | |||||
autowaf.run_test(ctx, APPNAME, 'sratom_test', dirs=['./src','./tests']) | |||||
autowaf.post_test(ctx, APPNAME) | |||||
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/* sratom/*', shell=True) | |||||
def fix_docs(ctx): | |||||
if ctx.cmd == 'build': | |||||
autowaf.make_simple_dox(APPNAME) | |||||
def upload_docs(ctx): | |||||
os.system("rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/sratom/") | |||||
def posts(ctx): | |||||
path = str(ctx.path.abspath()) | |||||
autowaf.news_to_posts( | |||||
os.path.join(path, 'NEWS'), | |||||
{'title' : 'Sratom', | |||||
'description' : autowaf.get_blurb(os.path.join(path, 'README')), | |||||
'dist_pattern' : 'http://download.drobilla.net/sratom-%s.tar.bz2'}, | |||||
{ 'Author' : 'drobilla', | |||||
'Tags' : 'Hacking, LAD, LV2, RDF, Sratom' }, | |||||
os.path.join(out, 'posts')) |