1#!/usr/bin/env python 2 3APPNAME = 'tdb' 4VERSION = '1.4.3' 5 6import sys, os 7 8# find the buildtools directory 9top = '.' 10while not os.path.exists(top+'/buildtools') and len(top.split('/')) < 5: 11 top = top + '/..' 12sys.path.insert(0, top + '/buildtools/wafsamba') 13 14out = 'bin' 15 16import wafsamba 17from wafsamba import samba_dist, samba_utils 18from waflib import Options, Logs, Context 19import shutil 20 21samba_dist.DIST_DIRS('lib/tdb:. lib/replace:lib/replace buildtools:buildtools third_party/waf:third_party/waf') 22 23tdb1_unit_tests = [ 24 'run-3G-file', 25 'run-bad-tdb-header', 26 'run', 27 'run-check', 28 'run-corrupt', 29 'run-die-during-transaction', 30 'run-endian', 31 'run-incompatible', 32 'run-nested-transactions', 33 'run-nested-traverse', 34 'run-no-lock-during-traverse', 35 'run-oldhash', 36 'run-open-during-transaction', 37 'run-readonly-check', 38 'run-rescue', 39 'run-rescue-find_entry', 40 'run-rdlock-upgrade', 41 'run-rwlock-check', 42 'run-summary', 43 'run-transaction-expand', 44 'run-traverse-in-transaction', 45 'run-wronghash-fail', 46 'run-zero-append', 47 'run-fcntl-deadlock', 48 'run-marklock-deadlock', 49 'run-allrecord-traverse-deadlock', 50 'run-mutex-openflags2', 51 'run-mutex-trylock', 52 'run-mutex-allrecord-bench', 53 'run-mutex-allrecord-trylock', 54 'run-mutex-allrecord-block', 55 'run-mutex-transaction1', 56 'run-mutex-die', 57 'run-mutex1', 58 'run-circular-chain', 59 'run-circular-freelist', 60 'run-traverse-chain', 61] 62 63def options(opt): 64 opt.BUILTIN_DEFAULT('replace') 65 opt.PRIVATE_EXTENSION_DEFAULT('tdb', noextension='tdb') 66 opt.RECURSE('lib/replace') 67 opt.add_option('--disable-tdb-mutex-locking', 68 help=("Disable the use of pthread robust mutexes"), 69 action="store_true", dest='disable_tdb_mutex_locking', 70 default=False) 71 72 73def configure(conf): 74 conf.env.disable_tdb_mutex_locking = getattr(Options.options, 75 'disable_tdb_mutex_locking', 76 False) 77 if not conf.env.disable_tdb_mutex_locking: 78 conf.env.replace_add_global_pthread = True 79 conf.RECURSE('lib/replace') 80 81 conf.env.standalone_tdb = conf.IN_LAUNCH_DIR() 82 conf.env.building_tdb = True 83 84 if not conf.env.standalone_tdb: 85 if conf.CHECK_BUNDLED_SYSTEM_PKG('tdb', minversion=VERSION, 86 implied_deps='replace'): 87 conf.define('USING_SYSTEM_TDB', 1) 88 conf.env.building_tdb = False 89 if not conf.env.disable_python and \ 90 conf.CHECK_BUNDLED_SYSTEM_PYTHON('pytdb', 'tdb', minversion=VERSION): 91 conf.define('USING_SYSTEM_PYTDB', 1) 92 93 if (conf.CONFIG_SET('HAVE_ROBUST_MUTEXES') and 94 conf.env.building_tdb and 95 not conf.env.disable_tdb_mutex_locking): 96 conf.define('USE_TDB_MUTEX_LOCKING', 1) 97 98 conf.CHECK_XSLTPROC_MANPAGES() 99 100 conf.SAMBA_CHECK_PYTHON() 101 conf.SAMBA_CHECK_PYTHON_HEADERS() 102 103 conf.SAMBA_CONFIG_H() 104 105 conf.SAMBA_CHECK_UNDEFINED_SYMBOL_FLAGS() 106 107def build(bld): 108 bld.RECURSE('lib/replace') 109 110 COMMON_FILES='''check.c error.c tdb.c traverse.c 111 freelistcheck.c lock.c dump.c freelist.c 112 io.c open.c transaction.c hash.c summary.c rescue.c 113 mutex.c''' 114 115 COMMON_SRC = bld.SUBDIR('common', COMMON_FILES) 116 117 if bld.env.standalone_tdb: 118 bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig' 119 private_library = False 120 else: 121 private_library = True 122 123 if not bld.CONFIG_SET('USING_SYSTEM_TDB'): 124 125 tdb_deps = 'replace' 126 127 if bld.CONFIG_SET('USE_TDB_MUTEX_LOCKING'): 128 tdb_deps += ' pthread' 129 130 bld.SAMBA_LIBRARY('tdb', 131 COMMON_SRC, 132 deps=tdb_deps, 133 includes='include', 134 abi_directory='ABI', 135 abi_match='tdb_*', 136 hide_symbols=True, 137 vnum=VERSION, 138 public_headers=('' if private_library else 'include/tdb.h'), 139 public_headers_install=not private_library, 140 pc_files='tdb.pc', 141 private_library=private_library) 142 143 bld.SAMBA_BINARY('tdbtorture', 144 'tools/tdbtorture.c', 145 'tdb', 146 install=False) 147 148 bld.SAMBA_BINARY('tdbrestore', 149 'tools/tdbrestore.c', 150 'tdb', manpages='man/tdbrestore.8') 151 152 bld.SAMBA_BINARY('tdbdump', 153 'tools/tdbdump.c', 154 'tdb', manpages='man/tdbdump.8') 155 156 bld.SAMBA_BINARY('tdbbackup', 157 'tools/tdbbackup.c', 158 'tdb', 159 manpages='man/tdbbackup.8') 160 161 bld.SAMBA_BINARY('tdbtool', 162 'tools/tdbtool.c', 163 'tdb', manpages='man/tdbtool.8') 164 165 if bld.env.standalone_tdb: 166 # FIXME: This hardcoded list is stupid, stupid, stupid. 167 bld.SAMBA_SUBSYSTEM('tdb-test-helpers', 168 'test/external-agent.c test/lock-tracking.c test/logging.c', 169 tdb_deps, 170 includes='include') 171 172 for t in tdb1_unit_tests: 173 b = "tdb1-" + t 174 s = "test/" + t + ".c" 175 bld.SAMBA_BINARY(b, s, 'replace tdb-test-helpers', 176 includes='include', install=False) 177 178 if not bld.CONFIG_SET('USING_SYSTEM_PYTDB'): 179 bld.SAMBA_PYTHON('pytdb', 180 'pytdb.c', 181 deps='tdb', 182 enabled=not bld.env.disable_python, 183 realname='tdb.so', 184 cflags='-DPACKAGE_VERSION=\"%s\"' % VERSION) 185 186 if not bld.env.disable_python: 187 bld.SAMBA_SCRIPT('_tdb_text.py', 188 pattern='_tdb_text.py', 189 installdir='python') 190 191 bld.INSTALL_FILES('${PYTHONARCHDIR}', '_tdb_text.py') 192 193def testonly(ctx): 194 '''run tdb testsuite''' 195 ecode = 0 196 197 blddir = Context.g_module.out 198 test_prefix = "%s/st" % (blddir) 199 shutil.rmtree(test_prefix, ignore_errors=True) 200 os.makedirs(test_prefix) 201 os.environ['TEST_DATA_PREFIX'] = test_prefix 202 203 env = samba_utils.LOAD_ENVIRONMENT() 204 # FIXME: This is horrible :( 205 if env.building_tdb: 206 # Create scratch directory for tests. 207 testdir = os.path.join(test_prefix, 'tdb-tests') 208 samba_utils.mkdir_p(testdir) 209 # Symlink back to source dir so it can find tests in test/ 210 link = os.path.join(testdir, 'test') 211 if not os.path.exists(link): 212 os.symlink(ctx.path.make_node('test').abspath(), link) 213 214 sh_tests = ["test/test_tdbbackup.sh test/jenkins-be-hash.tdb"] 215 216 for sh_test in sh_tests: 217 cmd = "BINDIR=%s %s" % (blddir, sh_test) 218 print("shell test: " + cmd) 219 ret = samba_utils.RUN_COMMAND(cmd) 220 if ret != 0: 221 print("%s sh test failed" % cmd) 222 ecode = ret 223 break 224 225 for t in tdb1_unit_tests: 226 f = "tdb1-" + t 227 cmd = "cd " + testdir + " && " + os.path.abspath(os.path.join(blddir, f)) + " > test-output 2>&1" 228 print("..." + f) 229 ret = samba_utils.RUN_COMMAND(cmd) 230 if ret != 0: 231 print("%s failed:" % f) 232 samba_utils.RUN_COMMAND("cat " + os.path.join(testdir, 'test-output')) 233 ecode = ret 234 break 235 236 if ecode == 0: 237 cmd = os.path.join(blddir, 'tdbtorture') 238 ret = samba_utils.RUN_COMMAND(cmd) 239 print("testsuite returned %d" % ret) 240 if ret != 0: 241 ecode = ret 242 243 pyret = samba_utils.RUN_PYTHON_TESTS(['python/tests/simple.py']) 244 print("python testsuite returned %d" % pyret) 245 sys.exit(ecode or pyret) 246 247# WAF doesn't build the unit tests for this, maybe because they don't link with tdb? 248# This forces it 249def test(ctx): 250 Options.commands.append('build') 251 Options.commands.append('testonly') 252 253def dist(): 254 '''makes a tarball for distribution''' 255 samba_dist.dist() 256 257def reconfigure(ctx): 258 '''reconfigure if config scripts have changed''' 259 samba_utils.reconfigure(ctx) 260