Re: Bug in FunctionAction: not allowing custom get_contents

Bill Deegan <[email protected]>
Newsgroups gmane.comp.programming.tools.scons.user
Message-ID <CAEyG4CHUYmUypBvbfWVPxwPmdMFCAYSe5Nnn5UmG4Gf_vs-AxA@mail.gmail.com>
Interesting.
I'd say you're the first person to try this, thus the existing code doesn't
function as you were expecting..

File and Issue (or a PR ) on github?

On Fri, Sep 18, 2020 at 11:31 PM Jeremy Elson <[email protected]> wrote:

> Hi! First, let me just say congratulations on making a wonderful build
> system. I've been using it to manage a very complex build system and it has
> worked wonderfully.
>
> I believe I have found a bug in a somewhat obscure area of scons. I'm
> creating a custom Builder with a FunctionAction, i.e. an action that calls
> a Python function. I want to override get_contents so that my action can
> tell scons when it needs to be re-invoked. There isn't anything in the
> documentation on this topic, but from reading the scons sources it appears
> I need to make a callable object that has a get_contents attribute, like
> this:
>
> class MyCustomAction:
>     def __call__(self, env, target, source):
>         <....my code that generates targets from source....>
>
>     def get_contents(self, env, target, source):
>         <... my code that computes a signature based on relevant parts of
> source>
>
> env.Append(BUILDERS={'MyCustomAction': Builder(
>     action=MyCustomAction()
> )})
>
> This does succeed in generating the targets from source, but scons is not
> properly deciding when the target needs to be rebuilt based on the source.
> In the course of my debugging, I added "assert(False)" to get_contents and
> discovered it was never being called.
>
> I believe the source of the bug is in the scons implementation of
> FunctionAction (in Action.py). Specifically, the __init__ function, which I
> have quoted in part below. It appears to try to determine the static
> contents of the function first, by calling _callable_contents. Only if that
> fails does it check if the callable contains its own get_contents function.
>
> Shouldn't the check to see if get_contents is a defined attribute come
> first?
>
>         self.execfunction = execfunction
>         try:
>             self.funccontents = _callable_contents(execfunction)
>         except AttributeError:
>             try:
>                 # See if execfunction will do the heavy lifting for us.
>                 self.gc = execfunction.get_contents
>             except AttributeError:
>                 # This is weird, just do the best we can.
>                 self.funccontents = _object_contents(execfunction)
>
> _______________________________________________
> Scons-users mailing list
> [email protected]
> https://pairlist4.pair.net/mailman/listinfo/scons-users
>

_______________________________________________
Scons-users mailing list
[email protected]
https://pairlist4.pair.net/mailman/listinfo/scons-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.