summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2004-09-15 01:19:55 (GMT)
committerSteven Knight <knight@baldmt.com>2004-09-15 01:19:55 (GMT)
commit7fef06f597626b9ee3faa0aa716819258e583812 (patch)
treec43c6b210684e12eb7c33ddc82ef5325be21feb4 /src
parentdecb5aded9c3103e52a31cd75fed2391e7bf29c5 (diff)
downloadSCons-7fef06f597626b9ee3faa0aa716819258e583812.zip
SCons-7fef06f597626b9ee3faa0aa716819258e583812.tar.gz
SCons-7fef06f597626b9ee3faa0aa716819258e583812.tar.bz2
Handle exceptions in FunctionActions. (Steve Christensen)
Diffstat (limited to 'src')
-rw-r--r--src/engine/SCons/Action.py7
-rw-r--r--src/engine/SCons/Node/FS.py12
-rw-r--r--src/engine/SCons/Node/FSTests.py2
-rw-r--r--src/engine/SCons/Script/__init__.py5
4 files changed, 15 insertions, 11 deletions
diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py
index 63d8c98..e110d60 100644
--- a/src/engine/SCons/Action.py
+++ b/src/engine/SCons/Action.py
@@ -497,7 +497,12 @@ class FunctionAction(ActionBase):
def execute(self, target, source, env):
rsources = map(rfile, source)
- return self.execfunction(target=target, source=rsources, env=env)
+ try:
+ result = self.execfunction(target=target, source=rsources, env=env)
+ except EnvironmentError, e:
+ # If an IOError/OSError happens, raise a BuildError.
+ raise SCons.Errors.BuildError(node=target, errstr=e.strerror)
+ return result
def get_contents(self, target, source, env, dict=None):
"""Return the signature contents of this callable action.
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 7f0ca62..6d2dd8b 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -1639,11 +1639,7 @@ class File(Base):
if self.get_state() != SCons.Node.up_to_date:
if self.exists():
if self.is_derived() and not self.precious:
- try:
- Unlink(self, [], None)
- except OSError, e:
- raise SCons.Errors.BuildError(node = self,
- errstr = e.strerror)
+ Unlink(self, [], None)
try:
delattr(self, '_exists')
except AttributeError:
@@ -1670,12 +1666,12 @@ class File(Base):
self._createDir()
try:
Unlink(self, None, None)
- except OSError:
+ except SCons.Errors.BuildError:
pass
try:
Link(self, src, None)
- except IOError, e:
- desc = "Cannot duplicate `%s' in `%s': %s." % (src, self.dir, e.strerror)
+ except SCons.Errors.BuildError, e:
+ desc = "Cannot duplicate `%s' in `%s': %s." % (src, self.dir, e.errstr)
raise SCons.Errors.StopError, desc
self.linked = 1
# The Link() action may or may not have actually
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index c213d26..3e80309 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -344,7 +344,7 @@ class BuildDirTestCase(unittest.TestCase):
save_Link = SCons.Node.FS.Link
def Link_IOError(target, source, env):
raise IOError, "Link_IOError"
- SCons.Node.FS.Link = Link_IOError
+ SCons.Node.FS.Link = SCons.Action.Action(Link_IOError, None)
test.write(['work', 'src', 'IOError'], "work/src/IOError\n")
diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py
index 0ad9102..6ae76bf 100644
--- a/src/engine/SCons/Script/__init__.py
+++ b/src/engine/SCons/Script/__init__.py
@@ -161,7 +161,10 @@ class BuildTask(SCons.Taskmaster.Task):
t, e = sys.exc_info()[:2]
if t == SCons.Errors.BuildError:
- sys.stderr.write("scons: *** [%s] %s\n" % (e.node, e.errstr))
+ fname = e.node
+ if SCons.Util.is_List(e.node):
+ fname = string.join(map(str, e.node), ', ')
+ sys.stderr.write("scons: *** [%s] %s\n" % (fname, e.errstr))
if e.errstr == 'Exception':
traceback.print_exception(e.args[0], e.args[1], e.args[2])
elif t == SCons.Errors.ExplicitExit: