[Scons-dev] please try latest default branch
Gary Oberbrunner
garyo at oberbrunner.com
Sun Feb 2 17:13:21 EST 2014
HA -- got a small repro testcase!
SConstruct: ----------------------
# This tests the too-many-rebuilds problem with SCons 2.3.1 (test)
# Run like this: scons all-defuns.obj
# Test setup (only runs once)
import os.path
if not os.path.exists('mkl'):
os.mkdir('mkl')
if not os.path.exists('test.c'):
open('test.c', 'w').write('int i;')
env=Environment()
env.SharedObject('all-defuns.obj', 'all-defuns.c')
results = env.Command('all-defuns.c', 'test.c', Copy('$TARGET', '$SOURCE'))
env.Depends(results, '#mkl')
--------------------------
Run that twice as "scons all-defuns.obj". The second time _shouldn't_
rebuild anything, but it will re-run the Copy command. SCons 2.3.0
correctly doesn't do anything the second time.
Note: just running "scons" with the above SConstruct won't show the bug;
there's an ordering dependency here, so just "scons" considers the targets
in a different order from "scons all-defuns.obj".
Dirk, I guess the ball's in your court! :-) Of course I want to keep
helping to solve it but at least you and interested others (hi Roberto!)
can give it a try.
I'll check in some of my new tracing code soon; it's been helpful to me so
far.
-- Gary
On Sun, Feb 2, 2014 at 3:49 PM, Gary Oberbrunner <garyo at oberbrunner.com>wrote:
> Well, my smaller test case with just the "important" files works fine so
> far. It's probably just _too_ small. But in the meantime I have a more
> complete understanding of what's happening.
>
> I traced through the taskmaster as all this is happening.
>
> Note that in Taskmaster-speak, "considering" is prior to "evaluating".
>
> 1. Taskmaster considers all-defuns.obj (This is in find_next_ready_node)
> - That checks node status of all children (via target.children()
> because Node.children() defaults its scan arg to 1),
> including all-defuns.c and recursively the dir mkl
> - mkl is in state no_state (never examined), so
> it returns changed=True which means all-defuns.c "has changed" --
> and that gets cached as the node status for all-defuns.c (incorrectly).
> This happens during the get_all_children() call for all-defuns.obj.
> 2. Taskmaster evaluates mkl; it's actually fine and taskmaster marks
> it up-to-date (in taskmaster).
> 3. Taskmaster evaluates all-defuns.c;
> It checks node up-to-date states for children and itself
> and it itself is cached as out of date (see #1 above), so it
> decides to rebuild it.
>
> Some possibilities for fixing or workarounds:
>
> -> Maybe a node changed state that relies on a no_state child should
> not get cached? (This could be a little complicated to implement)
> -> maybe no_state shouldn't mean "changed"? But it probably can't
> mean "not changed" either... would have to add a third "don't know"
> state.
> -> maybe if we encounter a no_state object while checking parents it
> should try to set its state? (but that would require evaluating it, and
> it's too early for that)
>
> --
> Gary
>
--
Gary
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://two.pairlist.net/pipermail/scons-dev/attachments/20140202/bf0f1131/attachment.html>
More information about the Scons-dev
mailing list