Warnings.py
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #
  2. # Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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. """SCons.Warnings
  24. This file implements the warnings framework for SCons.
  25. """
  26. __revision__ = "src/engine/SCons/Warnings.py 3057 2008/06/09 22:21:00 knight"
  27. import string
  28. import sys
  29. import SCons.Errors
  30. class Warning(SCons.Errors.UserError):
  31.     pass
  32. # NOTE:  If you add a new warning class, add it to the man page, too!
  33. class CacheWriteErrorWarning(Warning):
  34.     pass
  35. class CorruptSConsignWarning(Warning):
  36.     pass
  37. class DependencyWarning(Warning):
  38.     pass
  39. class DeprecatedWarning(Warning):
  40.     pass
  41. class DeprecatedCopyWarning(DeprecatedWarning):
  42.     pass
  43. class DeprecatedSourceSignaturesWarning(DeprecatedWarning):
  44.     pass
  45. class DeprecatedTargetSignaturesWarning(DeprecatedWarning):
  46.     pass
  47. class DuplicateEnvironmentWarning(Warning):
  48.     pass
  49. class LinkWarning(Warning):
  50.     pass
  51. class MisleadingKeywordsWarning(Warning):
  52.     pass
  53. class MissingSConscriptWarning(Warning):
  54.     pass
  55. class NoMD5ModuleWarning(Warning):
  56.     pass
  57. class NoMetaclassSupportWarning(Warning):
  58.     pass
  59. class NoObjectCountWarning(Warning):
  60.     pass
  61. class NoParallelSupportWarning(Warning):
  62.     pass
  63. class PythonVersionWarning(DeprecatedWarning):
  64.     pass
  65. class ReservedVariableWarning(Warning):
  66.     pass
  67. class StackSizeWarning(Warning):
  68.     pass
  69. class FortranCxxMixWarning(LinkWarning):
  70.     pass
  71. _warningAsException = 0
  72. # The below is a list of 2-tuples.  The first element is a class object.
  73. # The second element is true if that class is enabled, false if it is disabled.
  74. _enabled = []
  75. _warningOut = None
  76. def suppressWarningClass(clazz):
  77.     """Suppresses all warnings that are of type clazz or
  78.     derived from clazz."""
  79.     _enabled.insert(0, (clazz, 0))
  80. def enableWarningClass(clazz):
  81.     """Suppresses all warnings that are of type clazz or
  82.     derived from clazz."""
  83.     _enabled.insert(0, (clazz, 1))
  84. def warningAsException(flag=1):
  85.     """Turn warnings into exceptions.  Returns the old value of the flag."""
  86.     global _warningAsException
  87.     old = _warningAsException
  88.     _warningAsException = flag
  89.     return old
  90. def warn(clazz, *args):
  91.     global _enabled, _warningAsException, _warningOut
  92.     warning = clazz(args)
  93.     for clazz, flag in _enabled:
  94.         if isinstance(warning, clazz):
  95.             if flag:
  96.                 if _warningAsException:
  97.                     raise warning
  98.                 if _warningOut:
  99.                     _warningOut(warning)
  100.             break
  101. def process_warn_strings(arguments):
  102.     """Process string specifications of enabling/disabling warnings,
  103.     as passed to the --warn option or the SetOption('warn') function.
  104.     
  105.     An argument to this option should be of the form <warning-class>
  106.     or no-<warning-class>.  The warning class is munged in order
  107.     to get an actual class name from the classes above, which we
  108.     need to pass to the {enable,disable}WarningClass() functions.
  109.     The supplied <warning-class> is split on hyphens, each element
  110.     is capitalized, then smushed back together.  Then the string
  111.     "Warning" is appended to get the class name.
  112.     For example, 'deprecated' will enable the DeprecatedWarning
  113.     class.  'no-dependency' will disable the .DependencyWarning
  114.     class.
  115.     As a special case, --warn=all and --warn=no-all will enable or
  116.     disable (respectively) the base Warning class of all warnings.
  117.     """
  118.     def _capitalize(s):
  119.         if s[:5] == "scons":
  120.             return "SCons" + s[5:]
  121.         else:
  122.             return string.capitalize(s)
  123.     for arg in arguments:
  124.         elems = string.split(string.lower(arg), '-')
  125.         enable = 1
  126.         if elems[0] == 'no':
  127.             enable = 0
  128.             del elems[0]
  129.         if len(elems) == 1 and elems[0] == 'all':
  130.             class_name = "Warning"
  131.         else:
  132.             class_name = string.join(map(_capitalize, elems), '') + "Warning"
  133.         try:
  134.             clazz = globals()[class_name]
  135.         except KeyError:
  136.             sys.stderr.write("No warning type: '%s'n" % arg)
  137.         else:
  138.             if enable:
  139.                 enableWarningClass(clazz)
  140.             else:
  141.                 suppressWarningClass(clazz)