1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00
samba-mirror/lib/ldb/wscript
Andrew Bartlett 52efa79653 ldb: Refuse to build Samba against a newer minor version of ldb
Samba is not compatible with new versions of ldb (except release versions)

Other users would not notice the breakages, but Samba makes many
more assuptions about the LDB internals than any other package.

(Specifically, LDB 1.2 and 1.4 broke builds against released
Samba versions)

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13519

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Gary Lockyer <gary@catalyst.net.nz>
2018-07-12 04:32:08 +02:00

586 lines
24 KiB
Python

#!/usr/bin/env python
APPNAME = 'ldb'
VERSION = '1.4.0'
blddir = 'bin'
import sys, os
import Logs
# 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, Utils, Options
samba_dist.DIST_DIRS('''lib/ldb:. lib/replace:lib/replace lib/talloc:lib/talloc
lib/tdb:lib/tdb lib/tdb:lib/tdb lib/tevent:lib/tevent
third_party/popt:third_party/popt
third_party/cmocka:third_party/cmocka
buildtools:buildtools third_party/waf:third_party/waf''')
samba_dist.DIST_FILES('''lib/util/binsearch.h:lib/util/binsearch.h''')
def set_options(opt):
opt.BUILTIN_DEFAULT('replace')
opt.PRIVATE_EXTENSION_DEFAULT('ldb', noextension='ldb')
opt.RECURSE('lib/tdb')
opt.RECURSE('lib/tevent')
opt.RECURSE('lib/replace')
opt.tool_options('python') # options for disabling pyc or pyo compilation
opt.add_option('--without-ldb-lmdb',
help='disable new LMDB backend for LDB',
action='store_true', dest='without_ldb_lmdb', default=False)
def configure(conf):
conf.RECURSE('lib/tdb')
conf.RECURSE('lib/tevent')
if conf.CHECK_FOR_THIRD_PARTY():
conf.RECURSE('third_party/popt')
conf.RECURSE('third_party/cmocka')
else:
if not conf.CHECK_POPT():
raise Utils.WafError('popt development packages have not been found.\nIf third_party is installed, check that it is in the proper place.')
else:
conf.define('USING_SYSTEM_POPT', 1)
if not conf.CHECK_CMOCKA():
raise Utils.WafError('cmocka development package have not been found.\nIf third_party is installed, check that it is in the proper place.')
else:
conf.define('USING_SYSTEM_CMOCKA', 1)
conf.RECURSE('lib/replace')
conf.find_program('python', var='PYTHON')
conf.find_program('xsltproc', var='XSLTPROC')
conf.check_tool('python')
conf.check_python_version((2,4,2))
conf.SAMBA_CHECK_PYTHON_HEADERS(mandatory=not conf.env.disable_python)
# where does the default LIBDIR end up? in conf.env somewhere?
#
conf.CONFIG_PATH('LDB_MODULESDIR', conf.SUBST_ENV_VAR('MODULESDIR') + '/ldb')
conf.env.standalone_ldb = conf.IN_LAUNCH_DIR()
if not conf.env.standalone_ldb:
max_ldb_version = [int(x) for x in VERSION.split(".")]
max_ldb_version[2] = 999
max_ldb_version_dots = "%d.%d.%d" % tuple(max_ldb_version)
if conf.env.disable_python:
if conf.CHECK_BUNDLED_SYSTEM_PKG('ldb',
minversion=VERSION,
maxversion=max_ldb_version_dots,
onlyif='talloc tdb tevent',
implied_deps='replace talloc tdb tevent'):
conf.define('USING_SYSTEM_LDB', 1)
else:
using_system_pyldb_util = True
if not conf.CHECK_BUNDLED_SYSTEM_PKG('pyldb-util',
minversion=VERSION,
maxversion=max_ldb_version_dots,
onlyif='talloc tdb tevent',
implied_deps='replace talloc tdb tevent ldb'):
using_system_pyldb_util = False
# We need to get a pyldb-util for all the python versions
# we are building for
if conf.env['EXTRA_PYTHON']:
name = 'pyldb-util' + conf.all_envs['extrapython']['PYTHON_SO_ABI_FLAG']
if not conf.CHECK_BUNDLED_SYSTEM_PKG(name,
minversion=VERSION,
maxversion=max_ldb_version_dots,
onlyif='talloc tdb tevent',
implied_deps='replace talloc tdb tevent ldb'):
using_system_pyldb_util = False
if using_system_pyldb_util:
conf.define('USING_SYSTEM_PYLDB_UTIL', 1)
if conf.CHECK_BUNDLED_SYSTEM_PKG('ldb',
minversion=VERSION,
maxversion=max_ldb_version_dots,
onlyif='talloc tdb tevent pyldb-util',
implied_deps='replace talloc tdb tevent'):
conf.define('USING_SYSTEM_LDB', 1)
if not conf.CHECK_CODE('return !(sizeof(size_t) >= 8)',
"HAVE_64_BIT_SIZE_T_FOR_LMDB",
execute=True,
msg='Checking for a 64-bit host to '
'support lmdb'):
Logs.warn("--without-ldb-lmdb implied as this "
"host is not 64-bit")
if not conf.env.standalone_ldb and \
not Options.options.without_ad_dc and \
conf.CONFIG_GET('ENABLE_SELFTEST'):
Logs.warn("NOTE: Some AD DC parts of selftest will fail")
conf.env.REQUIRE_LMDB = False
else:
if conf.env.standalone_ldb:
if Options.options.without_ldb_lmdb:
conf.env.REQUIRE_LMDB = False
else:
conf.env.REQUIRE_LMDB = True
elif Options.options.without_ad_dc:
conf.env.REQUIRE_LMDB = False
else:
if Options.options.without_ldb_lmdb:
if not Options.options.without_ad_dc and \
conf.CONFIG_GET('ENABLE_SELFTEST'):
raise Utils.WafError('--without-ldb-lmdb conflicts '
'with --enable-selftest while '
'building the AD DC')
conf.env.REQUIRE_LMDB = False
else:
conf.env.REQUIRE_LMDB = True
if conf.CONFIG_SET('USING_SYSTEM_LDB'):
v = VERSION.split('.')
conf.DEFINE('EXPECTED_SYSTEM_LDB_VERSION_MAJOR', int(v[0]))
conf.DEFINE('EXPECTED_SYSTEM_LDB_VERSION_MINOR', int(v[1]))
conf.DEFINE('EXPECTED_SYSTEM_LDB_VERSION_RELEASE', int(v[2]))
if conf.env.standalone_ldb:
conf.CHECK_XSLTPROC_MANPAGES()
# we need this for the ldap backend
if conf.CHECK_FUNCS_IN('ber_flush ldap_open ldap_initialize', 'lber ldap', headers='lber.h ldap.h'):
conf.env.ENABLE_LDAP_BACKEND = True
# we don't want any libraries or modules to rely on runtime
# resolution of symbols
if not sys.platform.startswith("openbsd"):
conf.ADD_LDFLAGS('-Wl,-no-undefined', testflags=True)
# if lmdb support is enabled then we require lmdb
# is present, build the mdb back end and enable lmdb support in
# the tools.
if conf.env.REQUIRE_LMDB and \
not conf.CONFIG_SET('USING_SYSTEM_LDB'):
if not conf.CHECK_CFG(package='lmdb',
args='"lmdb >= 0.9.16" --cflags --libs',
msg='Checking for lmdb >= 0.9.16',
mandatory=False):
if not conf.CHECK_CODE('''
#if MDB_VERSION_MAJOR == 0 \
&& MDB_VERSION_MINOR <= 9 \
&& MDB_VERSION_PATCH < 16
#error LMDB too old
#endif
''',
'HAVE_GOOD_LMDB_VERSION',
headers='lmdb.h',
msg='Checking for lmdb >= 0.9.16 via header check'):
if conf.env.standalone_ldb:
raise Utils.WafError('ldb build (unless --without-ldb-lmdb) '
'requires '
'lmdb 0.9.16 or later')
elif not Options.options.without_ad_dc:
raise Utils.WafError('Samba AD DC and --enable-selftest '
'requires '
'lmdb 0.9.16 or later')
if conf.CHECK_FUNCS_IN('mdb_env_create', 'lmdb', headers='lmdb.h'):
conf.DEFINE('HAVE_LMDB', '1')
conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True)
conf.SAMBA_CONFIG_H()
conf.SAMBA_CHECK_UNDEFINED_SYMBOL_FLAGS()
def build(bld):
bld.RECURSE('lib/tevent')
if bld.CHECK_FOR_THIRD_PARTY():
bld.RECURSE('third_party/popt')
bld.RECURSE('third_party/cmocka')
bld.RECURSE('lib/replace')
bld.RECURSE('lib/tdb')
if bld.env.standalone_ldb:
if not 'PACKAGE_VERSION' in bld.env:
bld.env.PACKAGE_VERSION = VERSION
bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
private_library = False
else:
private_library = True
# we're not currently linking against the ldap libs, but ldb.pc.in
# has @LDAP_LIBS@
bld.env.LDAP_LIBS = ''
LDB_MAP_SRC = bld.SUBDIR('ldb_map',
'ldb_map.c ldb_map_inbound.c ldb_map_outbound.c')
COMMON_SRC = bld.SUBDIR('common',
'''ldb_modules.c ldb_ldif.c ldb_parse.c ldb_msg.c ldb_utf8.c
ldb_debug.c ldb_dn.c ldb_match.c ldb_options.c ldb_pack.c
ldb_attributes.c attrib_handlers.c ldb_controls.c qsort.c''')
bld.SAMBA_MODULE('ldb_ldap', 'ldb_ldap/ldb_ldap.c',
init_function='ldb_ldap_init',
module_init_name='ldb_init_module',
deps='talloc lber ldap ldb',
enabled=bld.env.ENABLE_LDAP_BACKEND,
internal_module=False,
subsystem='ldb')
if bld.PYTHON_BUILD_IS_ENABLED():
if not bld.CONFIG_SET('USING_SYSTEM_PYLDB_UTIL'):
for env in bld.gen_python_environments(['PKGCONFIGDIR']):
name = bld.pyembed_libname('pyldb-util')
bld.SAMBA_LIBRARY(name,
deps='ldb',
source='pyldb_util.c',
public_headers=('' if private_library else 'pyldb.h'),
public_headers_install=not private_library,
vnum=VERSION,
private_library=private_library,
pc_files='pyldb-util.pc',
pyembed=True,
enabled=bld.PYTHON_BUILD_IS_ENABLED(),
abi_directory='ABI',
abi_match='pyldb_*')
if not bld.CONFIG_SET('USING_SYSTEM_LDB'):
bld.SAMBA_PYTHON('pyldb', 'pyldb.c',
deps='ldb ' + name,
realname='ldb.so',
cflags='-DPACKAGE_VERSION=\"%s\"' % VERSION)
# Do only install this file as part of the Samba build if we do not
# use the system libldb!
if not bld.CONFIG_SET('USING_SYSTEM_PYLDB_UTIL'):
for env in bld.gen_python_environments(['PKGCONFIGDIR']):
bld.SAMBA_SCRIPT('_ldb_text.py',
pattern='_ldb_text.py',
installdir='python')
bld.INSTALL_FILES('${PYTHONARCHDIR}', '_ldb_text.py')
if not bld.CONFIG_SET('USING_SYSTEM_LDB'):
if bld.is_install:
modules_dir = bld.EXPAND_VARIABLES('${LDB_MODULESDIR}')
else:
# when we run from the source directory, we want to use
# the current modules, not the installed ones
modules_dir = os.path.join(os.getcwd(), 'bin/modules/ldb')
abi_match = '!ldb_*module_ops !ldb_*backend_ops ldb_*'
ldb_headers = ('include/ldb.h include/ldb_errors.h '
'include/ldb_module.h include/ldb_handlers.h')
bld.SAMBA_LIBRARY('ldb',
COMMON_SRC + ' ' + LDB_MAP_SRC,
deps='tevent LIBLDB_MAIN replace',
includes='include',
public_headers=('' if private_library else ldb_headers),
public_headers_install=not private_library,
pc_files='ldb.pc',
vnum=VERSION,
private_library=private_library,
manpages='man/ldb.3',
abi_directory='ABI',
abi_match = abi_match)
# generate a include/ldb_version.h
def generate_ldb_version_h(t):
'''generate a vscript file for our public libraries'''
tgt = t.outputs[0].bldpath(t.env)
v = t.env.LDB_VERSION.split('.')
f = open(tgt, mode='w')
try:
f.write('#define LDB_VERSION "%s"\n' % t.env.LDB_VERSION)
f.write('#define LDB_VERSION_MAJOR %d\n' % int(v[0]))
f.write('#define LDB_VERSION_MINOR %d\n' % int(v[1]))
f.write('#define LDB_VERSION_RELEASE %d\n' % int(v[2]))
finally:
f.close()
return
t = bld.SAMBA_GENERATOR('ldb_version.h',
rule=generate_ldb_version_h,
dep_vars=['LDB_VERSION'],
target='include/ldb_version.h',
public_headers='include/ldb_version.h',
public_headers_install=not private_library)
t.env.LDB_VERSION = VERSION
bld.SAMBA_MODULE('ldb_paged_results',
'modules/paged_results.c',
init_function='ldb_paged_results_init',
module_init_name='ldb_init_module',
internal_module=False,
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_asq',
'modules/asq.c',
init_function='ldb_asq_init',
module_init_name='ldb_init_module',
internal_module=False,
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_server_sort',
'modules/sort.c',
init_function='ldb_server_sort_init',
internal_module=False,
module_init_name='ldb_init_module',
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_paged_searches',
'modules/paged_searches.c',
init_function='ldb_paged_searches_init',
internal_module=False,
module_init_name='ldb_init_module',
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_rdn_name',
'modules/rdn_name.c',
init_function='ldb_rdn_name_init',
internal_module=False,
module_init_name='ldb_init_module',
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_sample',
'tests/sample_module.c',
init_function='ldb_sample_init',
internal_module=False,
module_init_name='ldb_init_module',
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_skel',
'modules/skel.c',
init_function='ldb_skel_init',
internal_module=False,
module_init_name='ldb_init_module',
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_sqlite3',
'sqlite3/ldb_sqlite3.c',
init_function='ldb_sqlite3_init',
internal_module=False,
module_init_name='ldb_init_module',
enabled=False,
deps='ldb',
subsystem='ldb')
bld.SAMBA_MODULE('ldb_tdb',
bld.SUBDIR('ldb_tdb',
'''ldb_tdb_init.c'''),
init_function='ldb_tdb_init',
module_init_name='ldb_init_module',
internal_module=False,
deps='tdb ldb ldb_key_value',
subsystem='ldb')
bld.SAMBA_LIBRARY('ldb_key_value',
bld.SUBDIR('ldb_tdb',
'''ldb_tdb.c ldb_search.c ldb_index.c
ldb_cache.c ldb_tdb_wrap.c'''),
private_library=True,
deps='tdb ldb')
if bld.CONFIG_SET('HAVE_LMDB'):
bld.SAMBA_MODULE('ldb_mdb',
bld.SUBDIR('ldb_mdb',
'''ldb_mdb_init.c'''),
init_function='ldb_mdb_init',
module_init_name='ldb_init_module',
internal_module=False,
deps='ldb ldb_key_value ldb_mdb_int',
subsystem='ldb')
bld.SAMBA_LIBRARY('ldb_mdb_int',
bld.SUBDIR('ldb_mdb',
'''ldb_mdb.c '''),
private_library=True,
deps='ldb lmdb ldb_key_value')
lmdb_deps = ' ldb_mdb_int'
else:
lmdb_deps = ''
bld.SAMBA_MODULE('ldb_ldb',
bld.SUBDIR('ldb_ldb',
'''ldb_ldb.c'''),
init_function='ldb_ldb_init',
module_init_name='ldb_init_module',
internal_module=False,
deps='ldb ldb_key_value' + lmdb_deps,
subsystem='ldb')
# have a separate subsystem for common/ldb.c, so it can rebuild
# for install with a different -DLDB_MODULESDIR=
bld.SAMBA_SUBSYSTEM('LIBLDB_MAIN',
'common/ldb.c',
deps='tevent tdb',
includes='include',
cflags=['-DLDB_MODULESDIR=\"%s\"' % modules_dir])
LDB_TOOLS='ldbadd ldbsearch ldbdel ldbmodify ldbedit ldbrename'
for t in LDB_TOOLS.split():
bld.SAMBA_BINARY(t, 'tools/%s.c' % t, deps='ldb-cmdline ldb',
manpages='man/%s.1' % t)
# ldbtest doesn't get installed
bld.SAMBA_BINARY('ldbtest', 'tools/ldbtest.c', deps='ldb-cmdline ldb',
install=False)
if bld.CONFIG_SET('HAVE_LMDB'):
lmdb_deps = ' lmdb'
else:
lmdb_deps = ''
# ldbdump doesn't get installed
bld.SAMBA_BINARY('ldbdump',
'tools/ldbdump.c',
deps='ldb-cmdline ldb' + lmdb_deps,
install=False)
bld.SAMBA_LIBRARY('ldb-cmdline',
source='tools/ldbutil.c tools/cmdline.c',
deps='ldb dl popt',
private_library=True)
bld.SAMBA_BINARY('ldb_tdb_mod_op_test',
source='tests/ldb_mod_op_test.c',
cflags='-DTEST_BE=\"tdb\"',
deps='cmocka ldb',
install=False)
bld.SAMBA_BINARY('ldb_tdb_guid_mod_op_test',
source='tests/ldb_mod_op_test.c',
cflags='-DTEST_BE=\"tdb\" -DGUID_IDX=1',
deps='cmocka ldb',
install=False)
bld.SAMBA_BINARY('ldb_tdb_kv_ops_test',
source='tests/ldb_kv_ops_test.c',
cflags='-DTEST_BE=\"tdb\"',
deps='cmocka ldb',
install=False)
bld.SAMBA_BINARY('ldb_tdb_test',
source='tests/ldb_tdb_test.c',
deps='cmocka ldb',
install=False)
bld.SAMBA_BINARY('ldb_msg_test',
source='tests/ldb_msg.c',
deps='cmocka ldb',
install=False)
bld.SAMBA_BINARY('test_ldb_qsort',
source='tests/test_ldb_qsort.c',
deps='cmocka ldb',
install=False)
if bld.CONFIG_SET('HAVE_LMDB'):
bld.SAMBA_BINARY('ldb_mdb_mod_op_test',
source='tests/ldb_mod_op_test.c',
cflags='-DTEST_BE=\"mdb\" -DGUID_IDX=1 '
+ '-DTEST_LMDB=1',
deps='cmocka ldb lmdb',
install=False)
bld.SAMBA_BINARY('ldb_lmdb_test',
source='tests/ldb_lmdb_test.c',
deps='cmocka ldb',
install=False)
bld.SAMBA_BINARY('ldb_lmdb_size_test',
source='tests/ldb_lmdb_size_test.c',
deps='cmocka ldb',
install=False)
bld.SAMBA_BINARY('ldb_mdb_kv_ops_test',
source='tests/ldb_kv_ops_test.c',
cflags='-DTEST_BE=\"mdb\"',
deps='cmocka ldb',
install=False)
def test(ctx):
'''run ldb testsuite'''
import Utils, samba_utils, shutil
env = samba_utils.LOAD_ENVIRONMENT()
ctx.env = env
if not env.HAVE_LMDB:
raise Utils.WafError('make test called, but ldb was built '
'--without-ldb-lmdb')
test_prefix = "%s/st" % (Utils.g_module.blddir)
shutil.rmtree(test_prefix, ignore_errors=True)
os.makedirs(test_prefix)
os.environ['TEST_DATA_PREFIX'] = test_prefix
os.environ['LDB_MODULES_PATH'] = Utils.g_module.blddir + "/modules/ldb"
samba_utils.ADD_LD_LIBRARY_PATH('bin/shared')
samba_utils.ADD_LD_LIBRARY_PATH('bin/shared/private')
cmd = 'tests/test-tdb.sh %s' % Utils.g_module.blddir
ret = samba_utils.RUN_COMMAND(cmd)
print("testsuite returned %d" % ret)
tmp_dir = os.path.join(test_prefix, 'tmp')
if not os.path.exists(tmp_dir):
os.mkdir(tmp_dir)
pyret = samba_utils.RUN_PYTHON_TESTS(
['tests/python/api.py', 'tests/python/index.py'],
extra_env={'SELFTEST_PREFIX': test_prefix})
print("Python testsuite returned %d" % pyret)
cmocka_ret = 0
test_exes = ['test_ldb_qsort',
'ldb_msg_test',
'ldb_tdb_mod_op_test',
'ldb_tdb_guid_mod_op_test',
'ldb_msg_test',
'ldb_tdb_kv_ops_test',
'ldb_tdb_test',
'ldb_mdb_mod_op_test',
'ldb_lmdb_test',
# we don't want to run ldb_lmdb_size_test (which proves we can
# fit > 4G of data into the DB), it would fill up the disk on
# many of our test instances
'ldb_mdb_kv_ops_test']
for test_exe in test_exes:
cmd = os.path.join(Utils.g_module.blddir, test_exe)
cmocka_ret = cmocka_ret or samba_utils.RUN_COMMAND(cmd)
sys.exit(ret or pyret or cmocka_ret)
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)