Adapt to latest scons Version
[senf.git] / senfscons / CompileCheck.py
index 171578f..95358a1 100644 (file)
@@ -1,4 +1,5 @@
 import os, os.path, sys
+import tempfile
 from SCons.Script import *
 import SCons.Scanner.C
 
@@ -14,25 +15,44 @@ def scanTests(f):
         elif line.startswith('}') and name and start:
             tests[name] = (start, linenr)
     return tests
-            
+
 def CompileCheck(target, source, env):
     tests = scanTests(file(source[0].abspath))
-    errf = os.popen(env.subst('$CXXCOM -DCOMPILE_CHECK 2>&1', source=source, target=target))
+    cenv = env.Clone()
+    cenv.Append( CPPDEFINES = { 'COMPILE_CHECK': '' } )
+    out = tempfile.TemporaryFile()
+    cenv['SPAWN'] = lambda sh, escape, cmd, args, env, pspawn=cenv['PSPAWN'], out=out: \
+                    pspawn(sh, escape, cmd, args, env, out, out)
+    Action('$CXXCOM').execute(target, source, cenv)
     passedTests = {}
-    for error in errf:
+    delay_name = None
+    out.seek(0)
+    for error in out.read().splitlines():
         elts = error.split(':',2)
         if len(elts) != 3 : continue
         filename, line, message = elts
         if not os.path.exists(filename) : continue
         try: line = int(line)
         except ValueError : continue
+        message = message.strip()
+
+        if delay_name and not message.startswith('instantiated from '):
+            print "Passed test '%s': %s" % (delay_name, message)
+            delay_name = None
+            continue
+            
         filename = os.path.abspath(filename)
         if filename != source[0].abspath : continue
 
         for name,lines in tests.iteritems():
             if line >= lines[0] and line <= lines[1]:
                 passedTests[name] = 1
-                print "Passed test '%s': %s" % (name, message.strip())
+                if message.startswith('instantiated from '):
+                    delay_name = name
+                else:
+                    print "Passed test '%s': %s" % (name, message)
+    if delay_name:
+        print "Passed test '%s': <unknown message ??>" % delay_name
     failedTests = set(tests.iterkeys()) - set(passedTests.iterkeys())
     if failedTests:
         for test in failedTests:
@@ -51,7 +71,7 @@ def generate(env):
 
     builder = env.Builder(
         action = CompileCheck,
-        suffix = '.tsto',
+        suffix = '.checked',
         src_suffix = '.cc',
         source_scanner = SCons.Scanner.C.CScanner(),
         single_source=1