| Index: third_party/scons/scons-local/SCons/Builder.py
|
| ===================================================================
|
| --- third_party/scons/scons-local/SCons/Builder.py (revision 9094)
|
| +++ third_party/scons/scons-local/SCons/Builder.py (working copy)
|
| @@ -76,7 +76,7 @@
|
| """
|
|
|
| #
|
| -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
|
| +# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 The SCons Foundation
|
| #
|
| # Permission is hereby granted, free of charge, to any person obtaining
|
| # a copy of this software and associated documentation files (the
|
| @@ -98,7 +98,7 @@
|
| # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
| #
|
|
|
| -__revision__ = "src/engine/SCons/Builder.py 3842 2008/12/20 22:59:52 scons"
|
| +__revision__ = "src/engine/SCons/Builder.py 3897 2009/01/13 06:45:54 scons"
|
|
|
| import UserDict
|
| import UserList
|
| @@ -118,6 +118,15 @@
|
|
|
| _null = _Null
|
|
|
| +def match_splitext(path, suffixes = []):
|
| + if suffixes:
|
| + matchsuf = filter(lambda S,path=path: path[-len(S):] == S,
|
| + suffixes)
|
| + if matchsuf:
|
| + suf = max(map(None, map(len, matchsuf), matchsuf))[1]
|
| + return [path[:-len(suf)], path[-len(suf):]]
|
| + return SCons.Util.splitext(path)
|
| +
|
| class DictCmdGenerator(SCons.Util.Selector):
|
| """This is a callable class that can be used as a
|
| command generator function. It holds on to a dictionary
|
| @@ -142,20 +151,22 @@
|
| return []
|
|
|
| if self.source_ext_match:
|
| + suffixes = self.src_suffixes()
|
| ext = None
|
| for src in map(str, source):
|
| - my_ext = SCons.Util.splitext(src)[1]
|
| + my_ext = match_splitext(src, suffixes)[1]
|
| if ext and my_ext != ext:
|
| raise UserError("While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %s" % (repr(map(str, target)), src, ext, my_ext))
|
| ext = my_ext
|
| else:
|
| - ext = SCons.Util.splitext(str(source[0]))[1]
|
| + ext = match_splitext(str(source[0]), self.src_suffixes())[1]
|
|
|
| if not ext:
|
| + #return ext
|
| raise UserError("While building `%s': Cannot deduce file extension from source files: %s" % (repr(map(str, target)), repr(map(str, source))))
|
|
|
| try:
|
| - ret = SCons.Util.Selector.__call__(self, env, source)
|
| + ret = SCons.Util.Selector.__call__(self, env, source, ext)
|
| except KeyError, e:
|
| raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e[0], e[1], e[2]))
|
| if ret is None:
|
| @@ -295,8 +306,9 @@
|
| if t.builder != builder:
|
| msg = "Two different builders (%s and %s) were specified for the same target: %s" % (t.builder.get_name(env), builder.get_name(env), t)
|
| raise UserError, msg
|
| - if t.get_executor().targets != tlist:
|
| - msg = "Two different target lists have a target in common: %s (from %s and from %s)" % (t, map(str, t.get_executor().targets), map(str, tlist))
|
| + # TODO(batch): list constructed each time!
|
| + if t.get_executor().get_all_targets() != tlist:
|
| + msg = "Two different target lists have a target in common: %s (from %s and from %s)" % (t, map(str, t.get_executor().get_all_targets()), map(str, tlist))
|
| raise UserError, msg
|
| elif t.sources != slist:
|
| msg = "Multiple ways to build the same target were specified for: %s (from %s and from %s)" % (t, map(str, t.sources), map(str, slist))
|
| @@ -441,30 +453,10 @@
|
| if not env:
|
| env = self.env
|
| if env:
|
| - matchsuf = filter(lambda S,path=path: path[-len(S):] == S,
|
| - self.src_suffixes(env))
|
| - if matchsuf:
|
| - suf = max(map(None, map(len, matchsuf), matchsuf))[1]
|
| - return [path[:-len(suf)], path[-len(suf):]]
|
| - return SCons.Util.splitext(path)
|
| -
|
| - def get_single_executor(self, env, tlist, slist, executor_kw):
|
| - if not self.action:
|
| - raise UserError, "Builder %s must have an action to build %s."%(self.get_name(env or self.env), map(str,tlist))
|
| - return self.action.get_executor(env or self.env,
|
| - [], # env already has overrides
|
| - tlist,
|
| - slist,
|
| - executor_kw)
|
| -
|
| - def get_multi_executor(self, env, tlist, slist, executor_kw):
|
| - try:
|
| - executor = tlist[0].get_executor(create = 0)
|
| - except (AttributeError, IndexError):
|
| - return self.get_single_executor(env, tlist, slist, executor_kw)
|
| + suffixes = self.src_suffixes(env)
|
| else:
|
| - executor.add_sources(slist)
|
| - return executor
|
| + suffixes = []
|
| + return match_splitext(path, suffixes)
|
|
|
| def _adjustixes(self, files, pre, suf, ensure_suffix=False):
|
| if not files:
|
| @@ -566,12 +558,38 @@
|
| # The targets are fine, so find or make the appropriate Executor to
|
| # build this particular list of targets from this particular list of
|
| # sources.
|
| +
|
| + executor = None
|
| + key = None
|
| +
|
| if self.multi:
|
| - get_executor = self.get_multi_executor
|
| - else:
|
| - get_executor = self.get_single_executor
|
| - executor = get_executor(env, tlist, slist, executor_kw)
|
| + try:
|
| + executor = tlist[0].get_executor(create = 0)
|
| + except (AttributeError, IndexError):
|
| + pass
|
| + else:
|
| + executor.add_sources(slist)
|
|
|
| + if executor is None:
|
| + if not self.action:
|
| + fmt = "Builder %s must have an action to build %s."
|
| + raise UserError, fmt % (self.get_name(env or self.env),
|
| + map(str,tlist))
|
| + key = self.action.batch_key(env or self.env, tlist, slist)
|
| + if key:
|
| + try:
|
| + executor = SCons.Executor.GetBatchExecutor(key)
|
| + except KeyError:
|
| + pass
|
| + else:
|
| + executor.add_batch(tlist, slist)
|
| +
|
| + if executor is None:
|
| + executor = SCons.Executor.Executor(self.action, env, [],
|
| + tlist, slist, executor_kw)
|
| + if key:
|
| + SCons.Executor.AddBatchExecutor(key, executor)
|
| +
|
| # Now set up the relevant information in the target Nodes themselves.
|
| for t in tlist:
|
| t.cwd = env.fs.getcwd()
|
|
|