[Scons-users] Unexpected warning when defining a target twice during reading of SConscripts
Andrew Featherstone
andrew.featherstone at gmail.com
Sun Dec 3 06:51:48 EST 2017
I can create an issue for this on tigris, but how far away is using
GitHub's issue tracker? This would allow PRs to mention issues in a more
rich way, allowing us to follow some more of the "Collective Code
Construction Contract" defined at https://rfc.zeromq.org/spec:22/C4/ .
I can believe it requires a bit of thought, but ultimately it is a case of
implementing the __eq__ function correctly for Envrionment.
Andrew
On Sat, 02 Dec 2017 21:29:42 -0000, Bill Deegan
<bill at baddogconsulting.com> wrote:
> Andrew,
>
> You wouldn't see it build twice because you cannot due to checking for
> different environments, thus the error.
> There are two different Environments(), so the message is not incorrect.
> Their contents may be equivalent, I know we had a patch to address
> override environments which were equivalent.
>
> Feel free to create a pull request with a fix.
>
> In this specific case it does point out something which has no value in
> the build assuming the two environments are equivalent.
> Whether that's worthy of an error is probably debatable.
>
> There is currently no bug in scons.tigris.org to capture this, so please
> go ahead and file.
>
> I think the issue is the following: (src/engine/SCons/Builder.py line
> 296)
> if (not t.env is None and not t.env is env and
>
>
>> Since there are two different objects, the t.env is env fails.
> Comparing two environments for equality is not done, and indeed could
> get quite complicated as you'll need to compare any dictionaries, lists,
> sets >and functions/classes stored in both Environment()s
>
> Hope that helps.
> -Bill
>
> On Fri, Dec 1, 2017 at 5:54 PM, Andrew Featherstone
> <andrew.featherstone at gmail.com> wrote:
>> They might be different instances, but they're also equal. Surely
>> something must be sharing information or we'd see something like
>>>> scons: Building targets ...
>> simple_cmd(["foo.out"], ["foo.in"])
>> simple_cmd(["foo.out"], ["foo.in"])
>> scons: done building targets.
>>
>> In the logs.
>>>> Andrew
>>
>>
>> On 2 Dec 2017 00:26, "Bill Deegan" <bill at baddogconsulting.com> wrote:
>>> Here's my recipe for finding such in the sources:
>>>
>>> $ grep -r "Two different environments" src/engine/SCons/
>>>
>>> src/engine/SCons/Builder.py: msg = "Two different
>>> environments were specified for target %s,\n\tbut they appear to have
>>> the same >>>action: %s" % (t, action.genstring(tlist, slist, t.env))
>>>
>>>
>>> Actually it's probably correct.
>>> Each time you call SConscript above, it's creating a new Environment().
>>> SConscripts are evaluated basically by python eval.
>>> There's no shared context between the two evaluations of the same
>>> SConscript in this case.
>>>
>>>
>>> On Fri, Dec 1, 2017 at 3:37 PM, Andrew Featherstone
>>> <andrew.featherstone at cantab.net> wrote:
>>>> Hi all,
>>>>
>>>> Here's a simple setup using scons 3.0.1
>>>>
>>>> $ ls
>>>> SConscript SConstruct foo.in
>>>> $ cat SConstruct
>>>> env_a = Environment()
>>>> env_b = Environment()
>>>> for env in (env_a, env_b):
>>>> SConscript(
>>>> 'SConscript'
>>>> )
>>>> $ cat SConscript
>>>> import shutil
>>>>
>>>> env_c = Environment()
>>>>
>>>> def simple_cmd(target, source, env):
>>>> shutil.copy(str(source[0]), str(target[0]))
>>>>
>>>> env_c.Command('foo.out', 'foo.in', simple_cmd)
>>>>
>>>> The expected behaviour when running scons is that the foo.out is
>>>> produced once. This does happen, but SCons incorrectly (AFAICT) warns
>>>> >>>>that different environments are used to build the target foo.out:
>>>>
>>>> $ scons
>>>> scons: Reading SConscript files ...
>>>>
>>>> scons: warning: Two different environments were specified for target
>>>> foo.out,
>>>> but they appear to have the same action: simple_cmd(target,
>>>> source, env)
>>>> File "C:\Users\Andrew\projects\scons-env\SConscript", line 8, in
>>>> <module>
>>>> scons: done reading SConscript files.
>>>> scons: Building targets ...
>>>> simple_cmd(["foo.out"], ["foo.in"])
>>>> scons: done building targets.
>>>>
>>>> The output of --taskmastertrace:
>>>>
>>>>
>>>> Taskmaster: Looking for a node to evaluate
>>>> Taskmaster: Considering node <no_state 0 '.'> and its
>>>> children:
>>>> Taskmaster: <no_state 0 'foo.in'>
>>>> Taskmaster: <no_state 0 'foo.out'>
>>>> Taskmaster: <no_state 0 'SConscript'>
>>>> Taskmaster: <no_state 0 'SConstruct'>
>>>> Taskmaster: adjusted ref count: <pending 1 '.'>, child
>>>> 'foo.in'
>>>> Taskmaster: adjusted ref count: <pending 2 '.'>, child
>>>> 'foo.out'
>>>> Taskmaster: adjusted ref count: <pending 3 '.'>, child
>>>> 'SConscript'
>>>> Taskmaster: adjusted ref count: <pending 4 '.'>, child
>>>> 'SConstruct'
>>>> Taskmaster: Considering node <no_state 0 'foo.in'> and its
>>>> children:
>>>> Taskmaster: Evaluating <pending 0 'foo.in'>
>>>>
>>>> Task.make_ready_current(): node <pending 0 'foo.in'>
>>>> Task.prepare(): node <up_to_date 0 'foo.in'>
>>>> Task.executed_with_callbacks(): node <up_to_date 0 'foo.in'>
>>>> Task.postprocess(): node <up_to_date 0 'foo.in'>
>>>> Task.postprocess(): removing <up_to_date 0 'foo.in'>
>>>> Task.postprocess(): adjusted parent ref count <pending 3 '.'>
>>>>
>>>> Taskmaster: Looking for a node to evaluate
>>>> Taskmaster: Considering node <no_state 0 'foo.out'> and its
>>>> children:
>>>> Taskmaster: <up_to_date 0 'foo.in'>
>>>> Taskmaster: Evaluating <pending 0 'foo.out'>
>>>>
>>>> Task.make_ready_current(): node <pending 0 'foo.out'>
>>>> Task.prepare(): node <executing 0 'foo.out'>
>>>> Task.execute(): node <executing 0 'foo.out'>
>>>> Task.executed_with_callbacks(): node <executing 0 'foo.out'>
>>>> Task.postprocess(): node <executed 0 'foo.out'>
>>>> Task.postprocess(): removing <executed 0 'foo.out'>
>>>> Task.postprocess(): adjusted parent ref count <pending 2 '.'>
>>>>
>>>> Taskmaster: Looking for a node to evaluate
>>>> Taskmaster: Considering node <no_state 0 'SConscript'> and
>>>> its children:
>>>> Taskmaster: Evaluating <pending 0 'SConscript'>
>>>>
>>>> Task.make_ready_current(): node <pending 0 'SConscript'>
>>>> Task.prepare(): node <up_to_date 0 'SConscript'>
>>>> Task.executed_with_callbacks(): node <up_to_date 0 'SConscript'>
>>>> Task.postprocess(): node <up_to_date 0 'SConscript'>
>>>> Task.postprocess(): removing <up_to_date 0 'SConscript'>
>>>> Task.postprocess(): adjusted parent ref count <pending 1 '.'>
>>>>
>>>> Taskmaster: Looking for a node to evaluate
>>>> Taskmaster: Considering node <no_state 0 'SConstruct'> and
>>>> its children:
>>>> Taskmaster: Evaluating <pending 0 'SConstruct'>
>>>>
>>>> Task.make_ready_current(): node <pending 0 'SConstruct'>
>>>> Task.prepare(): node <up_to_date 0 'SConstruct'>
>>>> Task.executed_with_callbacks(): node <up_to_date 0 'SConstruct'>
>>>> Task.postprocess(): node <up_to_date 0 'SConstruct'>
>>>> Task.postprocess(): removing <up_to_date 0 'SConstruct'>
>>>> Task.postprocess(): adjusted parent ref count <pending 0 '.'>
>>>>
>>>> Taskmaster: Looking for a node to evaluate
>>>> Taskmaster: Considering node <pending 0 '.'> and its
>>>> children:
>>>> Taskmaster: <up_to_date 0 'foo.in'>
>>>> Taskmaster: <executed 0 'foo.out'>
>>>> Taskmaster: <up_to_date 0 'SConscript'>
>>>> Taskmaster: <up_to_date 0 'SConstruct'>
>>>> Taskmaster: Evaluating <pending 0 '.'>
>>>>
>>>> Task.make_ready_current(): node <pending 0 '.'>
>>>> Task.prepare(): node <executing 0 '.'>
>>>> Task.execute(): node <executing 0 '.'>
>>>> Task.executed_with_callbacks(): node <executing 0 '.'>
>>>> Task.postprocess(): node <executed 0 '.'>
>>>>
>>>> Taskmaster: Looking for a node to evaluate
>>>> Taskmaster: No candidate anymore.
>>>>
>>>> Any ideas on how to debug this further?
>>>>
>>>>>>>> Andrew
>>>>
>>>> _______________________________________________
>>>> Scons-users mailing list
>>>> Scons-users at scons.org
>>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>>>>
>>>
>>>
>>> _______________________________________________
>>> Scons-users mailing list
>>> Scons-users at scons.org
>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>>>
>>
>>
>> _______________________________________________
>> Scons-users mailing list
>> Scons-users at scons.org
>> https://pairlist4.pair.net/mailman/listinfo/scons-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20171203/8b3a3c0f/attachment-0001.html>
More information about the Scons-users
mailing list