Console: Overhaul documentation
[senf.git] / senfscons / CompileCheck.py
1 import os, os.path, sys
2 from SCons.Script import *
3 import SCons.Scanner.C
4
5 def scanTests(f):
6     tests = {}
7     name = start = None
8     linenr= 0
9     for line in f:
10         linenr += 1
11         if line.startswith('COMPILE_FAIL(') and ')' in line:
12             name = line.split('(',1)[-1].split(')',1)[0]
13             start = linenr
14         elif line.startswith('}') and name and start:
15             tests[name] = (start, linenr)
16     return tests
17             
18 def CompileCheck(target, source, env):
19     tests = scanTests(file(source[0].abspath))
20     errf = os.popen(env.subst('$CXXCOM -DCOMPILE_CHECK 2>&1', source=source, target=target))
21     passedTests = {}
22     delay_name = None
23     for error in errf:
24         elts = error.split(':',2)
25         if len(elts) != 3 : continue
26         filename, line, message = elts
27         if not os.path.exists(filename) : continue
28         try: line = int(line)
29         except ValueError : continue
30         message = message.strip()
31
32         if delay_name and not message.startswith('instantiated from '):
33             print "Passed test '%s': %s" % (delay_name, message)
34             delay_name = None
35             continue
36             
37         filename = os.path.abspath(filename)
38         if filename != source[0].abspath : continue
39
40         for name,lines in tests.iteritems():
41             if line >= lines[0] and line <= lines[1]:
42                 passedTests[name] = 1
43                 if message.startswith('instantiated from '):
44                     delay_name = name
45                 else:
46                     print "Passed test '%s': %s" % (name, message)
47     if delay_name:
48         print "Passed test '%s': <unknown message ??>" % delay_name
49     failedTests = set(tests.iterkeys()) - set(passedTests.iterkeys())
50     if failedTests:
51         for test in failedTests:
52             print "Test '%s' FAILED" % test
53         print
54         print "*** %d tests FAILED" % len(failedTests)
55         if os.path.exists(target[0].abspath):
56             os.unlink(target[0].abspath)
57         return 1
58     file(target[0].abspath,"w").close()
59     return 0
60
61 CompileCheck = Action(CompileCheck)
62
63 def generate(env):
64
65     builder = env.Builder(
66         action = CompileCheck,
67         suffix = '.tsto',
68         src_suffix = '.cc',
69         source_scanner = SCons.Scanner.C.CScanner(),
70         single_source=1
71     )
72
73     env.Append(BUILDERS = { 'CompileCheck': builder })
74
75 def exists(env):
76     return True