annotate src/serd-0.18.2/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 c7265573341e
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 shutil
Chris@0 5 import subprocess
Chris@0 6 import waflib.Logs as Logs
Chris@0 7 import waflib.Options as Options
Chris@0 8 import waflib.extras.autowaf as autowaf
Chris@0 9
Chris@0 10 # Library and package version (UNIX style major, minor, micro)
Chris@0 11 # major increment <=> incompatible changes
Chris@0 12 # minor increment <=> compatible changes (additions)
Chris@0 13 # micro increment <=> no interface changes
Chris@0 14 SERD_VERSION = '0.18.2'
Chris@0 15 SERD_MAJOR_VERSION = '0'
Chris@0 16
Chris@0 17 # Mandatory waf variables
Chris@0 18 APPNAME = 'serd' # Package name for waf dist
Chris@0 19 VERSION = SERD_VERSION # Package version for waf dist
Chris@0 20 top = '.' # Source directory
Chris@0 21 out = 'build' # Build directory
Chris@0 22
Chris@0 23 def options(opt):
Chris@0 24 opt.load('compiler_c')
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('--stack-check', action='store_true', dest='stack_check',
Chris@0 31 help='Include runtime stack sanity checks')
Chris@0 32 opt.add_option('--static', action='store_true', dest='static',
Chris@0 33 help='Build static library')
Chris@0 34 opt.add_option('--no-shared', action='store_true', dest='no_shared',
Chris@0 35 help='Do not build shared library')
Chris@0 36 opt.add_option('--static-progs', action='store_true', dest='static_progs',
Chris@0 37 help='Build programs as static binaries')
Chris@0 38 opt.add_option('--largefile', action='store_true', dest='largefile',
Chris@0 39 help='Build with large file support on 32-bit systems')
Chris@0 40
Chris@0 41 def configure(conf):
Chris@0 42 conf.load('compiler_c')
Chris@0 43 autowaf.configure(conf)
Chris@0 44 autowaf.set_c99_mode(conf)
Chris@0 45 autowaf.display_header('Serd Configuration')
Chris@0 46
Chris@0 47 conf.env.BUILD_TESTS = Options.options.build_tests
Chris@0 48 conf.env.BUILD_UTILS = not Options.options.no_utils
Chris@0 49 conf.env.BUILD_SHARED = not Options.options.no_shared
Chris@0 50 conf.env.STATIC_PROGS = Options.options.static_progs
Chris@0 51 conf.env.BUILD_STATIC = (Options.options.static or
Chris@0 52 Options.options.static_progs)
Chris@0 53
Chris@0 54 if not conf.env.BUILD_SHARED and not conf.env.BUILD_STATIC:
Chris@0 55 conf.fatal('Neither a shared nor a static build requested')
Chris@0 56
Chris@0 57 if Options.options.stack_check:
Chris@0 58 autowaf.define(conf, 'SERD_STACK_CHECK', SERD_VERSION)
Chris@0 59
Chris@0 60 if Options.options.largefile:
Chris@0 61 conf.env.append_unique('DEFINES', ['_FILE_OFFSET_BITS=64'])
Chris@0 62
Chris@0 63 if conf.env.BUILD_TESTS:
Chris@0 64 conf.check(lib = 'gcov',
Chris@0 65 define_name = 'HAVE_GCOV',
Chris@0 66 mandatory = False)
Chris@0 67
Chris@0 68 conf.check(function_name = 'fmax',
Chris@0 69 header_name = 'math.h',
Chris@0 70 define_name = 'HAVE_FMAX',
Chris@0 71 lib = ['m'],
Chris@0 72 mandatory = False)
Chris@0 73
Chris@0 74 conf.check(function_name = 'posix_memalign',
Chris@0 75 header_name = 'stdlib.h',
Chris@0 76 define_name = 'HAVE_POSIX_MEMALIGN',
Chris@0 77 defines = ['_POSIX_C_SOURCE=201112L'],
Chris@0 78 mandatory = False)
Chris@0 79
Chris@0 80 conf.check(function_name = 'posix_fadvise',
Chris@0 81 header_name = 'fcntl.h',
Chris@0 82 define_name = 'HAVE_POSIX_FADVISE',
Chris@0 83 defines = ['_POSIX_C_SOURCE=201112L'],
Chris@0 84 mandatory = False)
Chris@0 85
Chris@0 86 conf.check(function_name = 'fileno',
Chris@0 87 header_name = 'stdio.h',
Chris@0 88 define_name = 'HAVE_FILENO',
Chris@0 89 defines = ['_POSIX_C_SOURCE=201112L'],
Chris@0 90 mandatory = False)
Chris@0 91
Chris@0 92 autowaf.define(conf, 'SERD_VERSION', SERD_VERSION)
Chris@0 93 autowaf.set_lib_env(conf, 'serd', SERD_VERSION)
Chris@0 94 conf.write_config_header('serd_config.h', remove=False)
Chris@0 95
Chris@0 96 autowaf.display_msg(conf, 'Utilities', str(conf.env.BUILD_UTILS))
Chris@0 97 autowaf.display_msg(conf, 'Unit tests', str(conf.env.BUILD_TESTS))
Chris@0 98 print('')
Chris@0 99
Chris@0 100 lib_source = [
Chris@0 101 'src/env.c',
Chris@0 102 'src/node.c',
Chris@0 103 'src/reader.c',
Chris@0 104 'src/string.c',
Chris@0 105 'src/uri.c',
Chris@0 106 'src/writer.c',
Chris@0 107 ]
Chris@0 108
Chris@0 109 def build(bld):
Chris@0 110 # C Headers
Chris@0 111 includedir = '${INCLUDEDIR}/serd-%s/serd' % SERD_MAJOR_VERSION
Chris@0 112 bld.install_files(includedir, bld.path.ant_glob('serd/*.h'))
Chris@0 113
Chris@0 114 # Pkgconfig file
Chris@0 115 autowaf.build_pc(bld, 'SERD', SERD_VERSION, SERD_MAJOR_VERSION, [],
Chris@0 116 {'SERD_MAJOR_VERSION' : SERD_MAJOR_VERSION})
Chris@0 117
Chris@0 118 libflags = ['-fvisibility=hidden']
Chris@0 119 libs = ['m']
Chris@0 120 defines = []
Chris@0 121 if bld.env.MSVC_COMPILER:
Chris@0 122 libflags = []
Chris@0 123 libs = []
Chris@0 124 defines = ['snprintf=_snprintf']
Chris@0 125
Chris@0 126 # Shared Library
Chris@0 127 if bld.env.BUILD_SHARED:
Chris@0 128 bld(features = 'c cshlib',
Chris@0 129 export_includes = ['.'],
Chris@0 130 source = lib_source,
Chris@0 131 includes = ['.', './src'],
Chris@0 132 lib = libs,
Chris@0 133 name = 'libserd',
Chris@0 134 target = 'serd-%s' % SERD_MAJOR_VERSION,
Chris@0 135 vnum = SERD_VERSION,
Chris@0 136 install_path = '${LIBDIR}',
Chris@0 137 defines = defines + ['SERD_SHARED', 'SERD_INTERNAL'],
Chris@0 138 cflags = libflags)
Chris@0 139
Chris@0 140 # Static library
Chris@0 141 if bld.env.BUILD_STATIC:
Chris@0 142 bld(features = 'c cstlib',
Chris@0 143 export_includes = ['.'],
Chris@0 144 source = lib_source,
Chris@0 145 includes = ['.', './src'],
Chris@0 146 lib = libs,
Chris@0 147 name = 'libserd_static',
Chris@0 148 target = 'serd-%s' % SERD_MAJOR_VERSION,
Chris@0 149 vnum = SERD_VERSION,
Chris@0 150 install_path = '${LIBDIR}',
Chris@0 151 defines = defines + ['SERD_INTERNAL'])
Chris@0 152
Chris@0 153 if bld.env.BUILD_TESTS:
Chris@0 154 test_libs = libs
Chris@0 155 test_cflags = ['']
Chris@0 156 if bld.is_defined('HAVE_GCOV'):
Chris@0 157 test_libs += ['gcov']
Chris@0 158 test_cflags += ['-fprofile-arcs', '-ftest-coverage']
Chris@0 159
Chris@0 160 # Profiled static library for test coverage
Chris@0 161 bld(features = 'c cstlib',
Chris@0 162 source = lib_source,
Chris@0 163 includes = ['.', './src'],
Chris@0 164 lib = test_libs,
Chris@0 165 name = 'libserd_profiled',
Chris@0 166 target = 'serd_profiled',
Chris@0 167 install_path = '',
Chris@0 168 defines = defines + ['SERD_INTERNAL'],
Chris@0 169 cflags = test_cflags)
Chris@0 170
Chris@0 171 # Static profiled serdi for tests
Chris@0 172 bld(features = 'c cprogram',
Chris@0 173 source = 'src/serdi.c',
Chris@0 174 includes = ['.', './src'],
Chris@0 175 use = 'libserd_profiled',
Chris@0 176 lib = test_libs,
Chris@0 177 target = 'serdi_static',
Chris@0 178 install_path = '',
Chris@0 179 defines = defines,
Chris@0 180 cflags = test_cflags)
Chris@0 181
Chris@0 182 # Unit test program
Chris@0 183 bld(features = 'c cprogram',
Chris@0 184 source = 'tests/serd_test.c',
Chris@0 185 includes = ['.', './src'],
Chris@0 186 use = 'libserd_profiled',
Chris@0 187 lib = test_libs,
Chris@0 188 target = 'serd_test',
Chris@0 189 install_path = '',
Chris@0 190 defines = defines,
Chris@0 191 cflags = test_cflags)
Chris@0 192
Chris@0 193 # Utilities
Chris@0 194 if bld.env.BUILD_UTILS:
Chris@0 195 obj = bld(features = 'c cprogram',
Chris@0 196 source = 'src/serdi.c',
Chris@0 197 target = 'serdi',
Chris@0 198 includes = ['.', './src'],
Chris@0 199 use = 'libserd',
Chris@0 200 lib = libs,
Chris@0 201 install_path = '${BINDIR}')
Chris@0 202 if not bld.env.BUILD_SHARED or bld.env.STATIC_PROGS:
Chris@0 203 obj.use = 'libserd_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']
Chris@0 207
Chris@0 208 # Documentation
Chris@0 209 autowaf.build_dox(bld, 'SERD', SERD_VERSION, top, out)
Chris@0 210
Chris@0 211 # Man page
Chris@0 212 bld.install_files('${MANDIR}/man1', 'doc/serdi.1')
Chris@0 213
Chris@0 214 bld.add_post_fun(autowaf.run_ldconfig)
Chris@0 215 if bld.env.DOCS:
Chris@0 216 bld.add_post_fun(fix_docs)
Chris@0 217
Chris@0 218 def lint(ctx):
Chris@0 219 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)
Chris@0 220
Chris@0 221 def amalgamate(ctx):
Chris@0 222 shutil.copy('serd/serd.h', 'build/serd.h')
Chris@0 223 amalgamation = open('build/serd.c', 'w')
Chris@0 224
Chris@0 225 serd_internal_h = open('src/serd_internal.h')
Chris@0 226 for l in serd_internal_h:
Chris@0 227 if l == '#include "serd/serd.h"\n':
Chris@0 228 amalgamation.write('#include "serd.h"\n')
Chris@0 229 else:
Chris@0 230 amalgamation.write(l)
Chris@0 231 serd_internal_h.close()
Chris@0 232
Chris@0 233 for f in lib_source:
Chris@0 234 fd = open(f)
Chris@0 235 amalgamation.write('\n/**\n @file %s\n*/' % f)
Chris@0 236 header = True
Chris@0 237 for l in fd:
Chris@0 238 if header:
Chris@0 239 if l == '*/\n':
Chris@0 240 header = False
Chris@0 241 else:
Chris@0 242 if l != '#include "serd_internal.h"\n':
Chris@0 243 amalgamation.write(l)
Chris@0 244 fd.close()
Chris@0 245 amalgamation.close()
Chris@0 246
Chris@0 247 for i in ['c', 'h']:
Chris@0 248 Logs.info('Wrote build/serd.%s' % i)
Chris@0 249
Chris@0 250 def fix_docs(ctx):
Chris@0 251 if ctx.cmd == 'build':
Chris@0 252 autowaf.make_simple_dox(APPNAME)
Chris@0 253
Chris@0 254 def upload_docs(ctx):
Chris@0 255 os.system('rsync -ravz --delete -e ssh build/doc/html/ drobilla@drobilla.net:~/drobilla.net/docs/serd/')
Chris@0 256
Chris@0 257 def file_equals(patha, pathb, subst_from='', subst_to=''):
Chris@0 258 fa = open(patha, 'rU')
Chris@0 259 fb = open(pathb, 'rU')
Chris@0 260 for line in fa:
Chris@0 261 if line.replace(subst_from, subst_to) != fb.readline().replace(subst_from, subst_to):
Chris@0 262 return False
Chris@0 263 fa.close()
Chris@0 264 fb.close()
Chris@0 265 return True
Chris@0 266
Chris@0 267 def test(ctx):
Chris@0 268 blddir = autowaf.build_dir(APPNAME, 'tests')
Chris@0 269 try:
Chris@0 270 os.makedirs(blddir)
Chris@0 271 except:
Chris@0 272 pass
Chris@0 273
Chris@0 274 for i in glob.glob(blddir + '/*.*'):
Chris@0 275 os.remove(i)
Chris@0 276
Chris@0 277 srcdir = ctx.path.abspath()
Chris@0 278 orig_dir = os.path.abspath(os.curdir)
Chris@0 279
Chris@0 280 os.chdir(srcdir)
Chris@0 281
Chris@0 282 good_tests = glob.glob('tests/test-*.ttl')
Chris@0 283 good_tests.sort()
Chris@0 284
Chris@0 285 bad_tests = glob.glob('tests/bad-*.ttl')
Chris@0 286 bad_tests.sort()
Chris@0 287
Chris@0 288 os.chdir(orig_dir)
Chris@0 289
Chris@0 290 autowaf.pre_test(ctx, APPNAME)
Chris@0 291
Chris@0 292 os.environ['PATH'] = '.' + os.pathsep + os.getenv('PATH')
Chris@0 293
Chris@0 294 autowaf.run_tests(ctx, APPNAME, ['serd_test'], dirs=['.'])
Chris@0 295
Chris@0 296 autowaf.run_tests(ctx, APPNAME, [
Chris@0 297 'serdi_static -o turtle %s/tests/base.ttl "base.ttl" > tests/base.ttl.out' % srcdir],
Chris@0 298 0, name='base')
Chris@0 299
Chris@0 300 if not file_equals('%s/tests/base.ttl' % srcdir, 'tests/base.ttl.out'):
Chris@0 301 Logs.pprint('RED', 'FAIL: build/tests/base.ttl.out is incorrect')
Chris@0 302
Chris@0 303 nul = os.devnull
Chris@0 304 autowaf.run_tests(ctx, APPNAME, [
Chris@0 305 'serdi_static file://%s/tests/manifest.ttl > %s' % (srcdir, nul),
Chris@0 306 'serdi_static %s/tests/UTF-8.ttl > %s' % (srcdir, nul),
Chris@0 307 'serdi_static -v > %s' % nul,
Chris@0 308 'serdi_static -h > %s' % nul,
Chris@0 309 'serdi_static -s "<foo> a <#Thingie> ." > %s' % nul,
Chris@0 310 'serdi_static %s > %s' % (nul, nul)],
Chris@0 311 0, name='serdi-cmd-good')
Chris@0 312
Chris@0 313 autowaf.run_tests(ctx, APPNAME, [
Chris@0 314 'serdi_static -q file://%s/tests/bad-id-clash.ttl > %s' % (srcdir, nul),
Chris@0 315 'serdi_static > %s' % nul,
Chris@0 316 'serdi_static ftp://example.org/unsupported.ttl > %s' % nul,
Chris@0 317 'serdi_static -i > %s' % nul,
Chris@0 318 'serdi_static -o > %s' % nul,
Chris@0 319 'serdi_static -z > %s' % nul,
Chris@0 320 'serdi_static -p > %s' % nul,
Chris@0 321 'serdi_static -c > %s' % nul,
Chris@0 322 'serdi_static -r > %s' % nul,
Chris@0 323 'serdi_static -i illegal > %s' % nul,
Chris@0 324 'serdi_static -o illegal > %s' % nul,
Chris@0 325 'serdi_static -i turtle > %s' % nul,
Chris@0 326 'serdi_static /no/such/file > %s' % nul],
Chris@0 327 1, name='serdi-cmd-bad')
Chris@0 328
Chris@0 329 commands = []
Chris@0 330 for test in good_tests:
Chris@0 331 base_uri = 'http://www.w3.org/2001/sw/DataAccess/df1/' + test.replace('\\', '/')
Chris@0 332 commands += [ 'serdi_static -f "%s" "%s" > %s.out' % (
Chris@0 333 os.path.join(srcdir, test), base_uri, test) ]
Chris@0 334
Chris@0 335 autowaf.run_tests(ctx, APPNAME, commands, 0, name='good')
Chris@0 336
Chris@0 337 Logs.pprint('BOLD', '\nVerifying turtle => ntriples')
Chris@0 338 for test in good_tests:
Chris@0 339 out_filename = test + '.out'
Chris@0 340 if not os.access(out_filename, os.F_OK):
Chris@0 341 Logs.pprint('RED', 'FAIL: %s output is missing' % test)
Chris@0 342 elif not file_equals(srcdir + '/' + test.replace('.ttl', '.out'),
Chris@0 343 test + '.out'):
Chris@0 344 Logs.pprint('RED', 'FAIL: %s is incorrect' % out_filename)
Chris@0 345 else:
Chris@0 346 Logs.pprint('GREEN', 'Pass: %s' % test)
Chris@0 347
Chris@0 348 commands = []
Chris@0 349 for test in bad_tests:
Chris@0 350 commands += [ 'serdi_static "%s" "http://www.w3.org/2001/sw/DataAccess/df1/%s" > %s.out' % (os.path.join(srcdir, test), test.replace('\\', '/'), test) ]
Chris@0 351
Chris@0 352 autowaf.run_tests(ctx, APPNAME, commands, 1, name='bad')
Chris@0 353
Chris@0 354 thru_tests = good_tests
Chris@0 355 thru_tests.remove(os.path.join('tests', 'test-id.ttl')) # IDs are mapped so files won't be identical
Chris@0 356
Chris@0 357 commands = []
Chris@0 358 num = 0
Chris@0 359 for test in thru_tests:
Chris@0 360 num += 1
Chris@0 361 flags = ''
Chris@0 362 if (num % 2 == 0):
Chris@0 363 flags += '-b'
Chris@0 364 if (num % 5 == 0):
Chris@0 365 flags += ' -f'
Chris@0 366 if (num % 3 == 0):
Chris@0 367 flags += ' -r http://www.w3.org/'
Chris@0 368 if (num % 7 == 0):
Chris@0 369 flags += ' -e'
Chris@0 370 base_uri = 'http://www.w3.org/2001/sw/DataAccess/df1/' + test.replace('\\', '/')
Chris@0 371 out_filename = test + '.thru'
Chris@0 372 commands += [
Chris@0 373 '%s %s -i ntriples -o turtle -p foo "%s" "%s" | %s -i turtle -o ntriples -c foo - "%s" > %s.thru' % (
Chris@0 374 'serdi_static', flags.ljust(5),
Chris@0 375 os.path.join(srcdir, test), base_uri,
Chris@0 376 'serdi_static', base_uri, test) ]
Chris@0 377
Chris@0 378 autowaf.run_tests(ctx, APPNAME, commands, 0, name='turtle-round-trip')
Chris@0 379 Logs.pprint('BOLD', '\nVerifying ntriples => turtle => ntriples')
Chris@0 380 for test in thru_tests:
Chris@0 381 out_filename = test + '.thru'
Chris@0 382 if not os.access(out_filename, os.F_OK):
Chris@0 383 Logs.pprint('RED', 'FAIL: %s output is missing' % test)
Chris@0 384 elif not file_equals(srcdir + '/' + test.replace('.ttl', '.out'),
Chris@0 385 test + '.thru',
Chris@0 386 '_:docid', '_:genid'):
Chris@0 387 Logs.pprint('RED', 'FAIL: %s is incorrect' % out_filename)
Chris@0 388 else:
Chris@0 389 Logs.pprint('GREEN', 'Pass: %s' % test)
Chris@0 390
Chris@0 391 autowaf.post_test(ctx, APPNAME)