summaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-11-27 02:02:36 (GMT)
committerSteven Knight <knight@baldmt.com>2002-11-27 02:02:36 (GMT)
commit814029abd36603a70bc402826c79a5fdefe3c2a1 (patch)
tree4edf62d6b0b5114ef5baf54a802a7f1c648172e0 /src/engine
parentdd30a312b7c59abd25d41c3d332df57801abf66b (diff)
downloadSCons-814029abd36603a70bc402826c79a5fdefe3c2a1.zip
SCons-814029abd36603a70bc402826c79a5fdefe3c2a1.tar.gz
SCons-814029abd36603a70bc402826c79a5fdefe3c2a1.tar.bz2
Provide graceful failures when a source file doesn't exist and can't be build, and when a nonexistent drive letter is used on Win32.
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/SCons/Errors.py4
-rw-r--r--src/engine/SCons/Node/FS.py20
-rw-r--r--src/engine/SCons/Node/FSTests.py1
-rw-r--r--src/engine/SCons/Script/__init__.py6
4 files changed, 25 insertions, 6 deletions
diff --git a/src/engine/SCons/Errors.py b/src/engine/SCons/Errors.py
index 2640220..112a4c9 100644
--- a/src/engine/SCons/Errors.py
+++ b/src/engine/SCons/Errors.py
@@ -45,3 +45,7 @@ class InternalError(Exception):
class UserError(Exception):
def __init__(self, args=None):
self.args = args
+
+class StopError(Exception):
+ def __init__(self, args=None):
+ self.args = args
diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py
index 59b8e63..d5247f7 100644
--- a/src/engine/SCons/Node/FS.py
+++ b/src/engine/SCons/Node/FS.py
@@ -43,7 +43,7 @@ import types
import SCons.Node
from UserDict import UserDict
import sys
-from SCons.Errors import UserError
+import SCons.Errors
import SCons.Warnings
try:
@@ -296,7 +296,7 @@ class FS:
directory = self.Root[drive]
except KeyError:
if not create:
- raise UserError
+ raise SCons.Errors.UserError
dir = Dir(drive, ParentOfRoot(), self)
dir.path = dir.path + os.sep
dir.abspath = dir.abspath + os.sep
@@ -314,7 +314,7 @@ class FS:
Dir)
except KeyError:
if not create:
- raise UserError
+ raise SCons.Errors.UserError
# look at the actual filesystem and make sure there isn't
# a file already there
@@ -332,7 +332,7 @@ class FS:
ret = self.__checkClass(directory.entries[file_name], fsclass)
except KeyError:
if not create:
- raise UserError
+ raise SCons.Errors.UserError
# make sure we don't create File nodes when there is actually
# a directory at that path on the disk, and vice versa
@@ -436,9 +436,9 @@ class FS:
if not isinstance(build_dir, SCons.Node.Node):
build_dir = self.Dir(build_dir)
if not src_dir.is_under(self.Top):
- raise UserError, "Source directory must be under top of build tree."
+ raise SCons.Errors.UserError, "Source directory must be under top of build tree."
if src_dir.is_under(build_dir):
- raise UserError, "Source directory cannot be under build directory."
+ raise SCons.Errors.UserError, "Source directory cannot be under build directory."
build_dir.link(src_dir, duplicate)
def Repository(self, *dirs):
@@ -848,6 +848,14 @@ class File(Entry):
def prepare(self):
"""Prepare for this file to be created."""
+
+ def missing(node):
+ return not node.builder and not node.rexists()
+ missing_sources = filter(missing, self.children())
+ if missing_sources:
+ desc = "No Builder for target `%s', needed by `%s'." % (missing_sources[0], self)
+ raise SCons.Errors.StopError, desc
+
if self.exists():
if self.builder and not self.precious:
os.unlink(self.path)
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index c817408..5d32873 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -628,6 +628,7 @@ class FSTestCase(unittest.TestCase):
assert os.path.exists(test.workpath("remove_me"))
f1 = fs.File(test.workpath("remove_me"))
f1.builder = 1
+ f1.env_set(Environment())
f1.prepare()
assert not os.path.exists(test.workpath("remove_me"))
diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py
index 814d147..dd44621 100644
--- a/src/engine/SCons/Script/__init__.py
+++ b/src/engine/SCons/Script/__init__.py
@@ -99,6 +99,12 @@ class BuildTask(SCons.Taskmaster.Task):
# don't try to walk the stack, just print the error.
sys.stderr.write("\nSCons error: %s\n" % e)
raise
+ except StopError, e:
+ s = str(e)
+ if not keep_going_on_error:
+ s = s + ' Stop.'
+ sys.stderr.write("scons: *** %s\n" % s)
+ raise
except:
sys.stderr.write("scons: *** %s\n" % sys.exc_value)
raise