diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CHANGES.txt | 9 | ||||
-rw-r--r-- | src/engine/SCons/Environment.py | 50 | ||||
-rw-r--r-- | src/engine/SCons/EnvironmentTests.py | 56 | ||||
-rw-r--r-- | src/engine/SCons/Tool/qt.py | 6 |
4 files changed, 114 insertions, 7 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt index e6c3b53..e75d50d 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -173,6 +173,15 @@ RELEASE 0.95 - XXX - Save memory at build time by allowing Nodes to delete their build environments after they've been built. + - Add AppendUnique() and PrependUnique() Environment methods, which + add values to construction variables like Append() and Prepend() + do, but suppress any duplicate elements in the list. + + - Allow the 'qt' tool to still be used successfully from a copied + Environment. The include and library directories previously ended up + having the same string re-appended to the end, yielding an incorrect + path name. + From Vincent Risi: - Add support for the bcc32, ilink32 and tlib Borland tools. diff --git a/src/engine/SCons/Environment.py b/src/engine/SCons/Environment.py index 46897ef..900b1e1 100644 --- a/src/engine/SCons/Environment.py +++ b/src/engine/SCons/Environment.py @@ -454,6 +454,31 @@ class Base: self._dict[envname][name] = nv + def AppendUnique(self, **kw): + """Append values to existing construction variables + in an Environment, if they're not already there. + """ + kw = our_deepcopy(kw) + for key, val in kw.items(): + if not self._dict.has_key(key): + self._dict[key] = val + elif SCons.Util.is_Dict(self._dict[key]) and \ + SCons.Util.is_Dict(val): + self._dict[key].update(val) + elif SCons.Util.is_List(val): + dk = self._dict[key] + if not SCons.Util.is_List(dk): + dk = [dk] + val = filter(lambda x, dk=dk: x not in dk, val) + self._dict[key] = dk + val + else: + dk = self._dict[key] + if SCons.Util.is_List(dk): + if not val in dk: + self._dict[key] = dk + val + else: + self._dict[key] = self._dict[key] + val + def Copy(self, tools=None, toolpath=[], **kw): """Return a copy of a construction Environment. The copy is like a Python "deep copy"--that is, independent @@ -623,6 +648,31 @@ class Base: self._dict[envname][name] = nv + def PrependUnique(self, **kw): + """Append values to existing construction variables + in an Environment, if they're not already there. + """ + kw = our_deepcopy(kw) + for key, val in kw.items(): + if not self._dict.has_key(key): + self._dict[key] = val + elif SCons.Util.is_Dict(self._dict[key]) and \ + SCons.Util.is_Dict(val): + self._dict[key].update(val) + elif SCons.Util.is_List(val): + dk = self._dict[key] + if not SCons.Util.is_List(dk): + dk = [dk] + val = filter(lambda x, dk=dk: x not in dk, val) + self._dict[key] = val + dk + else: + dk = self._dict[key] + if SCons.Util.is_List(dk): + if not val in dk: + self._dict[key] = val + dk + else: + self._dict[key] = val + dk + def Replace(self, **kw): """Replace existing construction variables in an Environment with new construction variables and/or values. diff --git a/src/engine/SCons/EnvironmentTests.py b/src/engine/SCons/EnvironmentTests.py index f81a102..0887ae3 100644 --- a/src/engine/SCons/EnvironmentTests.py +++ b/src/engine/SCons/EnvironmentTests.py @@ -587,9 +587,9 @@ class EnvironmentTestCase(unittest.TestCase): RDirs=RDirs) flags = env.subst_list('$_LIBFLAGS', 1)[0] assert len(flags) == 3, flags - assert flags[0] == 'foofoobar', \ + assert flags[0] == 'foobar', \ flags[0] - assert flags[1] == 'foobarbar', \ + assert flags[1] == 'foobar', \ flags[1] assert flags[2] == 'foobazbar', \ flags[2] @@ -611,7 +611,7 @@ class EnvironmentTestCase(unittest.TestCase): flags[2] assert flags[3] == os.path.normpath('foo'), \ flags[3] - assert flags[4] == os.path.normpath('xx/baz/barbar'), \ + assert flags[4] == os.path.normpath('xx/baz/bar'), \ flags[4] assert flags[5] == os.path.normpath('foo'), \ flags[5] @@ -635,7 +635,7 @@ class EnvironmentTestCase(unittest.TestCase): flags[2] assert flags[3] == os.path.normpath('foo'), \ flags[3] - assert flags[4] == os.path.normpath('xx/baz/barbar'), \ + assert flags[4] == os.path.normpath('xx/baz/bar'), \ flags[4] assert flags[5] == os.path.normpath('foo'), \ flags[5] @@ -900,6 +900,30 @@ class EnvironmentTestCase(unittest.TestCase): assert(env1['ENV']['PATH'] == r'C:\dir\num\one;C:\dir\num\two;C:\dir\num\three') assert(env1['MYENV']['MYPATH'] == r'C:\mydir\num\two;C:\mydir\num\three;C:\mydir\num\one') + def test_AppendUnique(self): + """Test appending to unique values to construction variables + + This strips values that are already present when lists are + involved.""" + env = Environment(AAA1 = 'a1', + AAA2 = 'a2', + AAA3 = 'a3', + BBB1 = ['b1'], + BBB2 = ['b2'], + BBB3 = ['b3']) + env.AppendUnique(AAA1 = 'a1', + AAA2 = ['a2'], + AAA3 = ['a3', 'b', 'c', 'a3'], + BBB1 = 'b1', + BBB2 = ['b2'], + BBB3 = ['b3', 'c', 'd', 'b3']) + assert env['AAA1'] == 'a1a1', env['AAA1'] + assert env['AAA2'] == ['a2'], env['AAA2'] + assert env['AAA3'] == ['a3', 'b', 'c'], env['AAA3'] + assert env['BBB1'] == ['b1'], env['BBB1'] + assert env['BBB2'] == ['b2'], env['BBB2'] + assert env['BBB3'] == ['b3', 'c', 'd'], env['BBB3'] + def test_Copy(self): """Test construction Environment copying @@ -1189,6 +1213,30 @@ class EnvironmentTestCase(unittest.TestCase): assert(env1['ENV']['PATH'] == r'C:\dir\num\three;C:\dir\num\two;C:\dir\num\one') assert(env1['MYENV']['MYPATH'] == r'C:\mydir\num\one;C:\mydir\num\three;C:\mydir\num\two') + def test_PrependUnique(self): + """Test prepending unique values to construction variables + + This strips values that are already present when lists are + involved.""" + env = Environment(AAA1 = 'a1', + AAA2 = 'a2', + AAA3 = 'a3', + BBB1 = ['b1'], + BBB2 = ['b2'], + BBB3 = ['b3']) + env.PrependUnique(AAA1 = 'a1', + AAA2 = ['a2'], + AAA3 = ['a3', 'b', 'c', 'a3'], + BBB1 = 'b1', + BBB2 = ['b2'], + BBB3 = ['b3', 'b', 'c', 'b3']) + assert env['AAA1'] == 'a1a1', env['AAA1'] + assert env['AAA2'] == ['a2'], env['AAA2'] + assert env['AAA3'] == ['b', 'c', 'a3'], env['AAA3'] + assert env['BBB1'] == ['b1'], env['BBB1'] + assert env['BBB2'] == ['b2'], env['BBB2'] + assert env['BBB3'] == ['b', 'c', 'b3'], env['BBB3'] + def test_Replace(self): """Test replacing construction variables in an Environment diff --git a/src/engine/SCons/Tool/qt.py b/src/engine/SCons/Tool/qt.py index 4be7a65..9969e02 100644 --- a/src/engine/SCons/Tool/qt.py +++ b/src/engine/SCons/Tool/qt.py @@ -210,9 +210,9 @@ def generate(env): env['LIBEMITTER'] = _Automoc('StaticObject', uicDeclBld,mocFromHBld,mocFromCppBld) # Of course, we need to link against the qt libraries - env.Append(CPPPATH=os.path.join('$QTDIR', 'include')) - env.Append(LIBPATH=os.path.join('$QTDIR', 'lib')) - env.Append(LIBS='$QT_LIB') + env.AppendUnique(CPPPATH=[os.path.join('$QTDIR', 'include')]) + env.AppendUnique(LIBPATH=[os.path.join('$QTDIR', 'lib')]) + env.AppendUnique(LIBS=['$QT_LIB']) def exists(env): return _detect(env) |