[Scons-dev] Possible minor bug + how to get (or assign) a builder to a file node?

Gary Oberbrunner garyo at oberbrunner.com
Thu Oct 4 10:56:50 EDT 2012


On Thu, Oct 4, 2012 at 9:31 AM, Left Right <olegsivokon at gmail.com> wrote:

> Builder.py:537

>

> def _execute(self, env, target, source, overwarn={}, executor_kw={}):

> # We now assume that target and source are lists or None.

> if self.src_builder:

> source = self.src_builder_sources(env, source, overwarn)

>

> Hi. I've ran into this (what seems to be a bug) while trying to find

> the builder of a created file node.

>

> It looks like for you this test is never true. Because if the

> src_builder was a builder object, it would be implementing a

> __nonzero__ method, which throws:

> InternalError: Do not test for the Node.builder attribute directly;

> use Node.has_builder() instead

>

> I ran into this eventually by trying to assign to src_builder property

> of a builder (this is something where I'm blur, but can't find any

> other way to link a file node to its builder). So that when I call

> _execute, self.src_builder exists, but can't be used inside condition.

> :|

>

> I'm most certain I don't quite understand yet how exactly to do what I

> need (so, I probably shouldn't even get there), just stumbled over

> this thing by accident.

>

>

> ====================

>

> The question: suppose I have a generator function like this:

>

> def asGenerator(source, target, env, for_signature):

> print "source: %s" % source[0].get_path()

> print "abs dir: %s" % source[0].src_builder

>

> Suppose I have created a file node (which is source[0].get_path()) like so:

>

> class FlashBuilderBase(BuilderBase):

> """

> An extension needed to run Flash() target with no arguments

> """

> def __init__(self, # long list of arguments...

> **overrides):

> self.fb_project_settings = None

> self.fd_project_settings = None

> return super(FlashBuilderBase, self).__init__(# same arguments

> once again...

> **overrides)

>

> def _execute(self, env, target, source, overwarn={}, executor_kw={}):

> # ...

> self.fb_project = # some info I need about the project file ...

> if not target:

> target = # some code to find the target ...

>

> if not source:

> source = target # this is the file, which later becomes

> the source[0] in asGenerator

>

> return super(FlashBuilderBase, self)._execute(

> env, target, source, overwarn, executor_kw)

>

> Now, I have to get reference this builder (FlashBuilderBase) from

> source[0] in asGenerator - how'd I do that?


You seem to be very confused, if you're that deep into the internals
and undocumented methods. :-)

Can you back up a few steps and say what you're trying to do? (Note
that you say you're creating a File Node, but the code you show is for
a subclass of Builder, which is pretty odd.) Have you been through
Chapter 18 of the User's Guide?
http://www.scons.org/doc/production/HTML/scons-user/c3621.html

--
Gary


More information about the Scons-dev mailing list