annotate src/sord-0.12.0/wscript @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c29fa680fb5a
children
rev   line source
Chris@0 1 #!/usr/bin/env python
Chris@0 2 import glob
Chris@0 3 import os
Chris@0 4 import subprocess
Chris@0 5 import waflib.Logs as Logs
Chris@0 6 import waflib.Options as Options
Chris@0 7 import waflib.extras.autowaf as autowaf
Chris@0 8
Chris@0 9 # Library and package version (UNIX style major, minor, micro)
Chris@0 10 # major increment <=> incompatible changes
Chris@0 11 # minor increment <=> compatible changes (additions)
Chris@0 12 # micro increment <=> no interface changes
Chris@0 13 SORD_VERSION = '0.12.0'
Chris@0 14 SORD_MAJOR_VERSION = '0'
Chris@0 15
Chris@0 16 # Mandatory waf variables
Chris@0 17 APPNAME = 'sord' # Package name for waf dist
Chris@0 18 VERSION = SORD_VERSION # Package version for waf dist
Chris@0 19 top = '.' # Source directory
Chris@0 20 out = 'build' # Build directory
Chris@0 21
Chris@0 22 def options(opt):
Chris@0 23 opt.load('compiler_c')
Chris@0 24 opt.load('compiler_cxx')
Chris@0 25 autowaf.set_options(opt)
Chris@0 26 opt.add_option('--no-utils', action='store_true', dest='no_utils',
Chris@0 27 help='Do not build command line utilities')
Chris@0 28 opt.add_option('--test', action='store_true', dest='build_tests',
Chris@0 29 help='Build unit tests')
Chris@0 30 opt.add_option('--static', action='store_true', dest='static',
Chris@0 31 help='Build static library')
Chris@0 32 opt.add_option('--no-shared', action='store_true', dest='no_shared',
Chris@0 33 help='Do not build shared library')
Chris@0 34 opt.add_option('--static-progs', action='store_true', dest='static_progs',
Chris@0 35 help='Build programs as static binaries')
Chris@0 36 opt.add_option('--dump', type='string', default='', dest='dump',
Chris@0 37 help='Dump debugging output (iter, search, write, all)')
Chris@0 38
Chris@0 39 def configure(conf):
Chris@0 40 conf.load('compiler_c')
Chris@0 41 if Options.options.build_tests:
Chris@0 42 try:
Chris@0 43 conf.load('compiler_cxx')
Chris@0 44 except:
Chris@0 45 Logs.warn("No C++ compiler, sordmm.hpp compile test skipped")
Chris@0 46 pass
Chris@0 47
Chris@0 48 autowaf.configure(conf)
Chris@0 49 autowaf.set_c99_mode(conf)
Chris@0 50 autowaf.display_header('Sord configuration')
Chris@0 51
Chris@0 52 conf.env.BUILD_TESTS = Options.options.build_tests
Chris@0 53 conf.env.BUILD_UTILS = not Options.options.no_utils
Chris@0 54 conf.env.BUILD_SHARED = not Options.options.no_shared
Chris@0 55 conf.env.STATIC_PROGS = Options.options.static_progs
Chris@0 56 conf.env.BUILD_STATIC = (Options.options.static or
Chris@0 57 Options.options.static_progs)
Chris@0 58
Chris@0 59 if conf.env.BUILD_TESTS:
Chris@0 60 conf.check(lib = 'gcov',
Chris@0 61 define_name = 'HAVE_GCOV',
Chris@0 62 mandatory = False)
Chris@0 63
Chris@0 64 autowaf.check_pkg(conf, 'serd-0', uselib_store='SERD',
Chris@0 65 atleast_version='0.18.0', mandatory=True)
Chris@8 66 # autowaf.check_pkg(conf, 'libpcre', uselib_store='PCRE', mandatory=False)
Chris@0 67
Chris@0 68 # Parse dump options and define things accordingly
Chris@0 69 dump = Options.options.dump.split(',')
Chris@0 70 all = 'all' in dump
Chris@0 71 if all or 'iter' in dump:
Chris@0 72 autowaf.define(conf, 'SORD_DEBUG_ITER', 1)
Chris@0 73 if all or 'search' in dump:
Chris@0 74 autowaf.define(conf, 'SORD_DEBUG_SEARCH', 1)
Chris@0 75 if all or 'write' in dump:
Chris@0 76 autowaf.define(conf, 'SORD_DEBUG_WRITE', 1)
Chris@0 77
Chris@0 78 autowaf.define(conf, 'SORD_VERSION', SORD_VERSION)
Chris@0 79 autowaf.set_lib_env(conf, 'sord', SORD_VERSION)
Chris@0 80 conf.write_config_header('sord_config.h', remove=False)
Chris@0 81
Chris@0 82 autowaf.display_msg(conf, 'Utilities', bool(conf.env.BUILD_UTILS))
Chris@0 83 autowaf.display_msg(conf, 'Unit tests', bool(conf.env.BUILD_TESTS))
Chris@0 84 autowaf.display_msg(conf, 'Debug dumping', dump)
Chris@0 85 print('')
Chris@0 86
Chris@0 87 def build(bld):
Chris@0 88 # C/C++ Headers
Chris@0 89 includedir = '${INCLUDEDIR}/sord-%s/sord' % SORD_MAJOR_VERSION
Chris@0 90 bld.install_files(includedir, bld.path.ant_glob('sord/*.h'))
Chris@0 91 bld.install_files(includedir, bld.path.ant_glob('sord/*.hpp'))
Chris@0 92
Chris@0 93 # Pkgconfig file
Chris@0 94 autowaf.build_pc(bld, 'SORD', SORD_VERSION, SORD_MAJOR_VERSION, 'SERD',
Chris@0 95 {'SORD_MAJOR_VERSION' : SORD_MAJOR_VERSION})
Chris@0 96
Chris@0 97 source = 'src/sord.c src/syntax.c'
Chris@0 98
Chris@0 99 libflags = ['-fvisibility=hidden']
Chris@0 100 libs = ['m']
Chris@0 101 defines = []
Chris@0 102 if bld.env.MSVC_COMPILER:
Chris@0 103 libflags = []
Chris@0 104 libs = []
Chris@0 105 defines = ['snprintf=_snprintf']
Chris@0 106
Chris@0 107 # Shared Library
Chris@0 108 if bld.env.BUILD_SHARED:
Chris@0 109 obj = bld(features = 'c cshlib',
Chris@0 110 source = source,
Chris@0 111 includes = ['.', './src'],
Chris@0 112 export_includes = ['.'],
Chris@0 113 name = 'libsord',
Chris@0 114 target = 'sord-%s' % SORD_MAJOR_VERSION,
Chris@0 115 vnum = SORD_VERSION,
Chris@0 116 install_path = '${LIBDIR}',
Chris@0 117 libs = libs,
Chris@0 118 defines = defines + ['SORD_SHARED', 'SORD_INTERNAL'],
Chris@0 119 cflags = libflags)
Chris@0 120 autowaf.use_lib(bld, obj, 'SERD')
Chris@0 121
Chris@0 122 # Static Library
Chris@0 123 if bld.env.BUILD_STATIC:
Chris@0 124 obj = bld(features = 'c cstlib',
Chris@0 125 source = source,
Chris@0 126 includes = ['.', './src'],
Chris@0 127 export_includes = ['.'],
Chris@0 128 name = 'libsord_static',
Chris@0 129 target = 'sord-%s' % SORD_MAJOR_VERSION,
Chris@0 130 vnum = SORD_VERSION,
Chris@0 131 install_path = '${LIBDIR}',
Chris@0 132 libs = libs,
Chris@0 133 defines = ['SORD_INTERNAL'])
Chris@0 134 autowaf.use_lib(bld, obj, 'SERD')
Chris@0 135
Chris@0 136 if bld.env.BUILD_TESTS:
Chris@0 137 test_libs = libs
Chris@0 138 test_cflags = ['']
Chris@0 139 if bld.is_defined('HAVE_GCOV'):
Chris@0 140 test_libs += ['gcov']
Chris@0 141 test_cflags += ['-fprofile-arcs', '-ftest-coverage']
Chris@0 142
Chris@0 143 # Profiled static library for test coverage
Chris@0 144 obj = bld(features = 'c cstlib',
Chris@0 145 source = source,
Chris@0 146 includes = ['.', './src'],
Chris@0 147 name = 'libsord_profiled',
Chris@0 148 target = 'sord_profiled',
Chris@0 149 install_path = '',
Chris@0 150 defines = defines,
Chris@0 151 cflags = test_cflags,
Chris@0 152 lib = test_libs)
Chris@0 153 autowaf.use_lib(bld, obj, 'SERD')
Chris@0 154
Chris@0 155 # Unit test program
Chris@0 156 obj = bld(features = 'c cprogram',
Chris@0 157 source = 'src/sord_test.c',
Chris@0 158 includes = ['.', './src'],
Chris@0 159 use = 'libsord_profiled',
Chris@0 160 lib = test_libs,
Chris@0 161 target = 'sord_test',
Chris@0 162 install_path = '',
Chris@0 163 defines = defines,
Chris@0 164 cflags = test_cflags)
Chris@0 165 autowaf.use_lib(bld, obj, 'SERD')
Chris@0 166
Chris@0 167 # Static profiled sordi for tests
Chris@0 168 obj = bld(features = 'c cprogram',
Chris@0 169 source = 'src/sordi.c',
Chris@0 170 includes = ['.', './src'],
Chris@0 171 use = 'libsord_profiled',
Chris@0 172 lib = test_libs,
Chris@0 173 target = 'sordi_static',
Chris@0 174 install_path = '',
Chris@0 175 defines = defines,
Chris@0 176 cflags = test_cflags)
Chris@0 177 autowaf.use_lib(bld, obj, 'SERD')
Chris@0 178
Chris@0 179 # C++ build test
Chris@0 180 if bld.env.COMPILER_CXX:
Chris@0 181 obj = bld(features = 'cxx cxxprogram',
Chris@0 182 source = 'src/sordmm_test.cpp',
Chris@0 183 includes = ['.', './src'],
Chris@0 184 use = 'libsord_profiled',
Chris@0 185 lib = test_libs,
Chris@0 186 target = 'sordmm_test',
Chris@0 187 install_path = '',
Chris@0 188 defines = defines)
Chris@0 189 autowaf.use_lib(bld, obj, 'SERD')
Chris@0 190
Chris@0 191 # Utilities
Chris@0 192 if bld.env.BUILD_UTILS:
Chris@0 193 for i in ['sordi', 'sord_validate']:
Chris@0 194 obj = bld(features = 'c cprogram',
Chris@0 195 source = 'src/%s.c' % i,
Chris@0 196 includes = ['.', './src'],
Chris@0 197 use = 'libsord',
Chris@0 198 lib = libs,
Chris@0 199 target = i,
Chris@0 200 install_path = '${BINDIR}',
Chris@0 201 defines = defines)
Chris@0 202 if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS:
Chris@0 203 obj.use = 'libsord_static'
Chris@0 204 if bld.env.STATIC_PROGS:
Chris@0 205 obj.env.SHLIB_MARKER = obj.env.STLIB_MARKER
Chris@0 206 obj.linkflags = ['-static', '-Wl,--start-group']
Chris@0 207 autowaf.use_lib(bld, obj, 'SERD PCRE')
Chris@0 208
Chris@0 209 # Documentation
Chris@0 210 autowaf.build_dox(bld, 'SORD', SORD_VERSION, top, out)
Chris@0 211
Chris@0 212 # Man pages
Chris@0 213 bld.install_files('${MANDIR}/man1', bld.path.ant_glob('doc/*.1'))
Chris@0 214
Chris@0 215 bld.add_post_fun(autowaf.run_ldconfig)
Chris@0 216 if bld.env.DOCS:
Chris@0 217 bld.add_post_fun(fix_docs)
Chris@0 218
Chris@0 219 def lint(ctx):
Chris@0 220 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)
Chris@0 221
Chris@0 222 def fix_docs(ctx):
Chris@0 223 if ctx.cmd == 'build':
Chris@0 224 autowaf.make_simple_dox(APPNAME)
Chris@0 225
Chris@0 226 def upload_docs(ctx):
Chris@0 227 os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/sord/')
Chris@0 228
Chris@0 229 def test(ctx):
Chris@0 230 blddir = autowaf.build_dir(APPNAME, 'tests')
Chris@0 231 try:
Chris@0 232 os.makedirs(blddir)
Chris@0 233 except:
Chris@0 234 pass
Chris@0 235
Chris@0 236 for i in glob.glob(blddir + '/*.*'):
Chris@0 237 os.remove(i)
Chris@0 238
Chris@0 239 srcdir = ctx.path.abspath()
Chris@0 240 orig_dir = os.path.abspath(os.curdir)
Chris@0 241
Chris@0 242 os.chdir(srcdir)
Chris@0 243
Chris@0 244 good_tests = glob.glob('tests/test-*.ttl')
Chris@0 245 good_tests.sort()
Chris@0 246
Chris@0 247 os.chdir(orig_dir)
Chris@0 248
Chris@0 249 autowaf.pre_test(ctx, APPNAME)
Chris@0 250
Chris@0 251 os.environ['PATH'] = '.' + os.pathsep + os.getenv('PATH')
Chris@0 252
Chris@0 253 nul = os.devnull
Chris@0 254
Chris@0 255 autowaf.run_tests(ctx, APPNAME, [
Chris@0 256 'sordi_static file://%s/tests/manifest.ttl > %s' % (srcdir, nul),
Chris@0 257 'sordi_static %s/tests/UTF-8.ttl > %s' % (srcdir, nul),
Chris@0 258 'sordi_static -v > %s' % nul,
Chris@0 259 'sordi_static -h > %s' % nul,
Chris@0 260 'sordi_static -s "<foo> a <#Thingie> ." file:///test > %s' % nul,
Chris@0 261 'sordi_static %s > %s' % (nul, nul)],
Chris@0 262 0, name='sordi-cmd-good')
Chris@0 263
Chris@0 264 autowaf.run_tests(ctx, APPNAME, [
Chris@0 265 'sordi_static > %s' % nul,
Chris@0 266 'sordi_static ftp://example.org/unsupported.ttl > %s' % nul,
Chris@0 267 'sordi_static -i > %s' % nul,
Chris@0 268 'sordi_static -o > %s' % nul,
Chris@0 269 'sordi_static -z > %s' % nul,
Chris@0 270 'sordi_static -p > %s' % nul,
Chris@0 271 'sordi_static -c > %s' % nul,
Chris@0 272 'sordi_static -i illegal > %s' % nul,
Chris@0 273 'sordi_static -o illegal > %s' % nul,
Chris@0 274 'sordi_static -i turtle > %s' % nul,
Chris@0 275 'sordi_static /no/such/file > %s' % nul],
Chris@0 276 1, name='sordi-cmd-bad')
Chris@0 277
Chris@0 278 autowaf.run_tests(ctx, APPNAME, ['sord_test'])
Chris@0 279
Chris@0 280 commands = []
Chris@0 281 for test in good_tests:
Chris@0 282 base_uri = 'http://www.w3.org/2001/sw/DataAccess/df1/' + test.replace('\\', '/')
Chris@0 283 commands += [ 'sordi_static "%s" "%s" > %s.out' % (
Chris@0 284 os.path.join(srcdir, test), base_uri, test) ]
Chris@0 285
Chris@0 286 autowaf.run_tests(ctx, APPNAME, commands, 0, name='good')
Chris@0 287
Chris@0 288 Logs.pprint('BOLD', '\nVerifying turtle => ntriples')
Chris@0 289 for test in good_tests:
Chris@0 290 out_filename = test + '.out'
Chris@0 291 cmp_filename = srcdir + '/' + test.replace('.ttl', '.out')
Chris@0 292 if not os.access(out_filename, os.F_OK):
Chris@0 293 Logs.pprint('RED', 'FAIL: %s output is missing' % test)
Chris@0 294 else:
Chris@0 295 out_lines = sorted(open(out_filename).readlines())
Chris@0 296 cmp_lines = sorted(open(cmp_filename).readlines())
Chris@0 297 if out_lines != cmp_lines:
Chris@0 298 Logs.pprint('RED', 'FAIL: %s is incorrect' % out_filename)
Chris@0 299 else:
Chris@0 300 Logs.pprint('GREEN', 'Pass: %s' % test)
Chris@0 301
Chris@0 302 autowaf.post_test(ctx, APPNAME)