import os, os.path, sys
+import tempfile
from SCons.Script import *
import SCons.Scanner.C
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:
builder = env.Builder(
action = CompileCheck,
- suffix = '.tsto',
+ suffix = '.checked',
src_suffix = '.cc',
source_scanner = SCons.Scanner.C.CScanner(),
single_source=1