From a1077396d73b5378c2a4a2ba249f3081cfc6da7f Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Sun, 25 Sep 2005 19:08:15 +0000 Subject: Fix a bug in the signature refactoring that caused some generated .h files to always get rebuilt. --- src/CHANGES.txt | 6 ++ src/engine/SCons/Node/FS.py | 7 +-- src/engine/SCons/Node/FSTests.py | 25 ++++++-- test/QT/up-to-date.py | 130 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 test/QT/up-to-date.py diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 049ab95..7922bcc 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -331,6 +331,12 @@ RELEASE 0.97 - XXX somewhat more efficient in general, and may be significantly more efficient on Windows. + - Minor speedups in the internal is_Dict(), is_List() and is_String() + functions. + + - Fix a signature refactoring bug that caused Qt header files to + get re-generated every time. + From Chen Lee: - Handle Visual Studio project and solution files in Unicode. diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py index 1257585..ffdc1eb 100644 --- a/src/engine/SCons/Node/FS.py +++ b/src/engine/SCons/Node/FS.py @@ -1565,12 +1565,9 @@ class RootDir(Dir): return _null class NodeInfo(SCons.Node.NodeInfo): - # The bsig attributes needs to stay here, if it's initialized in - # __init__() then the assignment seems to overwrite any values - # unpickled from .sconsign files. - bsig = None def __cmp__(self, other): - return cmp(self.bsig, other.bsig) + try: return cmp(self.bsig, other.bsig) + except AttributeError: return 1 def update(self, node): self.timestamp = node.get_timestamp() self.size = node.getsize() diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py index 0bd8001..60b0197 100644 --- a/src/engine/SCons/Node/FSTests.py +++ b/src/engine/SCons/Node/FSTests.py @@ -702,20 +702,33 @@ class NodeInfoTestCase(_tempdirTestCase): def test___init__(self): """Test NodeInfo initialization""" ni = SCons.Node.FS.NodeInfo() - assert hasattr(ni, 'bsig') + assert not hasattr(ni, 'bsig') def test___cmp__(self): """Test comparing NodeInfo objects""" ni1 = SCons.Node.FS.NodeInfo() ni2 = SCons.Node.FS.NodeInfo() - assert cmp(ni1, ni2) == 0, "ni1 %s != ni2 %s" % (ni1, ni2) + msg = "cmp(%s, %s) returned %s, not %s" + + c = cmp(ni1, ni2) + assert c == 1, msg % (ni1, ni2, c, 1) ni1.bsig = 777 - assert cmp(ni1, ni2) != 0, "ni1 %s == ni2 %s" % (ni1, ni2) + c = cmp(ni1, ni2) + assert c == 1, msg % (ni1.bsig, ni2, c, 1) + + ni2.bsig = 666 + c = cmp(ni1, ni2) + assert c == 1, msg % (ni1.bsig, ni2.bsig, c, 1) ni2.bsig = 777 - assert cmp(ni1, ni2) == 0, "ni1 %s != ni2 %s" % (ni1, ni2) + c = cmp(ni1, ni2) + assert c == 0, msg % (ni1.bsig, ni2.bsig, c, 0) + + ni2.bsig = 888 + c = cmp(ni1, ni2) + assert c == -1, msg % (ni1.bsig, ni2.bsig, c, -1) def test_update(self): """Test updating a NodeInfo with on-disk information""" @@ -2015,7 +2028,7 @@ class RepositoryTestCase(_tempdirTestCase): r = fs.Rfindalldirs(['d1', d2], fs.Top) assert r == [d1, rep1_d1, rep2_d1, rep3_d1, d2], map(str, r) - def tttest_rexists(self): + def test_rexists(self): """Test the Entry.rexists() method""" fs = self.fs test = self.test @@ -2822,7 +2835,7 @@ if __name__ == "__main__": RepositoryTestCase, ] for tclass in tclasses: - names = unittest.getTestCaseNames(tclass, 'tttest_') + names = unittest.getTestCaseNames(tclass, 'test_') suite.addTests(map(tclass, names)) if not unittest.TextTestRunner().run(suite).wasSuccessful(): sys.exit(1) diff --git a/test/QT/up-to-date.py b/test/QT/up-to-date.py new file mode 100644 index 0000000..5ae7cc6 --- /dev/null +++ b/test/QT/up-to-date.py @@ -0,0 +1,130 @@ +#!/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__" + +""" +Validate that a stripped-down real-world Qt configuation (thanks +to Leanid Nazdrynau) with a generated .h file is correctly +up-to-date after a build. + +(This catches a bug that was introduced during a signature refactoring +ca. September 2005.) +""" + +import TestSCons + +test = TestSCons.TestSCons() + +test.subdir('layer', + ['layer', 'aclock'], + ['layer', 'aclock', 'qt_bug']) + +test.write('SConstruct', """\ +import os +import sys +aa=os.getcwd() + +env=Environment(tools=['default','expheaders','qt'],toolpath=[aa]) +env["EXP_HEADER_ABS"]=os.path.join(os.getcwd(),'include') +if not os.access(env["EXP_HEADER_ABS"],os.F_OK): + os.mkdir (env["EXP_HEADER_ABS"]) +Export('env') +env.SConscript('layer/aclock/qt_bug/SConscript') +""") + +test.write('expheaders.py', """\ +import SCons.Defaults +def ExpHeaderScanner(node, env, path): + return [] +def generate(env): + HeaderAction=SCons.Action.Action([SCons.Defaults.Copy('$TARGET','$SOURCE'),SCons.Defaults.Chmod('$TARGET',0755)]) + HeaderBuilder= SCons.Builder.Builder(action=HeaderAction) + env['BUILDERS']['ExportHeaders'] = HeaderBuilder +def exists(env): + return 0 +""") + +test.write(['layer', 'aclock', 'qt_bug', 'SConscript'], """\ +import os + +Import ("env") +env.ExportHeaders(os.path.join(env["EXP_HEADER_ABS"],'main.h'), 'main.h') +env.ExportHeaders(os.path.join(env["EXP_HEADER_ABS"],'migraform.h'), 'migraform.h') +env.Append(CPPPATH=env["EXP_HEADER_ABS"]) +env.StaticLibrary('all',['main.ui','migraform.ui','my.cc']) +""") + +test.write(['layer', 'aclock', 'qt_bug', 'main.ui'], """\ + +Main + + + Main + + + + 0 + 0 + 600 + 385 + + + + + migraform.h + + +""") + +test.write(['layer', 'aclock', 'qt_bug', 'migraform.ui'], """\ + +MigrateForm + + + MigrateForm + + + + 0 + 0 + 600 + 385 + + + + +""") + +test.write(['layer', 'aclock', 'qt_bug', 'my.cc'], """\ +#include +""") + +test.run(arguments = 'layer/aclock/qt_bug/my.o', stderr=None) + +test.up_to_date(options = '--debug=explain', + arguments = 'layer/aclock/qt_bug/my.o', + stderr=None) + +test.pass_test() -- cgit v0.12