s4-waf: added implied_deps for system libraries
authorAndrew Tridgell <tridge@samba.org>
Mon, 29 Mar 2010 11:27:17 +0000 (22:27 +1100)
committerAndrew Tridgell <tridge@samba.org>
Tue, 6 Apr 2010 10:27:17 +0000 (20:27 +1000)
when we use a system version of a library such as talloc, then we
no longer get the automtica dependency propogation of talloc implying
libreplace. That means we don't get the includes for libreplace, which
means things can fail to build.

To fix this this change adds an implied_deps option to
CHECK_BUNDLED_SYSTEM(), which tells the samba_deps module to add an
implied dependency on the listed targets if the system library is
chosen.

buildtools/wafsamba/samba_bundled.py
buildtools/wafsamba/samba_deps.py
lib/talloc/wscript
lib/tdb/wscript
lib/tevent/wscript
source4/lib/ldb/wscript

index b2d1b0ef14382c581ad0905f33e00a54d7d15981..28116fcd696bee8cc1c1d1a86da062b857dc1f56 100644 (file)
@@ -46,7 +46,8 @@ Options.Handler.BUNDLED_EXTENSION_DEFAULT = BUNDLED_EXTENSION_DEFAULT
 @runonce
 @conf
 def CHECK_BUNDLED_SYSTEM(conf, libname, minversion='0.0.0',
-                         checkfunctions=None, headers=None, onlyif=None):
+                         checkfunctions=None, headers=None,
+                         onlyif=None, implied_deps=None):
     '''check if a library is available as a system library.
     this first tries via pkg-config, then if that fails
     tries by testing for a specified function in the specified lib
@@ -76,10 +77,14 @@ def CHECK_BUNDLED_SYSTEM(conf, libname, minversion='0.0.0',
                       msg='Checking for system %s >= %s' % (libname, minversion)):
         conf.SET_TARGET_TYPE(libname, 'SYSLIB')
         conf.env[found] = True
+        if implied_deps:
+            conf.SET_SYSLIB_DEPS(libname, implied_deps)
         return True
     if checkfunctions is not None:
         if conf.CHECK_FUNCS_IN(checkfunctions, libname, headers=headers, empty_decl=False):
             conf.env[found] = True
+            if implied_deps:
+                conf.SET_SYSLIB_DEPS(libname, implied_deps)
             return True
     conf.env[found] = False
     if 'NONE' in conf.env.BUNDLED_LIBS or '!'+libname in conf.env.BUNDLED_LIBS:
index 02d4c421d55a0d4a14f01b525a176be33634f7c2..bc9325f214f815a869f26740cd988d0cdbfe0c52 100644 (file)
@@ -22,6 +22,13 @@ def TARGET_ALIAS(bld, target, alias):
 Build.BuildContext.TARGET_ALIAS = TARGET_ALIAS
 
 
+@conf
+def SET_SYSLIB_DEPS(conf, target, deps):
+    '''setup some implied dependencies for a SYSLIB'''
+    cache = LOCAL_CACHE(conf, 'SYSLIB_DEPS')
+    cache[target] = deps
+
+
 def EXPAND_ALIAS(bld, target):
     '''expand a target name via an alias'''
     aliases = LOCAL_CACHE(bld, 'TARGET_ALIAS')
@@ -308,6 +315,7 @@ def build_direct_deps(bld, tgt_list):
     '''build the direct_objects and direct_libs sets for each target'''
 
     targets  = LOCAL_CACHE(bld, 'TARGET_TYPE')
+    syslib_deps  = LOCAL_CACHE(bld, 'SYSLIB_DEPS')
     global_deps = bld.env.GLOBAL_DEPENDENCIES
 
     for t in tgt_list:
@@ -326,6 +334,10 @@ def build_direct_deps(bld, tgt_list):
                 continue
             if targets[d] == 'SYSLIB':
                 t.direct_syslibs.add(d)
+                if d in syslib_deps:
+                    for implied in TO_LIST(syslib_deps[d]):
+                        print("Adding implied lib %s to %s" % (implied, t.sname))
+                        t.direct_libs.add(implied)
                 continue
             t2 = bld.name_to_obj(d, bld.env)
             if t2 is None:
@@ -622,7 +634,7 @@ savedeps_version = 3
 savedeps_inputs  = ['samba_deps', 'samba_includes', 'local_include', 'local_include_first', 'samba_cflags', 'source']
 savedeps_outputs = ['uselib', 'uselib_local', 'add_objects', 'includes', 'ccflags']
 savedeps_outenv  = ['INC_PATHS']
-savedeps_caches  = ['GLOBAL_DEPENDENCIES', 'TARGET_ALIAS', 'TARGET_TYPE', 'INIT_FUNCTIONS']
+savedeps_caches  = ['GLOBAL_DEPENDENCIES', 'TARGET_ALIAS', 'TARGET_TYPE', 'INIT_FUNCTIONS', 'SYSLIB_DEPS']
 savedeps_files   = ['buildtools/wafsamba/samba_deps.py']
 
 def save_samba_deps(bld, tgt_list):
index e8aa1774e4e48b8650bc2ce5bc227b0720ec38b9..3526d5a730b4393a4ce9c193269ef438ab4382c2 100644 (file)
@@ -19,7 +19,8 @@ def set_options(opt):
 def configure(conf):
     conf.sub_config(LIBREPLACE_DIR)
 
-    if conf.CHECK_BUNDLED_SYSTEM('talloc', minversion=VERSION):
+    if conf.CHECK_BUNDLED_SYSTEM('talloc', minversion=VERSION,
+                                 implied_deps='replace'):
         conf.define('USING_SYSTEM_TALLOC', 1)
 
     conf.SAMBA_CONFIG_H()
index 365c3842016dc512af764410e4227ecc0a84711e..d16516b8b5c25e89527e722a1fa4e93da635a4d5 100644 (file)
@@ -20,7 +20,8 @@ def set_options(opt):
 def configure(conf):
     conf.sub_config(LIBREPLACE_DIR)
 
-    if conf.CHECK_BUNDLED_SYSTEM('tdb', minversion=VERSION):
+    if conf.CHECK_BUNDLED_SYSTEM('tdb', minversion=VERSION,
+                                 implied_deps='replace'):
         conf.define('USING_SYSTEM_TDB', 1)
 
     conf.SAMBA_CONFIG_H()
index a84dad663c44fa09cbe9a8a51606feecf8ca218d..30db216de11957e6c5777c7d72f3c628cecf991d 100644 (file)
@@ -22,7 +22,8 @@ def configure(conf):
     conf.sub_config(LIBREPLACE_DIR)
     conf.sub_config(LIBTALLOC_DIR)
 
-    if conf.CHECK_BUNDLED_SYSTEM('tevent', minversion=VERSION, onlyif='talloc'):
+    if conf.CHECK_BUNDLED_SYSTEM('tevent', minversion=VERSION,
+                                 onlyif='talloc', implied_deps='replace talloc'):
         conf.define('USING_SYSTEM_TEVENT', 1)
 
     if conf.CHECK_FUNCS('epoll_create', headers='sys/epoll.h'):
index a7419e1981c716349956776c0f5cbd0fd600752a..18a9f4c271510f3e7321b2fb6142b5ca5ce8311f 100644 (file)
@@ -32,7 +32,8 @@ def configure(conf):
 
     if not s4_build:
         if conf.CHECK_BUNDLED_SYSTEM('ldb', minversion=VERSION,
-                                     onlyif='talloc tdb tevent'):
+                                     onlyif='talloc tdb tevent',
+                                     implied_deps='replace talloc tdb tevent'):
             conf.define('USING_SYSTEM_LDB', 1)
         # we need this for the ldap backend
         conf.CHECK_FUNCS_IN('ber_flush ldap_open', 'lber ldap', headers='lber.h ldap.h', mandatory=True)