summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2004-01-29 03:35:57 (GMT)
committerSteven Knight <knight@baldmt.com>2004-01-29 03:35:57 (GMT)
commit1ed5ce4f1c15b7608fe2fa62be76f7a781f98faa (patch)
tree2e6c2769a032d26227b22c39df84706d35ed7408
parentd0b4699180b7177561f452b646b85ec39f09d0e2 (diff)
downloadSCons-1ed5ce4f1c15b7608fe2fa62be76f7a781f98faa.zip
SCons-1ed5ce4f1c15b7608fe2fa62be76f7a781f98faa.tar.gz
SCons-1ed5ce4f1c15b7608fe2fa62be76f7a781f98faa.tar.bz2
Provide a better error message when a construction variable expansion is a Python syntax error.
-rw-r--r--src/CHANGES.txt3
-rw-r--r--src/engine/SCons/Util.py7
-rw-r--r--src/engine/SCons/UtilTests.py18
-rw-r--r--test/errors.py23
4 files changed, 50 insertions, 1 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 26dd7ef..8b14bf4 100644
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -144,6 +144,9 @@ RELEASE 0.95 - XXX
- Fix TestCmd.py, runtest.py and specific tests to accomodate being
run from directories whose paths include white space.
+ - Provide a more useful error message if a construction variable
+ expansion contains a syntax error during evaluation.
+
From Vincent Risi:
- Add support for the bcc32, ilink32 and tlib Borland tools.
diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py
index 0af98fd..6d95a4e 100644
--- a/src/engine/SCons/Util.py
+++ b/src/engine/SCons/Util.py
@@ -40,7 +40,8 @@ import sys
import types
import UserDict
import UserList
-import SCons.Node
+
+import SCons.Errors
try:
from UserString import UserString
@@ -556,6 +557,8 @@ def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, dict=No
s = eval(key, self.gvars, lvars)
except (IndexError, NameError, TypeError):
return ''
+ except (SyntaxError):
+ raise SCons.Errors.UserError, "Syntax error trying to evaluate `%s'" % s
else:
# Before re-expanding the result, handle
# recursive expansion by copying the local
@@ -690,6 +693,8 @@ def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, di
s = eval(key, self.gvars, lvars)
except (IndexError, NameError, TypeError):
return
+ except (SyntaxError):
+ raise SCons.Errors.UserError, "Syntax error trying to evaluate `%s'" % s
else:
# Before re-expanding the result, handle
# recursive expansion by copying the local
diff --git a/src/engine/SCons/UtilTests.py b/src/engine/SCons/UtilTests.py
index ca5f649..fb4ec09 100644
--- a/src/engine/SCons/UtilTests.py
+++ b/src/engine/SCons/UtilTests.py
@@ -32,6 +32,8 @@ import unittest
from SCons.Util import *
import TestCmd
+import SCons.Errors
+
class OutBuffer:
def __init__(self):
self.buffer = ""
@@ -410,6 +412,14 @@ class UtilTestCase(unittest.TestCase):
env, target=MyNode('t'), source=MyNode('s'))
assert newcom == "test foo baz s t", newcom
+ # Test that we handle syntax errors during expansion as expected.
+ try:
+ scons_subst('$foo.bar.3.0', env)
+ except SCons.Errors.UserError, e:
+ assert str(e) == "Syntax error trying to evaluate `$foo.bar.3.0'", e
+ else:
+ raise AssertionError, "did not catch expected UserError"
+
# Test returning a function.
#env = DummyEnv({'FUNCTION' : foo})
#func = scons_subst("$FUNCTION", env, mode=SUBST_RAW, call=None)
@@ -732,6 +742,14 @@ class UtilTestCase(unittest.TestCase):
del subst_list_cases[:4]
assert failed == 0, "%d subst() mode cases failed" % failed
+ # Test that we handle syntax errors during expansion as expected.
+ try:
+ scons_subst_list('$foo.bar.3.0', env)
+ except SCons.Errors.UserError, e:
+ assert str(e) == "Syntax error trying to evaluate `$foo.bar.3.0'", e
+ else:
+ raise AssertionError, "did not catch expected SyntaxError"
+
def test_splitext(self):
assert splitext('foo') == ('foo','')
assert splitext('foo.bar') == ('foo','.bar')
diff --git a/test/errors.py b/test/errors.py
index d87b41a..4c493f6 100644
--- a/test/errors.py
+++ b/test/errors.py
@@ -182,4 +182,27 @@ test.run(status=2, stderr="scons: \\*\\*\\* \\[one.out\\] Error 2\n")
+# Test syntax errors when trying to expand construction variables.
+test.write('SConstruct', """\
+env = Environment()
+env.subst('$foo.bar.3.0')
+""")
+
+test.run(status=2, stderr="""
+scons: \*\*\* Syntax error trying to evaluate `\$foo\.bar\.3\.0'
+File "SConstruct", line 2, in \?
+""")
+
+test.write('SConstruct', """\
+env = Environment()
+env.subst_list('$foo.3.0.x')
+""")
+
+test.run(status=2, stderr="""
+scons: \*\*\* Syntax error trying to evaluate `\$foo\.3\.0\.x'
+File "SConstruct", line 2, in \?
+""")
+
+
+
test.pass_test()