[Scons-users] Is it possible to use Copy Action Functions outside of SConscript?

Pierre-Luc Boily pierreluc.boily at gmail.com
Fri Mar 16 12:34:58 EDT 2018


It is screwy I agree with you :)

We have two different version of open splice, one on windows and one on
linux.

When scons invoke
'idlpp -S -l cpp -d ' + variantDirOutput + ' $SOURCE'
on windows, there is no problem, it works

When scons invoke the same command on linux, I get the following error :
idlpp -S -l cpp -d build/debug/fwk/dds_model     fwk/dds_model/MaxSim.idl
"build/debug/fwk/dds_model/MaxSimDcps.idl", line 7: can't find include file
MaxSim.idl

As you can see the opensplice version of linux doesn't like the variantdir,
he is not aware of MaxSim.idl, located in src dir.  This is the reason why
I am trying to copy the source MaxSim.idl to the variant dir.

Now, this bring back the question of duplicate=0.  Yes, when I am calling
my SConscript, I am giving duplicate=0.  In this unique case, duplicate=1
should work I guess, but it is unfortunately not a solution in our current
architecture.  We have a top down approach where all SConscript are blindly
called from the SConstruct with duplicate=0 . SConstruct has no clues which
env is needed, he gives a class containing multiple env and  SConscript
takes the decision which env to take.   All decisional stuff are inside
SConscript

This serve us well so far.  We just migrated a project containing almost
600 make files.  That is the only case were duplicate=1 would be needed.
So, you have the full context of my screwy fix =)



On Fri, Mar 16, 2018 at 12:15 PM, Bill Deegan <bill at baddogconsulting.com>
wrote:

> This looks screwy to me..
>
>                     action = [Copy(os.path.join(env['LOCALROOT'],
> variantDirOutput, idlFile), idlFile),
>                               'idlpp -S -l cpp -d ' + variantDirOutput + '
> $SOURCE'])
>
> Why are you building up the target file path?
> Are you using duplicate=0?
>
> Looks like you're trying to copy the source file to the variant dir, and
> then calling idlpp on the source?
>
> Why did you want add Copy in the first place?
>
>
> On Fri, Mar 16, 2018 at 12:10 PM, Pierre-Luc Boily <
> pierreluc.boily at gmail.com> wrote:
>
>> Same error with env.Copy and Copy :\
>>
>> AttributeError: <class 'SCons.Node.FS.File'> object has no attribute
>> 'startswith':
>>   File "/svn/localroot/faa_mx/integ-scons/SConstruct", line 58:
>>     build()
>>   File "/svn/localroot/faa_mx/integ-scons/SConstruct", line 29:
>>     cache = not SConscript(str(script).strip(), exports='envService
>> vcxprojList', variant_dir=utils.createVariantDir(envService, script),
>> duplicate=0)
>>   File "/usr/local/lib/scons-2.5.1/SCons/Script/SConscript.py", line 604:
>>     return method(*args, **kw)
>>   File "/usr/local/lib/scons-2.5.1/SCons/Script/SConscript.py", line 541:
>>     return _SConscript(self.fs, *files, **subst_kw)
>>   File "/usr/local/lib/scons-2.5.1/SCons/Script/SConscript.py", line 250:
>>     exec _file_ in call_stack[-1].globals
>>   File "/svn/localroot/faa_mx/integ-scons/fwk/dds_model/dds_model.sc",
>> line 12:
>>     idlGeneratedHeaders = env.compile_idl_files()
>>   File "/svn/localroot/faa_mx/integ-scons/cm/scons/adacelBuilders/pseudoBuilders.py",
>> line 132:
>>     action = [Copy(os.path.join(env['LOCALROOT'], variantDirOutput,
>> idlFile), idlFile),
>>   File "/usr/local/lib/python2.7/posixpath.py", line 68:
>>     if b.startswith('/'):
>>   File "/usr/local/lib/scons-2.5.1/SCons/Node/FS.py", line 682:
>>     (self.__class__, attr))
>>
>> On Fri, Mar 16, 2018 at 12:05 PM, Bill Deegan <bill at baddogconsulting.com>
>> wrote:
>>
>>> Not env.Copy,  just Copy().
>>>
>>> On Fri, Mar 16, 2018 at 11:56 AM, Pierre-Luc Boily <
>>> pierreluc.boily at gmail.com> wrote:
>>>
>>>> I  shall read better the man page.  Thx.  Now I have this error below.
>>>> I thought that I might need to import SCons.Node, but no luck.
>>>>
>>>> AttributeError: <class 'SCons.Node.FS.File'> object has no attribute
>>>> 'startswith':
>>>>   File "/svn/localroot/faa_mx/integ-scons/SConstruct", line 58:
>>>>     build()
>>>>   File "/svn/localroot/faa_mx/integ-scons/SConstruct", line 29:
>>>>     cache = not SConscript(str(script).strip(), exports='envService
>>>> vcxprojList', variant_dir=utils.createVariantDir(envService, script),
>>>> duplicate=0)
>>>>   File "/usr/local/lib/scons-2.5.1/SCons/Script/SConscript.py", line
>>>> 604:
>>>>     return method(*args, **kw)
>>>>   File "/usr/local/lib/scons-2.5.1/SCons/Script/SConscript.py", line
>>>> 541:
>>>>     return _SConscript(self.fs, *files, **subst_kw)
>>>>   File "/usr/local/lib/scons-2.5.1/SCons/Script/SConscript.py", line
>>>> 250:
>>>>     exec _file_ in call_stack[-1].globals
>>>>   File "/svn/localroot/faa_mx/integ-scons/fwk/dds_model/dds_model.sc",
>>>> line 12:
>>>>     idlGeneratedHeaders = env.compile_idl_files()
>>>>   File "/svn/localroot/faa_mx/integ-scons/cm/scons/adacelBuilders/pseudoBuilders.py",
>>>> line 131:
>>>>     action = [env.Copy(env.File(os.path.join(env['LOCALROOT'],
>>>> variantDirOutput, idlFile)), idlFile),
>>>>   File "/usr/local/lib/python2.7/posixpath.py", line 68:
>>>>     if b.startswith('/'):
>>>>   File "/usr/local/lib/scons-2.5.1/SCons/Node/FS.py", line 682:
>>>>     (self.__class__, attr))
>>>>
>>>>
>>>> On Fri, Mar 16, 2018 at 11:21 AM, Bill Deegan <
>>>> bill at baddogconsulting.com> wrote:
>>>>
>>>>> From manpage:
>>>>>
>>>>> Builder methods that can be called without an explicit environment may
>>>>> be called from custom Python modules that you import into an SConscript
>>>>> file by adding the following to the Python module:
>>>>>
>>>>> from SCons.Script import *
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Mar 16, 2018 at 11:16 AM, Pierre-Luc Boily <
>>>>> pierreluc.boily at gmail.com> wrote:
>>>>>
>>>>>> But then I have : NameError: global name 'Copy' is not defined:
>>>>>>
>>>>>> And I can`t use env.Copy, because it refers to a deprecated function.
>>>>>>
>>>>>> I really think it is related with the fact that  def
>>>>>> compile_idl_files(env): function is outside of my SConscript.
>>>>>>
>>>>>> On Fri, Mar 16, 2018 at 11:13 AM, Bill Deegan <
>>>>>> bill at baddogconsulting.com> wrote:
>>>>>>
>>>>>>> get rid of env.Execute().. you're building a list of actions, just
>>>>>>> use Copy.
>>>>>>>
>>>>>>> Execute means do it right now.
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Mar 16, 2018 at 10:49 AM, Pierre-Luc Boily <
>>>>>>> pierreluc.boily at gmail.com> wrote:
>>>>>>>
>>>>>>>> No totally a builder, but like that :
>>>>>>>>
>>>>>>>> #In my SConscript :
>>>>>>>> idlGeneratedHeaders = env.compile_idl_files()
>>>>>>>>
>>>>>>>> #In my util file (I call those function pseudo-builder, they are
>>>>>>>> not really builder, but they actually call a builder.  In this case,
>>>>>>>> env.Command)
>>>>>>>> def compile_idl_files(env):
>>>>>>>>     """
>>>>>>>>     Compile all the IDL with DDS idlpp tool.
>>>>>>>>     returns the list of header files generated.
>>>>>>>>     """
>>>>>>>>     idlFiles = env.Glob('*.idl', exclude=['*Dcps.idl'])
>>>>>>>>     idlGeneratedHeaders = []
>>>>>>>>     variantDirOutput = str(env.Dir('.').path) #Where to generate .h
>>>>>>>> & .cpp from IDL
>>>>>>>>     for idlFile in idlFiles:
>>>>>>>>         tgtCpp, tgtH, ccpp = create_target_for_idl(env, idlFile)
>>>>>>>>         idlGeneratedHeaders += tgtH + ccpp
>>>>>>>>         env.Command(target = tgtCpp + tgtH + ccpp,
>>>>>>>>                     source = idlFile,
>>>>>>>>                     action = [env.Execute(Copy(os.path.join(env['LOCALROOT'],
>>>>>>>> variantDirOutput, idlFile), idlFile)),
>>>>>>>>                               'idlpp -S -l cpp -d ' +
>>>>>>>> variantDirOutput + ' $SOURCE'])
>>>>>>>>
>>>>>>>>     return idlGeneratedHeaders
>>>>>>>>
>>>>>>>> On Fri, Mar 16, 2018 at 10:30 AM, Bill Deegan <
>>>>>>>> bill at baddogconsulting.com> wrote:
>>>>>>>>
>>>>>>>>> So you want to use the Copy() action inside a builder?
>>>>>>>>>
>>>>>>>>> -Bill
>>>>>>>>>
>>>>>>>>> On Fri, Mar 16, 2018 at 9:34 AM, Pierre-Luc Boily <
>>>>>>>>> pierreluc.boily at gmail.com> wrote:
>>>>>>>>>
>>>>>>>>>> My SConscript contains the following code :
>>>>>>>>>>
>>>>>>>>>> Execute(Copy(os.path.join(env['LOCALROOT'],
>>>>>>>>>> str(env.Dir('.').path),
>>>>>>>>>> 'MaxSim.idl'), 'MaxSim.idl'))
>>>>>>>>>>
>>>>>>>>>> In order to make my SConscript cleaner, I wanted to move this
>>>>>>>>>> line into a
>>>>>>>>>> pseudo-builder, in an utility file.
>>>>>>>>>>
>>>>>>>>>> Then, when I am calling this line :
>>>>>>>>>> Execute(Copy(os.path.join(env['LOCALROOT'], variantDirOutput,
>>>>>>>>>> str(idlFile)),
>>>>>>>>>> str(idlFile)))
>>>>>>>>>>
>>>>>>>>>> from my utility function, I have error:
>>>>>>>>>> NameError: global name 'Execute' is not defined
>>>>>>>>>>
>>>>>>>>>> I understood that because I am outside of the SConscript context,
>>>>>>>>>> Execute is
>>>>>>>>>> not recognized anymore.  I then added my env, like that :
>>>>>>>>>> env.Execute(Copy(os.path.join(env['LOCALROOT'], variantDirOutput,
>>>>>>>>>> str(idlFile)), str(idlFile)))
>>>>>>>>>>
>>>>>>>>>> Now, Execute is recognized, but Copy is not.  If I try to add env
>>>>>>>>>> to the
>>>>>>>>>> Copy function (env.Copy()), I now have this error : warning: The
>>>>>>>>>> env.Copy()
>>>>>>>>>> method is deprecated;
>>>>>>>>>>
>>>>>>>>>> I understand the env.Copy() is depracated, but is it possible to
>>>>>>>>>> use Copy
>>>>>>>>>> action outside the SConscript the same way I did for env.Execute?
>>>>>>>>>>
>>>>>>>>>> Thx
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Sent from: http://scons.1086193.n5.nabble.com/Users-f16930.html
>>>>>>>>>> _______________________________________________
>>>>>>>>>> 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
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> 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
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> 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
>>
>>
>
> _______________________________________________
> 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/20180316/10831bd4/attachment-0001.html>


More information about the Scons-users mailing list