[Scons-dev] Binding Environments to Nodes
Eric Anderson
andersoe at ece.cmu.edu
Wed Sep 19 21:06:27 EDT 2012
Hi Jason,
It sounds like we're on the same page. The reason I want an environment
object is because the SCons-y way of customizing things seems to be
through the Environment. My API parallels the decider() API, so usage
in an SConstruct looks like this:
# The signature-making function we wish to use
def sigMaker(f):
ninfo = f.get_ninfo()
#print "Executing sigMaker"
ext_sig = hashImportantLines(f.get_contents())
ninfo.ext_sig = ext_sig
return ext_sig
# The call to register it
env.ExtSignature(sigMaker)
# The ugly hack of registering with the default environment, too.
SCons.Defaults.DefaultEnvironment().ExtSignature(sigMaker)
As I said, my API parallels that of the decider, and my implementation
does as much as possible. The problem as I understand it is that
signature-making happens in a wider range of contexts than
signature-checking.
Thanks,
Eric
On 09/19/2012 04:53 PM, Kenny, Jason L wrote:
> I am probably missing something.. but from I can see,
>
> You are wanting to modify the SCons NodeInfoBase or the class based on it such as FileNodeInfo to has a new ext_sig value ( in addition to the current csig, timestamp and size values)
> You then need tweaks to make sure the node class stores some value for ext_sig when we storing data about that is put in the ninfo member. ( I would need to look up the functions that do this in the node classes)
>
> This way when you get the decider function called you can get data that was stored to see if something changed. I am unclear on what you need an environment object for here. I would guess that what you want to be able to attach some function to the object so that when the Scons can get the signature data to store, this function can be called and generate some data to be stored as this ext_sig. This suggests that you want to add some API, in your copy of SCons, to allow some sort of global or per node registration of some type of callable object.
>
>
> Just some quick thoughts..
>
> Jason
>
>
> -----Original Message-----
> From: scons-dev-bounces at scons.org [mailto:scons-dev-bounces at scons.org] On Behalf Of Eric W. Anderson
> Sent: Wednesday, September 19, 2012 3:10 PM
> To: SCons developer list
> Subject: Re: [Scons-dev] Binding Environments to Nodes
>
> What I'm doing (the exact code is here
> https://bitbucket.org/eanderso/scons-custom-sig/compare/default..scons/scons:default)
> is an internal change in Scons.Node.FS.File. So in that context, I'm getting the environment with self.get_env(). That returns self.env if set, and otherwise the/a DefaultEnvironment. I can't tell you why, but I can say from looking at the output that may operations are done on the Node without env having been set. Here's a snippet of my SConstruct:
>
> env = Environment()
>
> ... bunch of stuff ...
>
> b=Builder(action="bash myscript.sh $SOURCE $TARGET")
> env.Append(BUILDERS={'B' : b})
> env.Export()
>
> i=File('myinput.txt')
> x=env.B(['myoutput.txt'],[i])
>
> This leads to my extended signature function getting called for the following node, environment pairs, where ...d0 is the default and ...90 is env.
>
> Node 'SConstruct' in env <0x17997d0>
> Node 'SConstruct' in env <0x17997d0>
> Node 'myinput.txt' in env <0x17997d0>
> Node 'myinput.txt' in env <0x17997d0>
> Node 'bash' in env <0x17997d0>
> Node 'bash' in env <0x17997d0>
> Node 'myinput.txt' in env <0x17997d0>
> Node 'bash' in env <0x17997d0>
> Node 'myoutput.txt' in env <0x1799790>
> Node 'myoutput.txt' in env <0x1799790>
>
> There are several different stack traces that lead to getting the default env; here's one:
>
> SCons.Script.main() -> _exec_main(parser, values) -> _main(parser) -> nodes = _build_targets(fs, options, targets, target_top) -> jobs.run(postfunc = jobs_postfunc) -> self.job.start() -> task = self.taskmaster.next_task() -> task.make_ready() -> SCons.Taskmaster.OutOfDateTask.make_ready(self) -> t.visited()
>
> The env I want happens when we get to my code with the following stacks (sorry for the data dump):
>
> SCons.Script.main() -> _exec_main(parser, values) -> _main(parser) -> nodes = _build_targets(fs, options, targets, target_top) -> jobs.run(postfunc = jobs_postfunc) -> self.job.start() -> task = self.taskmaster.next_task() -> task.make_ready() -> SCons.Taskmaster.OutOfDateTask.make_ready(self) -> t.visited()
> SCons.Script.main() -> _exec_main(parser, values) -> _main(parser) -> nodes = _build_targets(fs, options, targets, target_top) -> jobs.run(postfunc = jobs_postfunc) -> self.job.start() -> task.executed() -> SCons.Taskmaster.OutOfDateTask.executed(self) -> t.visited()
>
> Any thoughts would be very welcome!
> -Eric
[snip]
--
Eric W. Anderson Electrical and Computer Engineering
andersoe at ece.cmu.edu Carnegie Mellon University
phone: +1-412-268-1908 Roberts Hall 244
PGP key fingerprint:
D3C5 D6FF EDED 9F1F C36D 53A3 74B7 53A6 3C74 5F12
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 259 bytes
Desc: OpenPGP digital signature
Url : <http://two.pairlist.net/pipermail/scons-dev/attachments/20120919/f0ecf00c/attachment.pgp>
More information about the Scons-dev
mailing list