1
0
mirror of https://github.com/samba-team/samba.git synced 2025-06-23 11:17:06 +03:00
Andrew Bartlett 35a2d020a0 ccan: Only build ccan-failtest when we are in developer mode
From: Andrew Bartlett <abartlet@samba.org>

This code is incredibly useful, but is only needed in test code and may not be
perfectly portable.  It has compiled on all systems bar Solaris so far, but
rather than make it a requirement to build Samba, just keep it for development.

Andrew Bartlett

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

Autobuild-User(master): Rusty Russell <rusty@rustcorp.com.au>
Autobuild-Date(master): Thu Jun  7 18:53:12 CEST 2012 on sn-devel-104
2012-06-07 18:53:12 +02:00

305 lines
13 KiB
Python

#!/usr/bin/env python
APPNAME = 'tdb'
VERSION = '2.0.0'
blddir = 'bin'
import sys, os
# find the buildtools directory
srcdir = '.'
while not os.path.exists(srcdir+'/buildtools') and len(srcdir.split('/')) < 5:
srcdir = '../' + srcdir
sys.path.insert(0, srcdir + '/buildtools/wafsamba')
import wafsamba, samba_dist, Options, Logs, glob
samba_dist.DIST_DIRS('lib/tdb2:. lib/replace:lib/replace lib/ccan:lib/ccan buildtools:buildtools')
def set_options(opt):
opt.BUILTIN_DEFAULT('replace,ccan')
opt.PRIVATE_EXTENSION_DEFAULT('tdb2', noextension='tdb2')
opt.RECURSE('lib/replace')
opt.add_option('--enable-developer',
help=("Turn on developer warnings and debugging"),
action="store_true", dest='developer', default=False)
opt.add_option('--enable-tdb2',
help=("Use tdb2 API instead of tdb1 [True]"),
action="store_true", dest='BUILD_TDB2', default=True)
opt.add_option('--disable-tdb2',
help=("Use old tdb1 API instead of tdb2"),
action="store_false", dest='BUILD_TDB2')
opt.add_option('--valgrind',
help=("use valgrind on tests programs"),
action="store_true", dest='VALGRIND', default=False)
opt.add_option('--valgrind-log',
help=("where to put the valgrind log"),
action="store", dest='VALGRINDLOG', default=None)
if opt.IN_LAUNCH_DIR():
opt.add_option('--disable-python',
help=("disable the pytdb module"),
action="store_true", dest='disable_python', default=False)
def configure(conf):
if Options.options.developer:
conf.env.DEVELOPER_MODE = True
conf.env.TEST_RUN_SRC=['test/run-001-encode.c',
'test/run-001-fls.c',
'test/run-01-new_database.c',
'test/run-02-expand.c',
'test/run-03-coalesce.c',
'test/run-04-basichash.c',
'test/run-05-readonly-open.c',
'test/run-10-simple-store.c',
'test/run-11-simple-fetch.c',
'test/run-12-check.c',
'test/run-15-append.c',
'test/run-20-growhash.c',
'test/run-25-hashoverload.c',
'test/run-30-exhaust-before-expand.c',
'test/run-35-convert.c',
'test/run-50-multiple-freelists.c',
'test/run-56-open-during-transaction.c',
'test/run-57-die-during-transaction.c',
'test/run-64-bit-tdb.c',
'test/run-90-get-set-attributes.c',
'test/run-capabilities.c',
'test/run-expand-in-transaction.c',
'test/run-features.c',
'test/run-lockall.c',
'test/run-remap-in-read_traverse.c',
'test/run-seed.c',
'test/run-tdb1-3G-file.c',
'test/run-tdb1-bad-tdb-header.c',
'test/run-tdb1.c',
'test/run-tdb1-check.c',
'test/run-tdb1-corrupt.c',
'test/run-tdb1-endian.c',
'test/run-tdb1-hashsize.c',
'test/run-tdb1-incompatible.c',
'test/run-tdb1-nested-transactions.c',
'test/run-tdb1-nested-traverse.c',
'test/run-tdb1-no-lock-during-traverse.c',
'test/run-tdb1-oldhash.c',
'test/run-tdb1-readonly-check.c',
'test/run-tdb1-rwlock-check.c',
'test/run-tdb1-seqnum-wrap.c',
'test/run-tdb1-summary.c',
'test/run-tdb1-traverse-in-transaction.c',
'test/run-tdb1-wronghash-fail.c',
'test/run-tdb1-zero-append.c',
'test/run-tdb_errorstr.c',
'test/run-tdb_foreach.c',
'test/run-traverse.c']
conf.env.TEST_API_SRC=['test/api-12-store.c',
'test/api-13-delete.c',
'test/api-14-exists.c',
'test/api-16-wipe_all.c',
'test/api-21-parse_record.c',
'test/api-55-transaction.c',
'test/api-80-tdb_fd.c',
'test/api-81-seqnum.c',
'test/api-82-lockattr.c',
'test/api-83-openhook.c',
'test/api-91-get-stats.c',
'test/api-92-get-set-readonly.c',
'test/api-93-repack.c',
'test/api-add-remove-flags.c',
'test/api-check-callback.c',
'test/api-firstkey-nextkey.c',
'test/api-fork-test.c',
'test/api-locktimeout.c',
'test/api-missing-entries.c',
'test/api-open-multiple-times.c',
'test/api-record-expand.c',
'test/api-simple-delete.c',
'test/api-summary.c',
'test/api-tdb1-flag-removal.c']
conf.env.TEST_API_HELPER_SRC=['test/helpapi-external-agent.c']
conf.env.TEST_RUN_HELPER_SRC=['test/helprun-external-agent.c',
'test/helprun-layout.c']
conf.env.TEST_HELPER_SRC=['test/external-agent.c',
'test/failtest_helper.c',
'test/lock-tracking.c',
'test/logging.c',
'test/tap-interface.c',
'test/tdb1-external-agent.c',
'test/tdb1-lock-tracking.c']
if Options.options.BUILD_TDB2:
conf.DEFINE('BUILD_TDB2', 1)
conf.RECURSE('lib/replace')
conf.RECURSE('lib/ccan')
conf.env.standalone_tdb2 = conf.IN_LAUNCH_DIR()
conf.env.disable_python = getattr(Options.options, 'disable_python', False)
if not conf.env.standalone_tdb2:
if conf.CHECK_BUNDLED_SYSTEM('tdb', minversion=VERSION,
implied_deps='replace'):
conf.define('USING_SYSTEM_TDB2', 1)
if conf.CHECK_BUNDLED_SYSTEM_PYTHON('pytdb', 'tdb', minversion=VERSION):
conf.define('USING_SYSTEM_PYTDB', 1)
if not conf.env.disable_python:
# also disable if we don't have the python libs installed
conf.find_program('python', var='PYTHON')
conf.check_tool('python')
conf.check_python_version((2,4,2))
conf.SAMBA_CHECK_PYTHON_HEADERS(mandatory=False)
if not conf.env.HAVE_PYTHON_H:
Logs.warn('Disabling pytdb as python devel libs not found')
conf.env.disable_python = True
# This make #include <ccan/...> work.
conf.ADD_EXTRA_INCLUDES('''#lib''')
conf.SAMBA_CONFIG_H()
def build(bld):
if bld.env.BUILD_TDB2:
bld.RECURSE('lib/replace')
bld.RECURSE('lib/ccan')
if bld.env.standalone_tdb2:
bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
private_library = False
else:
private_library = True
SRC = '''check.c free.c hash.c io.c lock.c open.c
summary.c tdb.c transaction.c traverse.c
tdb1_check.c tdb1_freelist.c tdb1_hash.c
tdb1_io.c tdb1_lock.c tdb1_open.c
tdb1_summary.c tdb1_tdb.c tdb1_transaction.c
tdb1_traverse.c'''
if not bld.CONFIG_SET('USING_SYSTEM_TDB2'):
bld.SAMBA_LIBRARY('tdb',
SRC,
deps='replace ccan',
includes='.',
abi_directory='ABI',
abi_match='tdb_* tdb1_incompatible_hash',
hide_symbols=True,
vnum=VERSION,
public_headers='tdb2.h',
public_headers_install=not private_library,
pc_files='tdb.pc',
private_library=private_library)
bld.SAMBA_BINARY('tdbtorture',
'tools/tdb2torture.c',
deps='tdb',
install=False)
bld.SAMBA_BINARY('tdbtool',
'tools/tdb2tool.c',
deps='tdb')
bld.SAMBA_BINARY('tdbdump',
'tools/tdb2dump.c',
deps='tdb')
bld.SAMBA_BINARY('tdbrestore',
'tools/tdb2restore.c',
deps='tdb')
bld.SAMBA_BINARY('tdbbackup',
'tools/tdb2backup.c',
deps='tdb')
if not bld.CONFIG_SET('USING_SYSTEM_PYTDB'):
bld.SAMBA_PYTHON('pytdb',
source='pytdb.c',
deps='tdb',
enabled=not bld.env.disable_python,
realname='tdb.so',
cflags='-DPACKAGE_VERSION=\"%s\"' % VERSION)
if bld.env.DEVELOPER_MODE:
# FIXME: We need CCAN for some API tests, but waf thinks it's
# already available via tdb2. It is, but not publicly.
# Workaround is to build a private, non-hiding version.
bld.SAMBA_SUBSYSTEM('tdb2-testing',
SRC,
deps='replace ccan',
includes='.')
bld.SAMBA_SUBSYSTEM('tdb2-test-helpers', bld.env.TEST_HELPER_SRC,
deps='replace')
bld.SAMBA_SUBSYSTEM('tdb2-run-helpers', bld.env.TEST_RUN_HELPER_SRC,
deps='replace')
bld.SAMBA_SUBSYSTEM('tdb2-api-helpers', bld.env.TEST_API_HELPER_SRC,
deps='replace tdb2-testing')
for f in bld.env.TEST_RUN_SRC:
base = os.path.splitext(os.path.basename(f))[0]
bld.SAMBA_BINARY('tdb2-' + base, f,
deps='ccan replace tdb2-test-helpers tdb2-run-helpers ccan-failtest',
install=False)
for f in bld.env.TEST_API_SRC:
base = os.path.splitext(os.path.basename(f))[0]
bld.SAMBA_BINARY('tdb2-' + base, f,
deps='ccan replace tdb2-test-helpers tdb2-api-helpers',
install=False)
def testonly(ctx):
'''run tdb2 testsuite'''
import Utils, samba_utils, shutil
ecode = 0;
env = samba_utils.LOAD_ENVIRONMENT()
if env.BUILD_TDB2 and env.standalone_tdb2 and env.DEVELOPER_MODE:
# FIXME: This is horrible :(
test_prefix = "%s/st" % (Utils.g_module.blddir)
shutil.rmtree(test_prefix, ignore_errors=True)
os.makedirs(test_prefix)
# Create scratch directory for tests.
testdir = os.path.join(test_prefix, 'tdb2-tests')
samba_utils.mkdir_p(testdir)
# Symlink back to source dir so it can find tests in test/
link = os.path.join(testdir, 'test')
if not os.path.exists(link):
os.symlink(os.path.abspath(os.path.join(env.cwd, 'test')), link)
if Options.options.VALGRIND:
os.environ['VALGRIND'] = 'valgrind -q --num-callers=30'
if Options.options.VALGRINDLOG is not None:
os.environ['VALGRIND'] += ' --log-file=%s' % Options.options.VALGRINDLOG
for f in env.TEST_RUN_SRC + env.TEST_API_SRC:
name = "tdb2-" + os.path.splitext(os.path.basename(f))[0]
cmd = "cd " + testdir + " && $VALGRIND " + os.path.abspath(os.path.join(Utils.g_module.blddir, name)) + " > test-output 2>&1"
print("..." + f)
ret = samba_utils.RUN_COMMAND(cmd)
if ret != 0:
print("%s (%s) failed:" % (name, f))
samba_utils.RUN_COMMAND("cat " + os.path.join(testdir, 'test-output'))
ecode = ret;
break;
sys.exit(ecode)
# WAF doesn't build the unit tests for this, maybe because they don't link with tdb?
# This forces it
def test(ctx):
import Scripting
Scripting.commands.append('build')
Scripting.commands.append('testonly')
def dist():
'''makes a tarball for distribution'''
samba_dist.dist()
def reconfigure(ctx):
'''reconfigure if config scripts have changed'''
import samba_utils
samba_utils.reconfigure(ctx)