[Scons-users] Is it possible to use Copy Action Functions outside of SConscript?
Pierre-Luc Boily
pierreluc.boily at gmail.com
Fri Mar 16 14:09:08 EDT 2018
Bill, for your previous question regarding -d, this argument tells to idlpp
where to generate the files. I am telling to idlpp to generate the output
from MaxSim.idl into variant dir. So what happen is, a file is being
generated there :
build/debug/dds/MaxSimDcps.idl
And this generated file include MaxSim.idl. idlpp compilator complains
that he cannot find MaxSim.idl in the src dir. This is why I want to copy
it to variant dir.
On Fri, Mar 16, 2018 at 2:04 PM, Bill Deegan <bill at baddogconsulting.com>
wrote:
> See comment below.
> Regardless, I think the solution for Pierre-Luc using Copy is not the
> right direction..
>
> On Fri, Mar 16, 2018 at 1:43 PM, Matthew Marinets <
> Matthew.Marinets at kardium.com> wrote:
>
>> I got it working in a minimal case, maybe you could take a look at what I
>> did:
>>
>>
>>
>> SConstruct:
>>
>>
>>
>>
>> env = Environment()
>>
>> from ExtraModule import generate
>>
>> generate( env )
>>
>> src = Dir( 'src' )
>> build = Dir( 'build' )
>>
>> env.CustomCopy( target = build.File( 'someFile.txt' ),
>> source = src.File( 'someFile.txt' ) )
>>
>>
>>
>> ExtraModule.py:
>>
>>
>>
>> from SCons.Defaults import Copy
>> import SCons.Builder
>>
>> def customAction( target, source, env, for_signature ):
>> return [Copy( str(target[0]), str(source[0]) )]
>>
>
> ^^^ - Why are you converting to string? Nodes should be fine.
>
>
>
>>
>> def generate( env ):
>> customActionBuilder = SCons.Builder.Builder( generator = customAction
>> )
>> env.Append( BUILDERS = {'CustomCopy': customActionBuilder} )
>>
>>
>>
>> obviously, there’s a file called “someFile.txt” in the src directory.
>> Again, I’m using SCons 3.0.0, Python 2.7
>>
>>
>>
>> -Matthew
>>
>>
>>
>>
>>
>> *From:* Scons-users [mailto:scons-users-bounces at scons.org] *On Behalf Of
>> *Bill Deegan
>> *Sent:* March 16, 2018 10:35
>>
>> *To:* SCons users mailing list <scons-users at scons.org>
>> *Subject:* Re: [Scons-users] Is it possible to use Copy Action Functions
>> outside of SConscript?
>>
>>
>>
>> what does the -d argument do?
>>
>> -Bill
>>
>>
>>
>> On Fri, Mar 16, 2018 at 1:21 PM, Pierre-Luc Boily <
>> pierreluc.boily at gmail.com> wrote:
>>
>> I tried both solutions but still no luck. It appears that scons does not
>> like the Copy inside the Command builder :
>>
>>
>>
>> env.Command(target = tgtCpp + tgtH + ccpp,
>>
>> source = idlFile,
>>
>> action = [Copy(os.path.join(env['LOCALROOT'],
>> variantDirOutput, idlFile), idlFile),
>>
>> 'idlpp -S -l cpp -d ' + variantDirOutput +
>> ' $SOURCE'])
>>
>>
>>
>> I am am calling directly
>>
>>
>>
>> Copy(os.path.join(env['LOCALROOT'], str(env.Dir('.').path),
>> 'MaxSim.idl'), Glob('*.idl')[0])
>>
>>
>>
>> scons is OK
>>
>>
>>
>> On Fri, Mar 16, 2018 at 12:40 PM, Matthew Marinets <
>> Matthew.Marinets at kardium.com> wrote:
>>
>> The SCons Copy() action factory is in SCons/Defaults.py, defined on line
>> 272. I think you just need to import it from there.
>>
>>
>>
>> (make sure SCons-3.0.0 is in your PYTHONPATH)
>>
>> From SCons.Defaults import Copy
>>
>>
>>
>> And you should be able to use it.
>>
>>
>>
>> If that doesn’t work, try importing the copy_func function from the same
>> place and building Copy() from it, just copy-paste the four lines starting
>> from ln. 272 of Defaults.py into the top of your module
>>
>>
>>
>> I’m using SCons 3.0.0 (if the directory didn’t make it obvious), but the
>> solution should be similar in other versions.
>>
>>
>>
>> Hope this helps
>>
>>
>>
>> -Matthew
>>
>>
>>
>> *From:* Scons-users [mailto:scons-users-bounces at scons.org] *On Behalf Of
>> *Pierre-Luc Boily
>> *Sent:* March 16, 2018 09:35
>> *To:* SCons users mailing list <scons-users at scons.org>
>> *Subject:* Re: [Scons-users] Is it possible to use Copy Action Functions
>> outside of SConscript?
>>
>>
>>
>> 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
>>
>>
>>
>>
>> _______________________________________________
>> 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/7f68eec7/attachment-0001.html>
More information about the Scons-users
mailing list