diff options
| author | Steven Knight <knight@baldmt.com> | 2002-11-27 02:02:36 (GMT) |
|---|---|---|
| committer | Steven Knight <knight@baldmt.com> | 2002-11-27 02:02:36 (GMT) |
| commit | 814029abd36603a70bc402826c79a5fdefe3c2a1 (patch) | |
| tree | 4edf62d6b0b5114ef5baf54a802a7f1c648172e0 /src/engine | |
| parent | dd30a312b7c59abd25d41c3d332df57801abf66b (diff) | |
| download | SCons-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.py | 4 | ||||
| -rw-r--r-- | src/engine/SCons/Node/FS.py | 20 | ||||
| -rw-r--r-- | src/engine/SCons/Node/FSTests.py | 1 | ||||
| -rw-r--r-- | src/engine/SCons/Script/__init__.py | 6 |
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 |
