ldb: version 1.3.2
[samba.git] / lib / ldb / wscript
old mode 100755 (executable)
new mode 100644 (file)
index 2796243..6a204c0
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 APPNAME = 'ldb'
-VERSION = '1.1.24'
+VERSION = '1.3.2'
 
 blddir = 'bin'
 
@@ -18,8 +18,10 @@ import wafsamba, samba_dist, Utils
 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')
@@ -35,18 +37,24 @@ def configure(conf):
 
     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=True)
+    conf.SAMBA_CHECK_PYTHON_HEADERS(mandatory=not conf.env.disable_python)
 
     # where does the default LIBDIR end up? in conf.env somewhere?
     #
@@ -55,15 +63,41 @@ def configure(conf):
     conf.env.standalone_ldb = conf.IN_LAUNCH_DIR()
 
     if not conf.env.standalone_ldb:
-        if conf.CHECK_BUNDLED_SYSTEM_PKG('pyldb-util', minversion=VERSION,
-                                     onlyif='talloc tdb tevent',
-                                     implied_deps='replace talloc tdb tevent ldb'):
-            conf.define('USING_SYSTEM_PYLDB_UTIL', 1)
+        if conf.env.disable_python:
+            if conf.CHECK_BUNDLED_SYSTEM_PKG('ldb', minversion=VERSION,
+                                         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,
+                                             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,
+                                                     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,
                                          onlyif='talloc tdb tevent pyldb-util',
                                          implied_deps='replace talloc tdb tevent'):
                 conf.define('USING_SYSTEM_LDB', 1)
 
+    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()
 
@@ -87,6 +121,7 @@ def build(bld):
 
     if bld.CHECK_FOR_THIRD_PARTY():
         bld.RECURSE('third_party/popt')
+        bld.RECURSE('third_party/cmocka')
 
     bld.RECURSE('lib/replace')
     bld.RECURSE('lib/tdb')
@@ -112,27 +147,28 @@ def build(bld):
                      internal_module=False,
                      subsystem='ldb')
 
-    # we're not currently linking against the ldap libs, but ldb.pc.in
-    # has @LDAP_LIBS@
-    bld.env.LDAP_LIBS = ''
-
-    if not 'PACKAGE_VERSION' in bld.env:
-        bld.env.PACKAGE_VERSION = VERSION
-        bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
-
-    if not bld.env.disable_python:
+    if bld.PYTHON_BUILD_IS_ENABLED():
         if not bld.CONFIG_SET('USING_SYSTEM_PYLDB_UTIL'):
             for env in bld.gen_python_environments(['PKGCONFIGDIR']):
+                # we're not currently linking against the ldap libs, but ldb.pc.in
+                # has @LDAP_LIBS@
+                bld.env.LDAP_LIBS = ''
+
+                if not 'PACKAGE_VERSION' in bld.env:
+                    bld.env.PACKAGE_VERSION = VERSION
+                    bld.env.PKGCONFIGDIR = '${LIBDIR}/pkgconfig'
+
                 name = bld.pyembed_libname('pyldb-util')
                 bld.SAMBA_LIBRARY(name,
                                   deps='ldb',
                                   source='pyldb_util.c',
-                                  public_headers='pyldb.h',
+                                  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_*')
 
@@ -142,12 +178,15 @@ def build(bld):
                                      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.SAMBA_SCRIPT('_ldb_text.py',
+                                     pattern='_ldb_text.py',
+                                     installdir='python')
 
-                bld.INSTALL_FILES('${PYTHONARCHDIR}', '_ldb_text.py')
+                    bld.INSTALL_FILES('${PYTHONARCHDIR}', '_ldb_text.py')
 
     if not bld.CONFIG_SET('USING_SYSTEM_LDB'):
         if bld.is_install:
@@ -159,12 +198,14 @@ def build(bld):
 
         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='include/ldb.h include/ldb_errors.h '\
-                          'include/ldb_module.h include/ldb_handlers.h',
+                          public_headers=('' if private_library else ldb_headers),
                           public_headers_install=not private_library,
                           pc_files='ldb.pc',
                           vnum=VERSION,
@@ -174,8 +215,24 @@ def build(bld):
                           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='echo "#define LDB_VERSION \\"${LDB_VERSION}\\"" > ${TGT}',
+                                rule=generate_ldb_version_h,
                                 dep_vars=['LDB_VERSION'],
                                 target='include/ldb_version.h',
                                 public_headers='include/ldb_version.h',
@@ -284,14 +341,31 @@ def build(bld):
                           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_msg_test',
+                         source='tests/ldb_msg.c',
+                         deps='cmocka ldb',
+                         install=False)
 
 def test(ctx):
     '''run ldb testsuite'''
     import Utils, samba_utils, shutil
+    env = samba_utils.LOAD_ENVIRONMENT()
+    ctx.env = env
+
     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)
@@ -303,7 +377,14 @@ def test(ctx):
         ['tests/python/api.py'],
         extra_env={'SELFTEST_PREFIX': test_prefix})
     print("Python testsuite returned %d" % pyret)
-    sys.exit(ret or pyret)
+
+    cmocka_ret = 0
+    for test_exe in ['ldb_tdb_mod_op_test',
+                     'ldb_msg_test']:
+            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'''