mirror of
https://github.com/samba-team/samba.git
synced 2025-06-23 11:17:06 +03:00
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
305 lines
13 KiB
Python
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)
|