Issue 2231: Add a --warn=future-deprecated option, along with
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 11 Dec 2008 05:37:35 +0000 (05:37 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Thu, 11 Dec 2008 05:37:35 +0000 (05:37 +0000)
FutureDeprecatedWarning and MandatoryDeprecatedWarning subclasses.
Use these to future-deprecate the Taskmaster.Task class, which we intend
to turn into an abstract base class by requiring subclasses to implement
the .needs_execute() method.

git-svn-id: http://scons.tigris.org/svn/scons/trunk@3827 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/CHANGES.txt
src/engine/SCons/Taskmaster.py
src/engine/SCons/Warnings.py
src/engine/SCons/WarningsTests.py
test/Deprecated/TaskmasterNeedsExecute.py [new file with mode: 0644]

index 123ca5cf5d786895f4656a4c134e2aa8e2765ece..300e14ce1af79524797ce41c6e1eb23174231273 100644 (file)
@@ -1352,8 +1352,16 @@ These warnings are disabled by default.
 
 .TP
 --warn=deprecated, --warn=no-deprecated
-Enables or disables all warnings about use of deprecated features.
+Enables or disables all warnings about use of
+currently deprecated features.
 These warnings are enabled by default.
+Note that the
+.b --warn=no-deprecated
+option does not disable warnings about absolutely all deprecated features.
+Warnings for some deprecated features that have already been through
+several releases with deprecation warnings
+may be mandatory for a release or two
+before they are officially no longer supported by SCons.
 Warnings for some specific deprecated features
 may be enabled or disabled individually;
 see below.
@@ -1395,6 +1403,18 @@ Enables or disables the specific warning about linking
 Fortran and C++ object files in a single executable,
 which can yield unpredictable behavior with some compilers.
 
+.TP
+--warn=future-deprecated, --warn=no-future-deprecated
+Enables or disables warnings about features
+that will be deprecated in the future.
+These warnings are disabled by default.
+Enabling this warning is especially
+recommended for projects that redistribute
+SCons configurations for other users to build,
+so that the project can be warned as soon as possible
+about to-be-deprecated features
+that may require changes to the configuration.
+
 .TP
 --warn=link, --warn=no-link
 Enables or disables warnings about link steps.
index 8fca66386ef33b5d359417821d8ddff8c367d857..75b040155565fd675d15a872b3ce12ce23199241 100644 (file)
@@ -15,6 +15,9 @@ RELEASE 1.X - XXX
     - Print the message, "scons: Build interrupted." on error output,
       not standard output.
 
+    - Add a --warn=future-deprecated option for advance warnings about
+      deprecated features that still have warnings hidden by default.
+
   From Matthew Wesley:
 
     - Copy file attributes so we identify, and can link a shared library
index f3604028a46bc336254f34d25808974abc38a739..934e28b8e52a1c5caa0b38e4047175f9c27dc2b4 100644 (file)
@@ -58,6 +58,7 @@ import traceback
 
 import SCons.Errors
 import SCons.Node
+import SCons.Warnings
 
 StateString = SCons.Node.StateString
 NODE_NO_STATE = SCons.Node.no_state
@@ -202,6 +203,9 @@ class Task:
         # Deprecation Cycle) so the desired behavior is explicitly
         # determined by which concrete subclass is used.
         #raise NotImplementedError
+        msg = ('Direct use of the Taskmaster.Task class will be deprecated\n'
+               + '\tin a future release.')
+        SCons.Warnings.warn(SCons.Warnings.TaskmasterNeedsExecuteWarning, msg)
         return True
 
     def execute(self):
index 03ab9ae5ca63931fd98b625f8173568aa8db053c..83e3ccbaf262f5d590b4429935e6ae49e3f45f0c 100644 (file)
@@ -37,6 +37,21 @@ import SCons.Errors
 class Warning(SCons.Errors.UserError):
     pass
 
+class MandatoryWarning(Warning):
+    pass
+
+
+
+class FutureDeprecatedWarning(Warning):
+    pass
+
+class DeprecatedWarning(Warning):
+    pass
+
+class MandatoryDeprecatedWarning(MandatoryWarning):
+    pass
+
+
 
 # NOTE:  If you add a new warning class, add it to the man page, too!
 
@@ -49,9 +64,6 @@ class CorruptSConsignWarning(Warning):
 class DependencyWarning(Warning):
     pass
 
-class DeprecatedWarning(Warning):
-    pass
-
 class DeprecatedCopyWarning(DeprecatedWarning):
     pass
 
@@ -97,6 +109,9 @@ class ReservedVariableWarning(Warning):
 class StackSizeWarning(Warning):
     pass
 
+class TaskmasterNeedsExecuteWarning(FutureDeprecatedWarning):
+    pass
+
 class FortranCxxMixWarning(LinkWarning):
     pass
 
@@ -186,5 +201,8 @@ def process_warn_strings(arguments):
         else:
             if enable:
                 enableWarningClass(clazz)
+            elif issubclass(clazz, MandatoryDeprecatedWarning):
+                fmt = "Can not disable mandataory warning: '%s'\n"
+                sys.stderr.write(fmt % arg)
             else:
                 suppressWarningClass(clazz)
index 09646993578721956b194fe76001827b6ce2cca0..228c82c5f768d139779196663399657471411a16 100644 (file)
@@ -94,6 +94,10 @@ class WarningsTestCase(unittest.TestCase):
                             "Foo")
         assert to.out is None, to.out
 
+        SCons.Warnings.warn(SCons.Warnings.MandatoryWarning,
+                            "Foo")
+        assert to.out is None, to.out
+
         SCons.Warnings.enableWarningClass(SCons.Warnings.Warning)
         SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning,
                             "Foo")
diff --git a/test/Deprecated/TaskmasterNeedsExecute.py b/test/Deprecated/TaskmasterNeedsExecute.py
new file mode 100644 (file)
index 0000000..6aedf59
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Verify the message about the deprecated Taskmaster.needs_task()
+method, and the ability to suppress it.
+"""
+
+import TestSCons
+
+test = TestSCons.TestSCons(match = TestSCons.match_re_dotall)
+
+test.write('SConstruct', """
+import SCons.Taskmaster
+tm = SCons.Taskmaster.Taskmaster()
+task = SCons.Taskmaster.Task(tm, [], True, None)
+task.needs_execute()
+""")
+
+expect = """
+scons: warning: Direct use of the Taskmaster.Task class will be deprecated
+\tin a future release.
+"""
+
+test.run(arguments = '.')
+
+test.run(arguments = '--warn=taskmaster-needs-execute .',
+         stderr = TestSCons.re_escape(expect) + TestSCons.file_expr)
+
+test.run(arguments = '--warn=no-taskmaster-needs-execute .')
+
+test.run(arguments = '--warn=future-deprecated .',
+         stderr = TestSCons.re_escape(expect) + TestSCons.file_expr)
+
+test.pass_test()