[Scons-users] Should PseudoBuilder's get access to OverrideEnvironment values if called via one
Gary Oberbrunner
garyo at oberbrunner.com
Fri Apr 26 10:34:53 EDT 2019
Not much, but they've been there since olden days. Check 1be774d48 from
Sept 2001:
diff --git a/src/scons/Environment.py b/src/scons/Environment.py
index da71ba1..9b050d1 100644
--- a/src/scons/Environment.py
+++ b/src/scons/Environment.py
@@ -62,8 +62,25 @@ class Environment:
import scons.Defaults
kw['BUILDERS'] = scons.Defaults.Builders[:]
self.Dictionary.update(copy.deepcopy(kw))
+
+ class BuilderWrapper:
+ """Wrapper class that allows an environment to
+ be associated with a Builder at instantiation.
+ """
+ def __init__(self, env, builder):
+ self.env = env
+ self.builder = builder
+
+ def __call__(self, target = None, source = None):
+ return self.builder(self.env, target, source)
+
+ def execute(self, **kw):
+ apply(self.builder.execute, (), kw)
+
...
On Fri, Apr 26, 2019 at 10:25 AM Bill Deegan <bill at baddogconsulting.com>
wrote:
> I'll go ahead and file a bug.
> Do you know any of the history of
>
> MethodWrapper/BuilderWrapper
>
> -Bill
>
> On Fri, Apr 26, 2019 at 10:21 AM Gary Oberbrunner <garyo at oberbrunner.com>
> wrote:
>
>> I agree with you -- it definitely should get the env it's called from no
>> matter if it's an OverrideEnvironment or a normal one.
>>
>> On Thu, Apr 25, 2019 at 10:14 PM Bill Deegan <bill at baddogconsulting.com>
>> wrote:
>>
>>> Indeed it shoud.
>>> repo updated.
>>> Here's fixed example:
>>>
>>> from SCons.Environment import OverrideEnvironment
>>>
>>> DefaultEnvironment(tools=[])
>>> env=Environment(BIN='mybin',LOCALBIN='localbin')
>>>
>>> def install_in_bin_dirs(env, source):
>>> """Install source in both bin dirs"""
>>> i1 = env.Install("$BIN", source)
>>> i2 = env.Install("$LOCALBIN", source)
>>> print("TEST_VAR=%s"%env['TEST_VAR'])
>>> return [i1[0], i2[0]] # Return a list, like a normal builder
>>>
>>> env.AddMethod(install_in_bin_dirs, "InstallInBinDirs")
>>>
>>> oenv=OverrideEnvironment(env,TEST_VAR='abc')
>>>
>>> oenv.InstallInBinDirs(env.Program('main.c')) # installs hello in both
>>> bin dirs
>>>
>>> print("Override id:%s"%id(oenv))
>>>
>>>
>>>
>>> And output:
>>> $ python ~/devel/scons/git/as_scons/src/script/scons.py --debug=explain
>>> scons: Reading SConscript files ...
>>> TypeError: __init__() got an unexpected keyword argument 'TEST_VAR':
>>> File
>>> "/Users/bdbaddog/devel/scons/bugs/Scons-psuedobuilder_no_override_access/SConstruct",
>>> line 15:
>>> oenv=OverrideEnvironment(env,TEST_VAR='abc')
>>>
>>>
>>>
>>> On Thu, Apr 25, 2019 at 6:39 PM Gary Oberbrunner <garyo at oberbrunner.com>
>>> wrote:
>>>
>>>> Sorry, I have a cold.
>>>> Still: oenv.InstallInBinDirs(...) ?
>>>>
>>>> --Gary
>>>>
>>>> On Thu, Apr 25, 2019, 6:37 PM Gary Oberbrunner <garyo at oberbrunner.com>
>>>> wrote:
>>>>
>>>>> Shouldn't that say oenv.install_in_bin_dir(...)?
>>>>>
>>>>> --Gary
>>>>>
>>>>> On Thu, Apr 25, 2019, 6:06 PM Bill Deegan <bill at baddogconsulting.com>
>>>>> wrote:
>>>>>
>>>>>> Currently they don't
>>>>>>
>>>>>> See sample git repo:
>>>>>>
>>>>>> https://github.com/bdbaddog/Scons-psuedobuilder_no_override_access/tree/master
>>>>>>
>>>>>> SConstruct:
>>>>>>
>>>>>> DefaultEnvironment(tools=[])
>>>>>> env=Environment(BIN='mybin',LOCALBIN='localbin')
>>>>>>
>>>>>> def install_in_bin_dirs(env, source):
>>>>>> """Install source in both bin dirs"""
>>>>>> i1 = env.Install("$BIN", source)
>>>>>> i2 = env.Install("$LOCALBIN", source)
>>>>>> print("TEST_VAR=%s"%env['TEST_VAR'])
>>>>>> return [i1[0], i2[0]] # Return a list, like a normal builder
>>>>>>
>>>>>> env.AddMethod(install_in_bin_dirs, "InstallInBinDirs")
>>>>>>
>>>>>> env.InstallInBinDirs(env.Program('main.c')) # installs hello in both bin dirs
>>>>>>
>>>>>> oenv=OverrideEnvironment(env,TEST_VAR='abc')
>>>>>> print("Override id:%s"%id(oenv))
>>>>>>
>>>>>>
>>>>>> Yields:
>>>>>> $ python ~/devel/scons/git/as_scons/src/script/scons.py
>>>>>> scons: Reading SConscript files ...
>>>>>> KeyError: 'TEST_VAR':
>>>>>> File "/Users/bdbaddog/devel/scons/bugs/Scons-psuedobuilder_no_override_access/SConstruct", line 13:
>>>>>> env.InstallInBinDirs(env.Program('main.c')) # installs hello in both bin dirs
>>>>>> File "/Users/bdbaddog/devel/scons/git/as_scons/src/script/../engine/SCons/Environment.py", line 224:
>>>>>> return self.method(*nargs, **kwargs)
>>>>>> File "/Users/bdbaddog/devel/scons/bugs/Scons-psuedobuilder_no_override_access/SConstruct", line 8:
>>>>>> print("TEST_VAR=%s"%env['TEST_VAR'])
>>>>>> File "/Users/bdbaddog/devel/scons/git/as_scons/src/script/../engine/SCons/Environment.py", line 410:
>>>>>> return self._dict[key]
>>>>>>
>>>>>> This is because PsuedoBuilder's are wrapped with the Environment() they are added to.
>>>>>>
>>>>>> Via MethodWrapper()
>>>>>>
>>>>>> Which caused a couple hours of debugging to find today..
>>>>>>
>>>>>> Unless someone can propose a reasonable reason it shouldn't I'll file a github issue.
>>>>>>
>>>>>> -Bill
>>>>>>
>>>>>> _______________________________________________
>>>>>> 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
>>>
>>
>>
>> --
>> Gary
>> _______________________________________________
>> 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
>
--
Gary
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20190426/ee8344a7/attachment.html>
More information about the Scons-users
mailing list