Package SCons :: Module Warnings
[hide private]
[frames] | no frames]

Source Code for Module SCons.Warnings

  1  # 
  2  # Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation 
  3  # 
  4  # Permission is hereby granted, free of charge, to any person obtaining 
  5  # a copy of this software and associated documentation files (the 
  6  # "Software"), to deal in the Software without restriction, including 
  7  # without limitation the rights to use, copy, modify, merge, publish, 
  8  # distribute, sublicense, and/or sell copies of the Software, and to 
  9  # permit persons to whom the Software is furnished to do so, subject to 
 10  # the following conditions: 
 11  # 
 12  # The above copyright notice and this permission notice shall be included 
 13  # in all copies or substantial portions of the Software. 
 14  # 
 15  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY 
 16  # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
 17  # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 18  # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
 19  # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
 20  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
 21  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
 22  # 
 23   
 24  """SCons.Warnings 
 25   
 26  This file implements the warnings framework for SCons. 
 27   
 28  """ 
 29   
 30  __revision__ = "src/engine/SCons/Warnings.py 5023 2010/06/14 22:05:46 scons" 
 31   
 32  import sys 
 33   
 34  import SCons.Errors 
 35   
36 -class Warning(SCons.Errors.UserError):
37 pass
38
39 -class WarningOnByDefault(Warning):
40 pass
41 42 43 # NOTE: If you add a new warning class, add it to the man page, too! 44
45 -class CacheWriteErrorWarning(Warning):
46 pass
47
48 -class CorruptSConsignWarning(WarningOnByDefault):
49 pass
50
51 -class DependencyWarning(Warning):
52 pass
53
54 -class DuplicateEnvironmentWarning(WarningOnByDefault):
55 pass
56
57 -class FutureReservedVariableWarning(WarningOnByDefault):
58 pass
59
60 -class LinkWarning(WarningOnByDefault):
61 pass
62
63 -class MisleadingKeywordsWarning(WarningOnByDefault):
64 pass
65
66 -class MissingSConscriptWarning(WarningOnByDefault):
67 pass
68
69 -class NoMD5ModuleWarning(WarningOnByDefault):
70 pass
71
72 -class NoMetaclassSupportWarning(WarningOnByDefault):
73 pass
74
75 -class NoObjectCountWarning(WarningOnByDefault):
76 pass
77
78 -class NoParallelSupportWarning(WarningOnByDefault):
79 pass
80
81 -class ReservedVariableWarning(WarningOnByDefault):
82 pass
83
84 -class StackSizeWarning(WarningOnByDefault):
85 pass
86
87 -class VisualCMissingWarning(WarningOnByDefault):
88 pass
89 90 # Used when MSVC_VERSION and MSVS_VERSION do not point to the 91 # same version (MSVS_VERSION is deprecated)
92 -class VisualVersionMismatch(WarningOnByDefault):
93 pass
94
95 -class VisualStudioMissingWarning(Warning):
96 pass
97
98 -class FortranCxxMixWarning(LinkWarning):
99 pass
100 101 102 # Deprecation warnings 103
104 -class FutureDeprecatedWarning(Warning):
105 pass
106
107 -class DeprecatedWarning(Warning):
108 pass
109
110 -class MandatoryDeprecatedWarning(DeprecatedWarning):
111 pass
112 113 114 # Special case; base always stays DeprecatedWarning
115 -class PythonVersionWarning(DeprecatedWarning):
116 pass
117
118 -class DeprecatedSourceCodeWarning(FutureDeprecatedWarning):
119 pass
120
121 -class DeprecatedBuildDirWarning(DeprecatedWarning):
122 pass
123
124 -class TaskmasterNeedsExecuteWarning(DeprecatedWarning):
125 pass
126
127 -class DeprecatedCopyWarning(MandatoryDeprecatedWarning):
128 pass
129
130 -class DeprecatedOptionsWarning(MandatoryDeprecatedWarning):
131 pass
132
133 -class DeprecatedSourceSignaturesWarning(MandatoryDeprecatedWarning):
134 pass
135
136 -class DeprecatedTargetSignaturesWarning(MandatoryDeprecatedWarning):
137 pass
138
139 -class DeprecatedDebugOptionsWarning(MandatoryDeprecatedWarning):
140 pass
141
142 -class DeprecatedSigModuleWarning(MandatoryDeprecatedWarning):
143 pass
144
145 -class DeprecatedBuilderKeywordsWarning(MandatoryDeprecatedWarning):
146 pass
147 148 149 # The below is a list of 2-tuples. The first element is a class object. 150 # The second element is true if that class is enabled, false if it is disabled. 151 _enabled = [] 152 153 # If set, raise the warning as an exception 154 _warningAsException = 0 155 156 # If not None, a function to call with the warning 157 _warningOut = None 158
159 -def suppressWarningClass(clazz):
160 """Suppresses all warnings that are of type clazz or 161 derived from clazz.""" 162 _enabled.insert(0, (clazz, 0))
163
164 -def enableWarningClass(clazz):
165 """Enables all warnings that are of type clazz or 166 derived from clazz.""" 167 _enabled.insert(0, (clazz, 1))
168
169 -def warningAsException(flag=1):
170 """Turn warnings into exceptions. Returns the old value of the flag.""" 171 global _warningAsException 172 old = _warningAsException 173 _warningAsException = flag 174 return old
175
176 -def warn(clazz, *args):
177 global _enabled, _warningAsException, _warningOut 178 179 warning = clazz(args) 180 for clazz, flag in _enabled: 181 if isinstance(warning, clazz): 182 if flag: 183 if _warningAsException: 184 raise warning 185 186 if _warningOut: 187 _warningOut(warning) 188 break
189
190 -def process_warn_strings(arguments):
191 """Process string specifications of enabling/disabling warnings, 192 as passed to the --warn option or the SetOption('warn') function. 193 194 195 An argument to this option should be of the form <warning-class> 196 or no-<warning-class>. The warning class is munged in order 197 to get an actual class name from the classes above, which we 198 need to pass to the {enable,disable}WarningClass() functions. 199 The supplied <warning-class> is split on hyphens, each element 200 is capitalized, then smushed back together. Then the string 201 "Warning" is appended to get the class name. 202 203 For example, 'deprecated' will enable the DeprecatedWarning 204 class. 'no-dependency' will disable the DependencyWarning class. 205 206 As a special case, --warn=all and --warn=no-all will enable or 207 disable (respectively) the base Warning class of all warnings. 208 209 """ 210 211 def _capitalize(s): 212 if s[:5] == "scons": 213 return "SCons" + s[5:] 214 else: 215 return s.capitalize()
216 217 for arg in arguments: 218 219 elems = arg.lower().split('-') 220 enable = 1 221 if elems[0] == 'no': 222 enable = 0 223 del elems[0] 224 225 if len(elems) == 1 and elems[0] == 'all': 226 class_name = "Warning" 227 else: 228 class_name = ''.join(map(_capitalize, elems)) + "Warning" 229 try: 230 clazz = globals()[class_name] 231 except KeyError: 232 sys.stderr.write("No warning type: '%s'\n" % arg) 233 else: 234 if enable: 235 enableWarningClass(clazz) 236 elif issubclass(clazz, MandatoryDeprecatedWarning): 237 fmt = "Can not disable mandataory warning: '%s'\n" 238 sys.stderr.write(fmt % arg) 239 else: 240 suppressWarningClass(clazz) 241 242 # Local Variables: 243 # tab-width:4 244 # indent-tabs-mode:nil 245 # End: 246 # vim: set expandtab tabstop=4 shiftwidth=4: 247