summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CHANGES.txt9
-rw-r--r--src/engine/SCons/Environment.py50
-rw-r--r--src/engine/SCons/EnvironmentTests.py56
-rw-r--r--src/engine/SCons/Tool/qt.py6
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)