lit: Provide source locations in cfg files with older Python versions
[oota-llvm.git] / utils / lit / lit / TestingConfig.py
1 import os
2 import sys
3
4 OldPy = sys.version_info[0] == 2 and sys.version_info[1] < 7
5
6 class TestingConfig:
7     """"
8     TestingConfig - Information on the tests inside a suite.
9     """
10
11     @staticmethod
12     def fromdefaults(litConfig):
13         """
14         fromdefaults(litConfig) -> TestingConfig
15
16         Create a TestingConfig object with default values.
17         """
18         # Set the environment based on the command line arguments.
19         environment = {
20             'LIBRARY_PATH' : os.environ.get('LIBRARY_PATH',''),
21             'LD_LIBRARY_PATH' : os.environ.get('LD_LIBRARY_PATH',''),
22             'PATH' : os.pathsep.join(litConfig.path +
23                                      [os.environ.get('PATH','')]),
24             'SYSTEMROOT' : os.environ.get('SYSTEMROOT',''),
25             'TERM' : os.environ.get('TERM',''),
26             'LLVM_DISABLE_CRASH_REPORT' : '1',
27             }
28
29         if sys.platform == 'win32':
30             environment.update({
31                     'INCLUDE' : os.environ.get('INCLUDE',''),
32                     'PATHEXT' : os.environ.get('PATHEXT',''),
33                     'PYTHONUNBUFFERED' : '1',
34                     'TEMP' : os.environ.get('TEMP',''),
35                     'TMP' : os.environ.get('TMP',''),
36                     })
37
38         # The option to preserve TEMP, TMP, and TMPDIR.
39         # This is intended to check how many temporary files would be generated
40         # (and be not cleaned up) in automated builders.
41         if 'LIT_PRESERVES_TMP' in os.environ:
42             environment.update({
43                     'TEMP' : os.environ.get('TEMP',''),
44                     'TMP' : os.environ.get('TMP',''),
45                     'TMPDIR' : os.environ.get('TMPDIR',''),
46                     })
47
48         # Set the default available features based on the LitConfig.
49         available_features = []
50         if litConfig.useValgrind:
51             available_features.append('valgrind')
52             if litConfig.valgrindLeakCheck:
53                 available_features.append('vg_leak')
54
55         return TestingConfig(None,
56                              name = '<unnamed>',
57                              suffixes = set(),
58                              test_format = None,
59                              environment = environment,
60                              substitutions = [],
61                              unsupported = False,
62                              test_exec_root = None,
63                              test_source_root = None,
64                              excludes = [],
65                              available_features = available_features,
66                              pipefail = True)
67
68     def load_from_path(self, path, litConfig):
69         """
70         load_from_path(path, litConfig)
71
72         Load the configuration module at the provided path into the given config
73         object.
74         """
75
76         # Load the config script data.
77         data = None
78         if not OldPy:
79             f = open(path)
80             try:
81                 data = f.read()
82             except:
83                 litConfig.fatal('unable to load config file: %r' % (path,))
84             f.close()
85
86         # Execute the config script to initialize the object.
87         cfg_globals = dict(globals())
88         cfg_globals['config'] = self
89         cfg_globals['lit_config'] = litConfig
90         cfg_globals['__file__'] = path
91         try:
92             if OldPy:
93                 execfile(path, cfg_globals)
94             else:
95                 exec(compile(data, path, 'exec'), cfg_globals, None)
96             if litConfig.debug:
97                 litConfig.note('... loaded config %r' % path)
98         except SystemExit:
99             e = sys.exc_info()[1]
100             # We allow normal system exit inside a config file to just
101             # return control without error.
102             if e.args:
103                 raise
104         except:
105             import traceback
106             litConfig.fatal(
107                 'unable to parse config file %r, traceback: %s' % (
108                     path, traceback.format_exc()))
109
110         self.finish(litConfig)
111
112     def __init__(self, parent, name, suffixes, test_format,
113                  environment, substitutions, unsupported,
114                  test_exec_root, test_source_root, excludes,
115                  available_features, pipefail):
116         self.parent = parent
117         self.name = str(name)
118         self.suffixes = set(suffixes)
119         self.test_format = test_format
120         self.environment = dict(environment)
121         self.substitutions = list(substitutions)
122         self.unsupported = unsupported
123         self.test_exec_root = test_exec_root
124         self.test_source_root = test_source_root
125         self.excludes = set(excludes)
126         self.available_features = set(available_features)
127         self.pipefail = pipefail
128
129     def finish(self, litConfig):
130         """finish() - Finish this config object, after loading is complete."""
131
132         self.name = str(self.name)
133         self.suffixes = set(self.suffixes)
134         self.environment = dict(self.environment)
135         self.substitutions = list(self.substitutions)
136         if self.test_exec_root is not None:
137             # FIXME: This should really only be suite in test suite config
138             # files. Should we distinguish them?
139             self.test_exec_root = str(self.test_exec_root)
140         if self.test_source_root is not None:
141             # FIXME: This should really only be suite in test suite config
142             # files. Should we distinguish them?
143             self.test_source_root = str(self.test_source_root)
144         self.excludes = set(self.excludes)
145
146     @property
147     def root(self):
148         """root attribute - The root configuration for the test suite."""
149         if self.parent is None:
150             return self
151         else:
152             return self.parent.root
153