From 281f27d54bf1faf12c918d1d3753e25f74d2a0d8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 23 Feb 2010 13:04:34 +1100 Subject: build: check for circular build dependencies --- lib/replace/wafsamba.py | 47 ++++++++++++++++++++++++++++++++++++++++++----- source4/wscript_build | 3 +++ 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() -- cgit