1 import os, os.path, sys
3 from SCons.Script import *
12 if line.startswith('COMPILE_FAIL(') and ')' in line:
13 name = line.split('(',1)[-1].split(')',1)[0]
15 elif line.startswith('}') and name and start:
16 tests[name] = (start, linenr)
19 def CompileCheck(target, source, env):
20 tests = scanTests(file(source[0].abspath))
22 cenv.Append( CPPDEFINES = { 'COMPILE_CHECK': '' } )
23 out = tempfile.TemporaryFile()
24 cenv['SPAWN'] = lambda sh, escape, cmd, args, env, pspawn=cenv['PSPAWN'], out=out: \
25 pspawn(sh, escape, cmd, args, env, out, out)
26 Action('$CXXCOM').execute(target, source, cenv)
30 for error in out.read().splitlines():
31 elts = error.split(':',2)
32 if len(elts) != 3 : continue
33 filename, line, message = elts
34 if not os.path.exists(filename) : continue
36 except ValueError : continue
37 message = message.strip()
39 if delay_name and not message.startswith('instantiated from '):
40 print "Passed test '%s': %s" % (delay_name, message)
44 filename = os.path.abspath(filename)
45 if filename != source[0].abspath : continue
47 for name,lines in tests.iteritems():
48 if line >= lines[0] and line <= lines[1]:
50 if message.startswith('instantiated from '):
53 print "Passed test '%s': %s" % (name, message)
55 print "Passed test '%s': <unknown message ??>" % delay_name
56 failedTests = set(tests.iterkeys()) - set(passedTests.iterkeys())
58 for test in failedTests:
59 print "Test '%s' FAILED" % test
61 print "*** %d tests FAILED" % len(failedTests)
62 if os.path.exists(target[0].abspath):
63 os.unlink(target[0].abspath)
65 file(target[0].abspath,"w").close()
68 CompileCheck = Action(CompileCheck)
72 builder = env.Builder(
73 action = CompileCheck,
76 source_scanner = SCons.Scanner.C.CScanner(),
80 env.Append(BUILDERS = { 'CompileCheck': builder })