[Scons-users] Overriding Object to force global dependency
Pawel Tomulik
ptomulik at meil.pw.edu.pl
Fri Jun 29 06:32:46 EDT 2012
W dniu 27.06.2012 19:04, Greg Ward pisze:
> Hi all --
>
> I want to force every single *.o file in my build to artificially
> depend on something. (We have a homebrew tool that downloads and
> unpacks specific versions of all third-party dependencies -- GCC,
> C/C++ libraries, Java libraries, etc. This tool must run first, and
> everything else should depend on its output.)
>
> The obvious thing to do is override env.Object(), but I'm not sure how
> to do that. I tried it with env.AddMethod, and that only half worked.
> Here's my override:
>
> _Object = env.Object
> def Object(env, *args, **kwargs):
> global _Object, dummy
> print('Object override: args=%s' % map(str, args))
> obj = _Object(*args, **kwargs)
> env.Depends(obj, dummy)
> return obj
>
> env.AddMethod(Object, 'Object')
>
> ('dummy' is the output of that homebrew dependency tool.)
>
> This works as long as I only ever use one env object. But as soon as I
> do
>
> env = env.Clone()
>
> it stops working. The clone has the original Object() method, not
> mine. ;-(
>
> Is there a good way to do this?
>
Hi Greg,
It may be possible to use emitter for your purpose, I think.
Dee API docs for SCons.Builder.BuilderBase, especially add_emitter()
method. Try something like:
def my_emitter(target, source, env):
env.Depends(target, 'foo.txt')
return target, source
env = Environment()
env['BUILDERS']['StaticObject'].add_emitter('.c', my_emitter)
ob = env.Object('a.c')
Regards!
--
Paweł Tomulik
More information about the Scons-users
mailing list