minor fixes for clang++
[senf.git] / site_scons / SparseTestHack.py
index 3ecacaf..56cbada 100644 (file)
@@ -1,4 +1,4 @@
-import SCons.Node, SCons.Node.FS, SCons.Util, SCons.Errors
+import SCons.Node, SCons.Node.FS, SCons.Util, SCons.Errors, os
 
 #####################################################################
 # This IS a hack .. but a very useful one: The hack will remove the
@@ -6,7 +6,7 @@ import SCons.Node, SCons.Node.FS, SCons.Util, SCons.Errors
 # files needed explicitly.
 #
 # This works by building a list of all children (recursively) of the
-# test sources. For each child we check, wether a file with the same
+# test sources. For each child we check, whether a file with the same
 # name but an $OBJSUFFIX extension exists as a build target. In that
 # case, we add it to the list of needed objects (AND recursively scan
 # that objects children).
@@ -80,11 +80,13 @@ def setup(env):
     env['BUILDERS']['RealBoostUnitTest'] = env['BUILDERS']['BoostUnitTest']
     env['BUILDERS']['BoostUnitTest'] = AutoObjectBoostUnitTest
     env['_UNIT_TEST_LIST'] = []
+    env.Append(EXTRA_LIBS = [ '$BOOSTREGEXLIB', '$BOOSTSIGNALSLIB',
+                       '$BOOSTFSLIB', '$BOOSTSYSTEMLIB', '$BOOSTDATETIMELIB' ])
 
 # This needs to be called after all build targets have been set
 # up. This is important since the list of object targets needs to be
 # complete.
-def build(env):
+def build(env, accept_unknown_tests=False, verbose=False):
     env = env.Clone(LIBS = [ '$EXTRA_LIBS' ])
     if env.has_key("only_tests"):
         only_tests = {}
@@ -124,7 +126,31 @@ def build(env):
 
         env.RealBoostUnitTest(target, objects, **kw)
 
-    only_tests = [ k for k,v in only_tests.iteritems() if not v ]
-    if only_tests:
-        raise SCons.Errors.StopError("Unknown unit tests (only_tests): %s." 
-                                     % ", ".join("`%s'" % x for x in only_tests))
+    if verbose and only_tests and not env.GetOption('no_progress'):
+        SCons.Util.display("scons: building tests: " + ", ".join("`%s'" % str(k)
+                                                                 for k,v in only_tests.iteritems()
+                                                                 if v))
+    if not accept_unknown_tests:
+        only_tests = [ k for k,v in only_tests.iteritems() if not v ]
+        if only_tests:
+            raise SCons.Errors.StopError("Unknown unit tests (only_tests): %s." 
+                                         % ", ".join("`%s'" % x for x in only_tests))
+
+def findSCMChanges(env):
+
+    def scmchanges(dir):
+        if os.popen("cd %s; svnversion" % dir.abspath).read().strip() in ("","exported"):
+            return [ dir.Entry(x)
+                     for x in os.popen("cd %s; git ls-files --modified" 
+                                       % dir.abspath).read().strip().split("\n") ]
+        else:
+            return [ dir.Entry(l[7:])
+                     for l in os.popen("cd %s; svn status" 
+                                       % dir.abspath).read().rstrip().split("\n")
+                     if l[0] == 'M' ]
+
+    changes=scmchanges(env.Dir('#'))
+    for dir in env.Dir('senf/Ext').glob("*"):
+        if isinstance(dir,SCons.Node.FS.Dir):
+            changes.extend(scmchanges(dir))
+    return [ x for x in changes if not isinstance(x,SCons.Node.FS.Dir) ]