summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Builder.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/SCons/Builder.py')
-rw-r--r--src/engine/SCons/Builder.py70
1 files changed, 33 insertions, 37 deletions
diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py
index fe6283b..02f9e2d 100644
--- a/src/engine/SCons/Builder.py
+++ b/src/engine/SCons/Builder.py
@@ -79,7 +79,7 @@ class DictCmdGenerator:
"""
self.action_dict[suffix] = action
- def __call__(self, source, target, env, **kw):
+ def __call__(self, target, source, env, for_signature):
ext = None
for src in map(str, source):
my_ext = SCons.Util.splitext(src)[1]
@@ -124,7 +124,7 @@ def Builder(**kw):
if not var:
raise UserError, "Supplied emitter '%s' does not appear to refer to an Environment variable" % kw['emitter']
kw['emitter'] = EmitterProxy(var)
-
+
if kw.has_key('src_builder'):
ret = apply(MultiStepBuilder, (), kw)
else:
@@ -135,7 +135,7 @@ def Builder(**kw):
return ret
-def _init_nodes(builder, env, args, tlist, slist):
+def _init_nodes(builder, env, overrides, tlist, slist):
"""Initialize lists of target and source nodes with all of
the proper Builder information.
"""
@@ -150,10 +150,10 @@ def _init_nodes(builder, env, args, tlist, slist):
if t.side_effect:
raise UserError, "Multiple ways to build the same target were specified for: %s" % str(t)
if t.builder is not None:
- if t.env != env:
+ if t.env != env:
raise UserError, "Two different environments were specified for the same target: %s"%str(t)
- elif t.build_args != args:
- raise UserError, "Two different sets of build arguments were specified for the same target: %s"%str(t)
+ elif t.overrides != overrides:
+ raise UserError, "Two different sets of overrides were specified for the same target: %s"%str(t)
elif builder.scanner and builder.scanner != t.target_scanner:
raise UserError, "Two different scanners were specified for the same target: %s"%str(t)
@@ -166,14 +166,14 @@ def _init_nodes(builder, env, args, tlist, slist):
elif t.sources != slist:
raise UserError, "Multiple ways to build the same target were specified for: %s" % str(t)
- t.build_args = args
+ t.overrides = overrides
t.cwd = SCons.Node.FS.default_fs.getcwd()
t.builder_set(builder)
t.env_set(env)
t.add_source(slist)
if builder.scanner:
t.target_scanner = builder.scanner
-
+
def _adjust_suffix(suff):
if suff and not suff[0] in [ '.', '$' ]:
return '.' + suff
@@ -189,7 +189,7 @@ class EmitterProxy:
def __init__(self, var):
self.var = SCons.Util.to_String(var)
- def __call__(self, target, source, env, **kw):
+ def __call__(self, target, source, env):
emitter = self.var
# Recursively substitute the variable.
@@ -200,11 +200,8 @@ class EmitterProxy:
emitter = env[emitter]
if not callable(emitter):
return (target, source)
- args = { 'target':target,
- 'source':source,
- 'env':env }
- args.update(kw)
- return apply(emitter, (), args)
+
+ return emitter(target, source, env)
def __cmp__(self, other):
return cmp(self.var, other.var)
@@ -258,7 +255,7 @@ class BuilderBase:
def __cmp__(self, other):
return cmp(self.__dict__, other.__dict__)
- def _create_nodes(self, env, args, target = None, source = None):
+ def _create_nodes(self, env, overrides, target = None, source = None):
"""Create and return lists of target and source nodes.
"""
def adjustixes(files, pre, suf):
@@ -280,6 +277,8 @@ class BuilderBase:
ret.append(f)
return ret
+ env = env.Override(overrides)
+
pre = self.get_prefix(env)
suf = self.get_suffix(env)
src_suf = self.get_src_suffix(env)
@@ -294,49 +293,45 @@ class BuilderBase:
if self.emitter:
# pass the targets and sources to the emitter as strings
- # rather than nodes since str(node) doesn't work
+ # rather than nodes since str(node) doesn't work
# properly from any directory other than the top directory,
# and emitters are called "in" the SConscript directory:
- emit_args = { 'target' : target,
- 'source' : source,
- 'env' : env }
- emit_args.update(args)
- target, source = apply(self.emitter, (), emit_args)
+ target, source = self.emitter(target=target, source=source, env=env)
slist = SCons.Node.arg2nodes(source, self.source_factory)
tlist = SCons.Node.arg2nodes(target, self.target_factory)
return tlist, slist
- def __call__(self, env, target = None, source = _null, **kw):
+ def __call__(self, env, target = None, source = _null, **overrides):
if source is _null:
source = target
target = None
- tlist, slist = self._create_nodes(env, kw, target, source)
+ tlist, slist = self._create_nodes(env, overrides, target, source)
if len(tlist) == 1:
- _init_nodes(self, env, kw, tlist, slist)
+ _init_nodes(self, env, overrides, tlist, slist)
tlist = tlist[0]
else:
- _init_nodes(ListBuilder(self, env, tlist), env, kw, tlist, slist)
+ _init_nodes(ListBuilder(self, env, tlist), env, overrides, tlist, slist)
return tlist
- def execute(self, **kw):
+ def execute(self, target, source, env):
"""Execute a builder's action to create an output object.
"""
- return apply(self.action.execute, (), kw)
+ return self.action.execute(target, source, env)
- def get_raw_contents(self, **kw):
+ def get_raw_contents(self, target, source, env):
"""Fetch the "contents" of the builder's action.
"""
- return apply(self.action.get_raw_contents, (), kw)
+ return self.action.get_raw_contents(target, source, env)
- def get_contents(self, **kw):
+ def get_contents(self, target, source, env):
"""Fetch the "contents" of the builder's action
(for signature calculation).
"""
- return apply(self.action.get_contents, (), kw)
+ return self.action.get_contents(target, source, env)
def src_suffixes(self, env):
return map(lambda x, e=env: e.subst(_adjust_suffix(x)),
@@ -383,17 +378,17 @@ class ListBuilder(SCons.Util.Proxy):
self.multi = builder.multi
self.name = "ListBuilder(%s)"%builder.name
- def execute(self, **kw):
+ def execute(self, target, source, env):
if hasattr(self, 'status'):
return self.status
for t in self.tlist:
# unlink all targets and make all directories
# before building anything
t.prepare()
- kw['target'] = self.tlist
- self.status = apply(self.builder.execute, (), kw)
+ target = self.tlist
+ self.status = self.builder.execute(target, source, env)
for t in self.tlist:
- if not t is kw['target']:
+ if not t is target:
t.build()
return self.status
@@ -443,7 +438,7 @@ class MultiStepBuilder(BuilderBase):
if not SCons.Util.is_List(src_builder):
src_builder = [ src_builder ]
self.src_builder = src_builder
- self.sdict = {}
+ self.sdict = {}
self.cached_src_suffixes = {} # source suffixes keyed on id(env)
def __call__(self, env, target = None, source = None, **kw):
@@ -463,8 +458,9 @@ class MultiStepBuilder(BuilderBase):
continue
for suf in bld.src_suffixes(env):
sdict[suf] = bld
-
+
src_suffixes = self.src_suffixes(env)
+
for snode in slist:
path, ext = SCons.Util.splitext(snode.abspath)
if sdict.has_key(ext):