summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2010-02-23 13:04:34 +1100
committerAndrew Tridgell <tridge@samba.org>2010-04-06 20:26:36 +1000
commit281f27d54bf1faf12c918d1d3753e25f74d2a0d8 (patch)
tree3a3c7ab7cd1f27b285e236a0d7d7581824768677
parent4f920748d4e97f81793943815494a8e8d90d2c8d (diff)
downloadsamba-281f27d54bf1faf12c918d1d3753e25f74d2a0d8.tar.gz
samba-281f27d54bf1faf12c918d1d3753e25f74d2a0d8.tar.bz2
samba-281f27d54bf1faf12c918d1d3753e25f74d2a0d8.zip
build: check for circular build dependencies
-rw-r--r--lib/replace/wafsamba.py47
-rw-r--r--source4/wscript_build3
2 files changed, 45 insertions, 5 deletions
diff --git a/lib/replace/wafsamba.py b/lib/replace/wafsamba.py
index e26d602db0..575e946c29 100644
--- a/lib/replace/wafsamba.py
+++ b/lib/replace/wafsamba.py
@@ -124,11 +124,10 @@ Build.BuildContext.set_rpath = set_rpath
# return a named build cache dictionary, used to store
# state inside the following functions
def BUILD_CACHE(bld, name):
- try:
- cache = bld.name
- except AttributeError:
- bld.name = cache = {}
- return cache
+ if name in bld.env:
+ return bld.env[name]
+ bld.env[name] = {}
+ return bld.env[name]
#############################################################
@@ -220,6 +219,9 @@ def SAMBA_LIBRARY(bld, libname, source_list,
)
cache = BUILD_CACHE(bld, 'INCLUDE_LIST')
cache[libname] = ilist
+
+ cache = BUILD_CACHE(bld, 'LIB_DEPS')
+ cache[libname] = deps.split()
Build.BuildContext.SAMBA_LIBRARY = SAMBA_LIBRARY
@@ -240,6 +242,9 @@ def SAMBA_BINARY(bld, binname, source_list,
ilist = bld.NORMPATH(ilist)
ccflags = ''
+ cache = BUILD_CACHE(bld, 'LIB_DEPS')
+ cache[binname] = deps.split()
+
cache = BUILD_CACHE(bld, 'INIT_FUNCTIONS')
if modules is not None:
for m in modules.split():
@@ -270,6 +275,10 @@ def SAMBA_PYTHON(bld, name, source_list,
deps='',
public_deps='',
realname=''):
+
+ cache = BUILD_CACHE(bld, 'LIB_DEPS')
+ cache[name] = deps.split()
+
Logs.debug('runner: PYTHON_SAMBA not implemented')
return
Build.BuildContext.SAMBA_PYTHON = SAMBA_PYTHON
@@ -328,6 +337,34 @@ def BUILD_SUBDIR(bld, dir):
bld.add_subdirs(dir)
Build.BuildContext.BUILD_SUBDIR = BUILD_SUBDIR
+def CIRCULAR_DEPENDENCY(deps, path, cache, target):
+ if target not in cache:
+ return False
+ for t in cache[target]:
+ if t in deps:
+ print "Circular dependency on target %s: %s" % (t, path)
+ return True
+ if CIRCULAR_DEPENDENCY(deps,
+ ("%s->%s" % (path, t)),
+ cache, t):
+ return True
+ deps[t] = True
+ return False
+
+############################################################
+# check our build dependencies for circular dependencies
+def CHECK_DEPENDENCIES(bld):
+ cache = BUILD_CACHE(bld, 'LIB_DEPS')
+ print "Checking for circular dependencies"
+ for target in cache:
+ deps = {}
+ path = target
+ bld.ASSERT(not CIRCULAR_DEPENDENCY(deps, path, cache, target),
+ "Circular dependency in target %s" % target)
+ print "No circular dependencies"
+
+Build.BuildContext.CHECK_DEPENDENCIES = CHECK_DEPENDENCIES
+
############################################################
# this overrides the 'waf -v' debug output to be in a nice
diff --git a/source4/wscript_build b/source4/wscript_build
index 9fdc6b9ecf..e6841f3aec 100644
--- a/source4/wscript_build
+++ b/source4/wscript_build
@@ -62,3 +62,6 @@ bld.BUILD_SUBDIR('../libcli/drsuapi')
bld.BUILD_SUBDIR('../libcli/samsync')
bld.BUILD_SUBDIR('../libgpo')
bld.BUILD_SUBDIR('../libcli/named_pipe_auth')
+
+# check if we have any circular build dependencies
+bld.CHECK_DEPENDENCIES()