From 401c24879c1dcd9e28df19b3ee2384b26df583ee Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Tue, 17 Aug 2004 22:59:44 +0000 Subject: Remove the misbegotten --save-explain-info feature. --- doc/man/scons.1 | 16 +- src/CHANGES.txt | 10 +- src/engine/SCons/Node/FS.py | 22 +- src/engine/SCons/Node/FSTests.py | 52 ----- src/engine/SCons/Node/NodeTests.py | 13 -- src/engine/SCons/Node/__init__.py | 28 +-- src/engine/SCons/Script/__init__.py | 8 +- test/chained-build.py | 46 +--- test/explain.py | 418 +----------------------------------- 9 files changed, 25 insertions(+), 588 deletions(-) diff --git a/doc/man/scons.1 b/doc/man/scons.1 index c4335a8..0c07aec 100644 --- a/doc/man/scons.1 +++ b/doc/man/scons.1 @@ -758,18 +758,6 @@ 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 .BR make . @@ -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: diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 9d21296..e8b3af1 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -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 diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index b10657c..7f0ca62 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -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: diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index aba3481..c213d26 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -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) diff --git a/src/engine/SCons/Node/NodeTests.py b/src/engine/SCons/Node/NodeTests.py index 72ddd74..138b00b 100644 --- a/src/engine/SCons/Node/NodeTests.py +++ b/src/engine/SCons/Node/NodeTests.py @@ -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 """ diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py index be5e21c..0638375 100644 --- a/src/engine/SCons/Node/__init__.py +++ b/src/engine/SCons/Node/__init__.py @@ -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)) diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py index 87e9602..51d3e66 100644 --- a/src/engine/SCons/Script/__init__.py +++ b/src/engine/SCons/Script/__init__.py @@ -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: diff --git a/test/chained-build.py b/test/chained-build.py index 23187bc..d2772e2 100644 --- a/test/chained-build.py +++ b/test/chained-build.py @@ -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() diff --git a/test/explain.py b/test/explain.py index d614065..ae4a33a 100644 --- a/test/explain.py +++ b/test/explain.py @@ -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') @@ -327,419 +324,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) -- cgit v0.12