Remove the misbegotten --save-explain-info feature.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 17 Aug 2004 22:59:44 +0000 (22:59 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 17 Aug 2004 22:59:44 +0000 (22:59 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@1034 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/CHANGES.txt
src/engine/SCons/Node/FS.py
src/engine/SCons/Node/FSTests.py
src/engine/SCons/Node/NodeTests.py
src/engine/SCons/Node/__init__.py
src/engine/SCons/Script/__init__.py
test/chained-build.py
test/explain.py

index c4335a8323450b1cb41d672309d9a14f58595412..0c07aecc12f6951cf5d3a98afbfe33a3386d446c 100644 (file)
@@ -757,18 +757,6 @@ Also suppresses SCons status messages.
 Ignored for compatibility with GNU 
 .BR make .
 
-.TP
-.RI --save-explain-info= 0|1
-By default,
-scons will save additional information about the build
-that is used by the
-.B --debug=explain
-option.
-Setting
-.B --save-explain-info=0
-will tell scons to speed up the build
-by not saving this information.
-
 .TP
 -t, --touch
 Ignored for compatibility with GNU
@@ -3578,9 +3566,7 @@ which corresponds to --implicit-cache;
 .B max_drift
 which corresponds to --max-drift;
 .B num_jobs
-which corresponds to -j and --jobs;
-.B save_explain_info
-which corresponds to --save-explain-info.
+which corresponds to -j and --jobs.
 See the documentation for the
 corresponding command line object for information about each specific
 option. Example:
index 9d21296ae38db6fd0044cb115b3f5f8cf8902fe2..e8b3af1674c0b5fdc4920cf14f7a99e356c0d50b 100644 (file)
@@ -8,7 +8,10 @@ r __COPYRIGHT__
 
 
 
-RELEASE 0.96 - XXX
+RELEASE 0.95 - XXX
+
+  NOTE:  This is a pre-release of 0.96 for testing purposes.  When 0.96
+  is released, all these changes will be listed as 0.96 changes.
 
   From Chad Austin:
 
@@ -97,11 +100,6 @@ RELEASE 0.96 - XXX
   - Add a --debug=explain option that reports the reason(s) why SCons
     thinks it must rebuild something.
 
-  - Add --save-explain-info and SetOption('save_explain_info') options
-    to control whether the --debug=explain information is saved in
-    the .sconsign file(s).  Not saving this information can improve
-    performance and save memory usage.
-
   - Add support for functions that return platform-independent Actions
     to Chmod(), Copy(), Delete(), Mkdir(), Move() and Touch() files
     and/or directories.  Like any other Actions, the returned Action
index b10657c72384e79a36cbff7b728b6453c97201c8..7f0ca6292ca77285683ba9fb8911967843f9fe0d 100644 (file)
@@ -1447,29 +1447,9 @@ class File(Base):
         # in one build (SConstruct file) is a source in a different build.
         # See test/chained-build.py for the use case.
         entry = self.get_stored_info()
-        if not SCons.Node.Save_Explain_Info and not SCons.Node.implicit_cache:
-            # If we're not saving explanation info, wipe out any that
-            # might be in the already-stored entry.
-            #
-            # XXX This is kind of bad that we're naming attributes that
-            # are really controlled in Node/__init__.py.  It would be
-            # good to find a way to move this logic there in some way
-            # that still accounts for the fact that not all Node classes
-            # need or use this information.
-            attributes = [
-                'bsources',     'bsourcesigs',
-                'bdepends',     'bdependsigs',
-                'bimplicit',    'bimplicitsigs',
-                'bact',         'bactsig',
-            ]
-            for attr in attributes:
-                try:
-                     delattr(entry, attr)
-                except AttributeError:
-                    pass
         for key, val in obj.__dict__.items():
             entry.__dict__[key] = val
-        sconsign = self.dir.sconsign().set_entry(self.name, entry)
+        self.dir.sconsign().set_entry(self.name, entry)
 
     def get_stored_info(self):
         try:
index aba34811f0a375ddb8e57501053e3b6f3c5da9a8..c213d265b93a6ada7126044fedad63bc1fc81318 100644 (file)
@@ -1973,57 +1973,6 @@ class SaveStringsTestCase(unittest.TestCase):
         expect = map(os.path.normpath, ['src/f', 'd1/f', 'd0/b', 'd1/b'])
         assert s == expect, s
 
-class SaveExplainInfoTestCase(unittest.TestCase):
-    def runTest(self):
-        """Test how we store --debug=explain info."""
-        test=TestCmd(workdir='')
-        fs = SCons.Node.FS.FS(test.workpath('fs'))
-        f = fs.File('file')
-
-        class BInfo:
-            pass
-
-        bi = BInfo()
-        bi.bact = 'file bact'
-        bi.arg1 = 'file arg1'
-        f.store_info(bi)
-
-        i = f.get_stored_info()
-        assert i.bact == 'file bact', i.arg1
-        assert i.arg1 == 'file arg1', i.arg1
-        assert not hasattr(i, 'arg2'), i.bact
-        assert not hasattr(i, 'arg3'), i.bact
-
-        save_value = SCons.Node.Save_Explain_Info
-        try:
-            SCons.Node.Save_Explain_Info = 1
-
-            bi = BInfo()
-            bi.arg2 = 'file arg2'
-            f.store_info(bi)
-
-            i = f.get_stored_info()
-            assert i.bact == 'file bact', i.arg1
-            assert i.arg1 == 'file arg1', i.arg1
-            assert i.arg2 == 'file arg2', i.arg2
-            assert not hasattr(i, 'arg3'), i.bact
-
-            SCons.Node.Save_Explain_Info = 0
-
-            bi = BInfo()
-            bi.arg3 = 'file arg3'
-            f.store_info(bi)
-
-            i = f.get_stored_info()
-            assert not hasattr(i, 'bact'), i.bact
-            assert i.arg1 == 'file arg1', i.arg1
-            assert i.arg2 == 'file arg2', i.arg2
-            assert i.arg3 == 'file arg3', i.arg2
-        finally:
-            SCons.Node.Save_Explain_Info = save_value
-
-
-
 if __name__ == "__main__":
     suite = unittest.TestSuite()
     suite.addTest(FSTestCase())
@@ -2042,6 +1991,5 @@ if __name__ == "__main__":
     suite.addTest(postprocessTestCase())
     suite.addTest(SpecialAttrTestCase())
     suite.addTest(SaveStringsTestCase())
-    suite.addTest(SaveExplainInfoTestCase())
     if not unittest.TextTestRunner().run(suite).wasSuccessful():
         sys.exit(1)
index 72ddd74f390f9f7a77d91ef4bc83af1b58ef723c..138b00bc240934242793a43ba2ee6e8643eceed3 100644 (file)
@@ -416,19 +416,6 @@ class NodeTestCase(unittest.TestCase):
         assert hasattr(binfo, 'bimplicitsigs')
         assert binfo.bsig == 666, binfo.bsig
 
-        SCons.Node.Save_Explain_Info = 0
-
-        node = SCons.Node.Node()
-        binfo = node.gen_binfo(Calculator(777))
-        assert isinstance(binfo, SCons.Node.BuildInfo), binfo
-        assert not hasattr(binfo, 'bsources')
-        assert not hasattr(binfo, 'bsourcesigs')
-        assert not hasattr(binfo, 'bdepends')
-        assert not hasattr(binfo, 'bdependsigs')
-        assert not hasattr(binfo, 'bimplicit')
-        assert not hasattr(binfo, 'bimplicitsigs')
-        assert binfo.bsig == 777, binfo.bsig
-
     def test_explain(self):
         """Test explaining why a Node must be rebuilt
         """
index be5e21c87fbe7c5b1980ab2386427788be07d3d4..063837539061c51c760e8db1d17017437fea4ac6 100644 (file)
@@ -76,9 +76,6 @@ implicit_deps_unchanged = 0
 # controls whether the cached implicit deps are ignored:
 implicit_deps_changed = 0
 
-# controls whether --debug=explain info is saved in Nodes:
-Save_Explain_Info = 1
-
 # A variable that can be set to an interface-specific function be called
 # to annotate a Node with information about its creation.
 def do_nothing(node): pass
@@ -546,24 +543,19 @@ class Node:
 
         sigs = sourcesigs + dependsigs + implicitsigs
 
-        has_builder = self.has_builder()
-        if has_builder:
+        if self.has_builder():
             executor = self.get_executor()
-            bactsig = calc.module.signature(executor)
-            sigs.append(bactsig)
-
-        if Save_Explain_Info or implicit_cache:
-            binfo.bsources = map(str, sources)
-            binfo.bdepends = map(str, depends)
-            binfo.bimplicit = map(str, implicit)
+            binfo.bact = executor.get_contents()
+            binfo.bactsig = calc.module.signature(executor)
+            sigs.append(binfo.bactsig)
 
-            binfo.bsourcesigs = sourcesigs
-            binfo.bdependsigs = dependsigs
-            binfo.bimplicitsigs = implicitsigs
+        binfo.bsources = map(str, sources)
+        binfo.bdepends = map(str, depends)
+        binfo.bimplicit = map(str, implicit)
 
-            if has_builder:
-                binfo.bact = executor.get_contents()
-                binfo.bactsig = bactsig
+        binfo.bsourcesigs = sourcesigs
+        binfo.bdependsigs = dependsigs
+        binfo.bimplicitsigs = implicitsigs
 
         binfo.bsig = calc.module.collect(filter(None, sigs))
 
index 87e96029b7b71e866a6109d4bc201f6efa8a9660..51d3e66fa15bcd74bb999f1fe441a029aa8c4b90 100644 (file)
@@ -620,10 +620,6 @@ class OptParser(OptionParser):
         self.add_option('-s', '--silent', '--quiet', action="store_true",
                         default=0, help="Don't print commands.")
 
-        self.add_option('--save-explain-info', type="int", action="store",
-                        dest='save_explain_info', metavar='0|1',
-                        help="(Don't) save --debug=explain information")
-
         self.add_option('-u', '--up', '--search-up', action="store_const",
                         dest="climb_up", default=0, const=1,
                         help="Search up directory tree for SConstruct,       "
@@ -731,8 +727,7 @@ class SConscriptSettableOptions:
                          'max_drift':SCons.Sig.default_max_drift,
                          'implicit_cache':0,
                          'clean':0,
-                         'duplicate':'hard-soft-copy',
-                         'save_explain_info':1}
+                         'duplicate':'hard-soft-copy'}
 
     def get(self, name):
         if not self.settable.has_key(name):
@@ -945,7 +940,6 @@ def _main(args, parser):
     # that are SConscript settable:
     SCons.Node.implicit_cache = ssoptions.get('implicit_cache')
     SCons.Node.FS.set_duplicate(ssoptions.get('duplicate'))
-    SCons.Node.Save_Explain_Info = ssoptions.get('save_explain_info') or print_explanations
 
     lookup_top = None
     if targets:
index 23187bc897fd8cb42cd728d66b8c45793630486c..d2772e27c45bf22f86b8738bcdd6a8f8e3428fa3 100644 (file)
@@ -28,7 +28,13 @@ import TestSCons
 
 test = TestSCons.TestSCons()
 
-test.subdir('w1', 'w2')
+# During the development of 0.96, there was a --save-explain-info
+# option for a brief moment that would surpress storing extra
+# info in the .sconsign file(s).  At that time, this test used two
+# working subdirectories to test both with and without the saved info.
+# We eliminated the --save-explain-info option and the second working
+# subdirectory here, but didn't go back and change all the filenames.
+test.subdir('w1')
 
 SConstruct1_contents = """\
 def build(env, target, source):
@@ -46,7 +52,6 @@ env=Environment(BUILDERS={'B' : Builder(action=build)})
 env.B('foo.out', 'foo.mid')
 """
 
-# Test with the default of saving explanation info.
 test.write(['w1', 'SConstruct1'], SConstruct1_contents)
 test.write(['w1', 'SConstruct2'], SConstruct2_contents)
 test.write(['w1', 'foo.in'], "foo.in 1")
@@ -82,41 +87,4 @@ test.up_to_date(chdir='w1',
                 options="--max-drift=0 -f SConstruct2",
                 arguments="foo.out")
 
-# Now test when we're not saving explanation info.
-preamble = "SetOption('save_explain_info', 0)\n"
-test.write(['w2', 'SConstruct1'], preamble + SConstruct1_contents)
-test.write(['w2', 'SConstruct2'], preamble + SConstruct2_contents)
-test.write(['w2', 'foo.in'], "foo.in 1")
-
-test.run(chdir='w2',
-         arguments="--max-drift=0 -f SConstruct1 foo.mid",
-         stdout = test.wrap_stdout('build(["foo.mid"], ["foo.in"])\n'))
-test.run(chdir='w2',
-         arguments="--max-drift=0 -f SConstruct2 foo.out",
-         stdout = test.wrap_stdout('build(["foo.out"], ["foo.mid"])\n'))
-
-test.up_to_date(chdir='w2',
-                options="--max-drift=0 -f SConstruct1",
-                arguments="foo.mid")
-test.up_to_date(chdir='w2',
-                options="--max-drift=0 -f SConstruct2",
-                arguments="foo.out")
-
-test.sleep()  # make sure foo.in rewrite has new mod-time
-test.write(['w2', 'foo.in'], "foo.in 2")
-
-test.run(chdir='w2',
-         arguments="--max-drift=0 -f SConstruct1 foo.mid",
-         stdout = test.wrap_stdout('build(["foo.mid"], ["foo.in"])\n'))
-test.run(chdir='w2',
-         arguments="--max-drift=0 -f SConstruct2 foo.out",
-         stdout = test.wrap_stdout('build(["foo.out"], ["foo.mid"])\n'))
-
-test.up_to_date(chdir='w2',
-                options="--max-drift=0 -f SConstruct1",
-                arguments="foo.mid")
-test.up_to_date(chdir='w2',
-                options="--max-drift=0 -f SConstruct2",
-                arguments="foo.out")
-
 test.pass_test()
index d614065c137aa768fa8718b8e3245fec4f24b243..ae4a33a095179bb643824a2342a07a71f68fd14d 100644 (file)
@@ -38,10 +38,7 @@ python = TestSCons.python
 test = TestSCons.TestSCons()
 
 test.subdir('work1', ['work1', 'src'], ['work1', 'src', 'subdir'],
-            'work2', ['work2', 'src'], ['work2', 'src', 'subdir'],
-            'work3', ['work3', 'src'], ['work3', 'src', 'subdir'],
-            'work4', ['work4', 'src'], ['work4', 'src', 'subdir'],
-            'work5', ['work5', 'src'], ['work5', 'src', 'subdir'])
+            'work4', ['work4', 'src'], ['work4', 'src', 'subdir'])
 
 subdir_file6 = os.path.join('subdir', 'file6')
 subdir_file6_in = os.path.join('subdir', 'file6.in')
@@ -326,419 +323,6 @@ test.run(chdir='work1/src', arguments=args)
 
 test.up_to_date(chdir='work1/src',arguments='.')
 
-#############################################################################
-# Now test (in a separate workspace) how things function when
-# we tell SCons to not save the --debug=explain info
-# using SetOption('save_explain_info').
-test.write(['work2', 'src', 'SConstruct'],
-           "SetOption('save_explain_info', 0)\n" + SConstruct_contents)
-
-test.write(['work2', 'src', 'SConscript'], """\
-Import("env")
-env.Cat('file1', 'file1.in')
-env.Cat('file2', 'file2.k')
-env.Cat('file3', ['xxx', 'yyy', 'zzz'])
-env.Command('file4', 'file4.in', r"%s %s $TARGET - $SOURCES")
-env.Cat('file5', 'file5.k')
-env.Cat('subdir/file6', 'subdir/file6.in')
-""" % (python, cat_py))
-
-test.write(['work2', 'src', 'aaa'], "aaa 1\n")
-test.write(['work2', 'src', 'bbb.k'], """\
-bbb.k 1
-include ccc
-include ../inc/ddd
-include ../inc/eee
-""")
-test.write(['work2', 'src', 'ccc'], "ccc 1\n")
-test.write(['work2', 'src', 'ddd'], "ddd 1\n")
-test.write(['work2', 'src', 'eee.in'], "eee.in 1\n")
-
-test.write(['work2', 'src', 'file1.in'], "file1.in 1\n")
-
-test.write(['work2', 'src', 'file2.k'], """\
-file2.k 1 line 1
-include xxx
-include yyy
-file2.k 1 line 4
-""")
-
-test.write(['work2', 'src', 'file4.in'], "file4.in 1\n")
-
-test.write(['work2', 'src', 'xxx'], "xxx 1\n")
-test.write(['work2', 'src', 'yyy'], "yyy 1\n")
-test.write(['work2', 'src', 'zzz'], "zzz 1\n")
-
-test.write(['work2', 'src', 'file5.k'], """\
-file5.k 1 line 1
-include ../inc/aaa
-include ../inc/bbb.k
-file5.k 1 line 4
-""")
-
-test.write(['work2', 'src', 'subdir', 'file6.in'], "subdir/file6.in 1\n")
-
-# First, even without build info, we can tell the user that things
-# are being built because they don't exist.
-test.run(chdir='work2/src', arguments=args, stdout=test.wrap_stdout("""\
-scons: building `file1' because it doesn't exist
-%s %s file1 file1.in
-scons: building `file2' because it doesn't exist
-%s %s file2 file2.k
-scons: building `file3' because it doesn't exist
-%s %s file3 xxx yyy zzz
-scons: building `file4' because it doesn't exist
-%s %s file4 - file4.in
-scons: building `%s' because it doesn't exist
-Install file: "aaa" as "%s"
-scons: building `%s' because it doesn't exist
-Install file: "ddd" as "%s"
-scons: building `%s' because it doesn't exist
-Install file: "eee.in" as "%s"
-scons: building `%s' because it doesn't exist
-Install file: "bbb.k" as "%s"
-scons: building `file5' because it doesn't exist
-%s %s file5 file5.k
-scons: building `%s' because it doesn't exist
-%s %s %s %s
-""" % (python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       test.workpath('work2', 'inc', 'aaa'),
-       test.workpath('work2', 'inc', 'aaa'),
-       test.workpath('work2', 'inc', 'ddd'),
-       test.workpath('work2', 'inc', 'ddd'),
-       test.workpath('work2', 'inc', 'eee'),
-       test.workpath('work2', 'inc', 'eee'),
-       test.workpath('work2', 'inc', 'bbb.k'),
-       test.workpath('work2', 'inc', 'bbb.k'),
-       python, cat_py,
-       subdir_file6,
-       python, cat_py, subdir_file6, subdir_file6_in)))
-
-test.must_match(['work2', 'src', 'file1'], "file1.in 1\n")
-test.must_match(['work2', 'src', 'file2'], """\
-file2.k 1 line 1
-xxx 1
-yyy 1
-file2.k 1 line 4
-""")
-test.must_match(['work2', 'src', 'file3'], "xxx 1\nyyy 1\nzzz 1\n")
-test.must_match(['work2', 'src', 'file4'], "file4.in 1\n")
-test.must_match(['work2', 'src', 'file5'], """\
-file5.k 1 line 1
-aaa 1
-bbb.k 1
-ccc 1
-ddd 1
-eee.in 1
-file5.k 1 line 4
-""")
-
-# Using --debug=explain above will have actually saved the build info;
-# run again to clear it out.
-test.write(['work2', 'src', 'file1.in'], "file1.in 2\n")
-test.write(['work2', 'src', 'yyy'], "yyy 2\n")
-test.write(['work2', 'src', 'zzz'], "zzz 2\n")
-test.write(['work2', 'src', 'bbb.k'], "bbb.k 2\ninclude ccc\n")
-
-test.run(chdir='work2/src', arguments='.')
-
-# Now, it should tell us that it can't explain why the files are
-# being rebuilt.  It should also *store* the build info because
-# we're using --debug=explain...
-test.write(['work2', 'src', 'file1.in'], "file1.in 3\n")
-test.write(['work2', 'src', 'yyy'], "yyy 3\n")
-test.write(['work2', 'src', 'zzz'], "zzz 3\n")
-test.write(['work2', 'src', 'bbb.k'], "bbb.k 3\ninclude ccc\n")
-
-test.run(chdir='work2/src', arguments=args, stdout=test.wrap_stdout("""\
-scons: Cannot explain why `file1' is being rebuilt: No previous build information found
-%s %s file1 file1.in
-scons: Cannot explain why `file2' is being rebuilt: No previous build information found
-%s %s file2 file2.k
-scons: Cannot explain why `file3' is being rebuilt: No previous build information found
-%s %s file3 xxx yyy zzz
-scons: Cannot explain why `%s' is being rebuilt: No previous build information found
-Install file: "bbb.k" as "%s"
-scons: Cannot explain why `file5' is being rebuilt: No previous build information found
-%s %s file5 file5.k
-""" % (python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       test.workpath('work2', 'inc', 'bbb.k'),
-       test.workpath('work2', 'inc', 'bbb.k'),
-       python, cat_py)))
-
-test.must_match(['work2', 'src', 'file1'], "file1.in 3\n")
-test.must_match(['work2', 'src', 'file2'], """\
-file2.k 1 line 1
-xxx 1
-yyy 3
-file2.k 1 line 4
-""")
-test.must_match(['work2', 'src', 'file3'], "xxx 1\nyyy 3\nzzz 3\n")
-test.must_match(['work2', 'src', 'file5'], """\
-file5.k 1 line 1
-aaa 1
-bbb.k 3
-ccc 1
-file5.k 1 line 4
-""")
-
-# ...so if we now update the files again, it should be able to tell
-# us why the files changed.
-test.write(['work2', 'src', 'file1.in'], "file1.in 4\n")
-test.write(['work2', 'src', 'yyy'], "yyy 4\n")
-test.write(['work2', 'src', 'zzz'], "zzz 4\n")
-test.write(['work2', 'src', 'bbb.k'], "bbb.k 4\ninclude ccc\n")
-
-test.run(chdir='work2/src', arguments=args, stdout=test.wrap_stdout("""\
-scons: rebuilding `file1' because `file1.in' changed
-%s %s file1 file1.in
-scons: rebuilding `file2' because `yyy' changed
-%s %s file2 file2.k
-scons: rebuilding `file3' because:
-           `yyy' changed
-           `zzz' changed
-%s %s file3 xxx yyy zzz
-scons: rebuilding `%s' because `bbb.k' changed
-Install file: "bbb.k" as "%s"
-scons: rebuilding `file5' because `%s' changed
-%s %s file5 file5.k
-""" % (python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       test.workpath('work2', 'inc', 'bbb.k'),
-       test.workpath('work2', 'inc', 'bbb.k'),
-       test.workpath('work2', 'inc', 'bbb.k'),
-       python, cat_py)))
-
-test.must_match(['work2', 'src', 'file1'], "file1.in 4\n")
-test.must_match(['work2', 'src', 'file2'], """\
-file2.k 1 line 1
-xxx 1
-yyy 4
-file2.k 1 line 4
-""")
-test.must_match(['work2', 'src', 'file3'], "xxx 1\nyyy 4\nzzz 4\n")
-test.must_match(['work2', 'src', 'file5'], """\
-file5.k 1 line 1
-aaa 1
-bbb.k 4
-ccc 1
-file5.k 1 line 4
-""")
-
-#############################################################################
-# Now test (in a separate workspace) how things function when
-# we tell SCons to not save the --debug=explain info
-# using --save-explain-info=0'.
-test.write(['work3', 'src', 'SConstruct'], SConstruct_contents)
-
-test.write(['work3', 'src', 'SConscript'], """\
-Import("env")
-env.Cat('file1', 'file1.in')
-env.Cat('file2', 'file2.k')
-env.Cat('file3', ['xxx', 'yyy', 'zzz'])
-env.Command('file4', 'file4.in', r"%s %s $TARGET - $SOURCES")
-env.Cat('file5', 'file5.k')
-env.Cat('subdir/file6', 'subdir/file6.in')
-""" % (python, cat_py))
-
-test.write(['work3', 'src', 'aaa'], "aaa 1\n")
-test.write(['work3', 'src', 'bbb.k'], """\
-bbb.k 1
-include ccc
-include ../inc/ddd
-include ../inc/eee
-""")
-test.write(['work3', 'src', 'ccc'], "ccc 1\n")
-test.write(['work3', 'src', 'ddd'], "ddd 1\n")
-test.write(['work3', 'src', 'eee.in'], "eee.in 1\n")
-
-test.write(['work3', 'src', 'file1.in'], "file1.in 1\n")
-
-test.write(['work3', 'src', 'file2.k'], """\
-file2.k 1 line 1
-include xxx
-include yyy
-file2.k 1 line 4
-""")
-
-test.write(['work3', 'src', 'file4.in'], "file4.in 1\n")
-
-test.write(['work3', 'src', 'xxx'], "xxx 1\n")
-test.write(['work3', 'src', 'yyy'], "yyy 1\n")
-test.write(['work3', 'src', 'zzz'], "zzz 1\n")
-
-test.write(['work3', 'src', 'file5.k'], """\
-file5.k 1 line 1
-include ../inc/aaa
-include ../inc/bbb.k
-file5.k 1 line 4
-""")
-
-test.write(['work3', 'src', 'subdir', 'file6.in'], "subdir/file6.in 1\n")
-
-# First, even without build info and regardless of storage option,
-# we can tell the user that things are being built because they don't exist.
-test.run(chdir='work3/src',
-         arguments='--debug=explain --save-explain-info=0 .',
-         stdout=test.wrap_stdout("""\
-scons: building `file1' because it doesn't exist
-%s %s file1 file1.in
-scons: building `file2' because it doesn't exist
-%s %s file2 file2.k
-scons: building `file3' because it doesn't exist
-%s %s file3 xxx yyy zzz
-scons: building `file4' because it doesn't exist
-%s %s file4 - file4.in
-scons: building `%s' because it doesn't exist
-Install file: "aaa" as "%s"
-scons: building `%s' because it doesn't exist
-Install file: "ddd" as "%s"
-scons: building `%s' because it doesn't exist
-Install file: "eee.in" as "%s"
-scons: building `%s' because it doesn't exist
-Install file: "bbb.k" as "%s"
-scons: building `file5' because it doesn't exist
-%s %s file5 file5.k
-scons: building `%s' because it doesn't exist
-%s %s %s %s
-""" % (python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       test.workpath('work3', 'inc', 'aaa'),
-       test.workpath('work3', 'inc', 'aaa'),
-       test.workpath('work3', 'inc', 'ddd'),
-       test.workpath('work3', 'inc', 'ddd'),
-       test.workpath('work3', 'inc', 'eee'),
-       test.workpath('work3', 'inc', 'eee'),
-       test.workpath('work3', 'inc', 'bbb.k'),
-       test.workpath('work3', 'inc', 'bbb.k'),
-       python, cat_py,
-       subdir_file6,
-       python, cat_py, subdir_file6, subdir_file6_in)))
-
-test.must_match(['work3', 'src', 'file1'], "file1.in 1\n")
-test.must_match(['work3', 'src', 'file2'], """\
-file2.k 1 line 1
-xxx 1
-yyy 1
-file2.k 1 line 4
-""")
-test.must_match(['work3', 'src', 'file3'], "xxx 1\nyyy 1\nzzz 1\n")
-test.must_match(['work3', 'src', 'file4'], "file4.in 1\n")
-test.must_match(['work3', 'src', 'file5'], """\
-file5.k 1 line 1
-aaa 1
-bbb.k 1
-ccc 1
-ddd 1
-eee.in 1
-file5.k 1 line 4
-""")
-
-# Using --debug=explain above will have actually saved the build info;
-# run again to clear it out.
-test.write(['work3', 'src', 'file1.in'], "file1.in 2\n")
-test.write(['work3', 'src', 'yyy'], "yyy 2\n")
-test.write(['work3', 'src', 'zzz'], "zzz 2\n")
-test.write(['work3', 'src', 'bbb.k'], "bbb.k 2\ninclude ccc\n")
-
-test.run(chdir='work3/src', arguments='--save-explain-info=0 .')
-
-# Now, it should tell us that it can't explain why the files are
-# being rebuilt.  It should also *store* the build info because
-# we're using --debug=explain...
-test.write(['work3', 'src', 'file1.in'], "file1.in 3\n")
-test.write(['work3', 'src', 'yyy'], "yyy 3\n")
-test.write(['work3', 'src', 'zzz'], "zzz 3\n")
-test.write(['work3', 'src', 'bbb.k'], "bbb.k 3\ninclude ccc\n")
-
-test.run(chdir='work3/src',
-         arguments='--debug=explain .',
-         stdout=test.wrap_stdout("""\
-scons: Cannot explain why `file1' is being rebuilt: No previous build information found
-%s %s file1 file1.in
-scons: Cannot explain why `file2' is being rebuilt: No previous build information found
-%s %s file2 file2.k
-scons: Cannot explain why `file3' is being rebuilt: No previous build information found
-%s %s file3 xxx yyy zzz
-scons: Cannot explain why `%s' is being rebuilt: No previous build information found
-Install file: "bbb.k" as "%s"
-scons: Cannot explain why `file5' is being rebuilt: No previous build information found
-%s %s file5 file5.k
-""" % (python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       test.workpath('work3', 'inc', 'bbb.k'),
-       test.workpath('work3', 'inc', 'bbb.k'),
-       python, cat_py)))
-
-test.must_match(['work3', 'src', 'file1'], "file1.in 3\n")
-test.must_match(['work3', 'src', 'file2'], """\
-file2.k 1 line 1
-xxx 1
-yyy 3
-file2.k 1 line 4
-""")
-test.must_match(['work3', 'src', 'file3'], "xxx 1\nyyy 3\nzzz 3\n")
-test.must_match(['work3', 'src', 'file5'], """\
-file5.k 1 line 1
-aaa 1
-bbb.k 3
-ccc 1
-file5.k 1 line 4
-""")
-
-# ...so if we now update the files again, it should be able to tell
-# us why the files changed.
-test.write(['work3', 'src', 'file1.in'], "file1.in 4\n")
-test.write(['work3', 'src', 'yyy'], "yyy 4\n")
-test.write(['work3', 'src', 'zzz'], "zzz 4\n")
-test.write(['work3', 'src', 'bbb.k'], "bbb.k 4\ninclude ccc\n")
-
-test.run(chdir='work3/src', arguments=args, stdout=test.wrap_stdout("""\
-scons: rebuilding `file1' because `file1.in' changed
-%s %s file1 file1.in
-scons: rebuilding `file2' because `yyy' changed
-%s %s file2 file2.k
-scons: rebuilding `file3' because:
-           `yyy' changed
-           `zzz' changed
-%s %s file3 xxx yyy zzz
-scons: rebuilding `%s' because `bbb.k' changed
-Install file: "bbb.k" as "%s"
-scons: rebuilding `file5' because `%s' changed
-%s %s file5 file5.k
-""" % (python, cat_py,
-       python, cat_py,
-       python, cat_py,
-       test.workpath('work3', 'inc', 'bbb.k'),
-       test.workpath('work3', 'inc', 'bbb.k'),
-       test.workpath('work3', 'inc', 'bbb.k'),
-       python, cat_py)))
-
-test.must_match(['work3', 'src', 'file1'], "file1.in 4\n")
-test.must_match(['work3', 'src', 'file2'], """\
-file2.k 1 line 1
-xxx 1
-yyy 4
-file2.k 1 line 4
-""")
-test.must_match(['work3', 'src', 'file3'], "xxx 1\nyyy 4\nzzz 4\n")
-test.must_match(['work3', 'src', 'file5'], """\
-file5.k 1 line 1
-aaa 1
-bbb.k 4
-ccc 1
-file5.k 1 line 4
-""")
-
 #############################################################################
 # Test that the --debug=explain information gets saved by default.
 test.write(['work4', 'src', 'SConstruct'], SConstruct_contents)