[Scons-users] Builder
Neven Klacar
nklacar at gmail.com
Wed Nov 27 03:32:09 EST 2013
I was trying to leverage on another builder that someone made in my
environment to do some of the work.
Didn't realize its not supported .
Is there no way to trick it by creating fresh nodes for the target file so
it doesn't have associated sources ?
On Nov 26, 2013 11:11 PM, "Bill Deegan" <bill at baddogconsulting.com> wrote:
> Neven,
>
> Don't run another builder in a builder...
> You can have actions, but not builders inside a builder.
>
> -Bill
> Co-Manager, SCons project
>
>
> On Tue, Nov 26, 2013 at 9:54 PM, Neven Klacar <nklacar at gmail.com> wrote:
>
>> Hi ,
>>
>> I forgot to mention, I tried DIrk's recommendation and it still had the
>> same problem.
>> The recommendation was to pass a string object back to the builder.
>>
>> emitter
>> altered_targets=[]
>> for t in target:
>> fpath,fext=os.path.splitext(str(t))
>> altered_targets.append(fpath+'_altered.c')
>> return (altered_targets,source)
>>
>>
>> I did some more investigation and narrowed it down to problem when I
>> invoke another builder from my builder. In my example I didn't have exactly
>> what I was trying to do. I was invoking another builder from my builder.
>>
>> If I declare my builder like this lets say:
>> my_bld = env.Builder(action = SCons.Action.Action('cp $SOURCE $TARGET')
>> ,
>> source_scanner =
>> SCons.Scanner.C.CScanner(),
>> emitter = my_emitter,
>> suffix = '.c2', src_suffix = '.c')
>>
>> I don't have any problems. I can see it executes the cp and the target
>> file is created.
>>
>> If I however do this:
>> def my_builder(target, source, env)
>> env.Command(target,source, 'cp $SOURCE $TARGET')
>>
>> my_bld = env.Builder(action = SCons.Action.Action(my_builder)
>> ,
>> source_scanner =
>> SCons.Scanner.C.CScanner(),
>> emitter = my_emitter,
>> suffix = '.c2', src_suffix = '.c')
>>
>>
>> This is when I see the error message.
>>
>> I looked at BaseBuilder and I see it prints this in node_errors when it
>> detects the sources for a target node are different from the sources that
>> were passed to builder.
>> elif t.sources != slist: 314 msg<http://www.scons.org/doc/HTML/scons-api/SCons.Builder-pysrc.html#>
>> = "Multiple ways to build the same target were specified for: %s (from
>> %s and from %s)" % (t, list(map(str, t.sources)), list(map(str, slist)))
>> 315 raise UserError<http://www.scons.org/doc/HTML/scons-api/SCons.Builder-pysrc.html#>
>> (msg <http://www.scons.org/doc/HTML/scons-api/SCons.Builder-pysrc.html#>)
>>
>>
>> In the print out of the error message the sources are the same. This is
>> the string representation, so I am guessing they are two different file
>> nodes and this is where the comparison is failing? It is not clear to me
>> why they would be two different nodes for the source file? Is there a
>> custom comparison method for the nodes or is it just doing a regular object
>> comparison?
>>
>> Thanks,
>> Neven
>>
>> On Tue, Nov 26, 2013 at 8:13 PM, Bill Deegan <bill at baddogconsulting.com>wrote:
>>
>>> Neven,
>>>
>>> As Dirk mentioned in the email on the dev list the .name parameter
>>> should not be used for this (or in general for anything.. I've never used
>>> it and I've been using SCons a long time).
>>>
>>> What happens if your run : scons --tree=prune ?
>>>
>>> -Bill
>>>
>>>
>>> On Tue, Nov 26, 2013 at 6:56 PM, Neven Klacar <nklacar at gmail.com> wrote:
>>>
>>>> Hi, trying to make a builder that takes source file
>>>> a.c and creates a new C file, a_altered.c using a python script or
>>>> program that in this example will be preprocess lets say.
>>>>
>>>> Then I want to pass the altered file to be built in normal workflow
>>>>
>>>> newfile=MyBuilder("a.c")
>>>> object=env.Object(newFile)
>>>> env.Library(object)
>>>> ....
>>>>
>>>> In the builder I created a an emitter which modifies the target files
>>>> to have a different name.
>>>> *Builder*
>>>> def generate(env):
>>>> my_bld = env.Builder(action = 'preprocess< $SOURCE > $TARGET'
>>>> ,
>>>> source_scanner =
>>>> SCons.Scanner.C.CScanner(),
>>>> emitter = my_emitter,
>>>> suffix = '.c2', src_suffix = '.c')
>>>>
>>>> env.Append(BUILDERS = {'MyBuilder' : my_bld})
>>>>
>>>>
>>>>
>>>> def my_emitter(target, source, env):
>>>>
>>>> for t in target:
>>>>
>>>> t.name=t.name[:t.name.rfind('.')]+'_altered.c'
>>>>
>>>> return (target,source)
>>>>
>>>>
>>>>
>>>> The basic error I get is that there seems to be two ways to build the
>>>> same file
>>>>
>>>> .../project/build/objects/a_altered.c failed: Multiple ways to build
>>>> the same target were specified for: ...project/build/objects/a_altered
>>>> .c (from ['.../project/src/a.c'] and from ['.../project/src/a.c'])
>>>>
>>>>
>>>>
>>>> Am I going about this the right way?
>>>>
>>>>
>>>> I appreciate any help or suggestions!
>>>>
>>>>
>>>> Thanks,
>>>>
>>>> Neven
>>>>
>>>> _______________________________________________
>>>> Scons-users mailing list
>>>> Scons-users at scons.org
>>>> http://four.pairlist.net/mailman/listinfo/scons-users
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Scons-users mailing list
>>> Scons-users at scons.org
>>> http://four.pairlist.net/mailman/listinfo/scons-users
>>>
>>>
>>
>> _______________________________________________
>> Scons-users mailing list
>> Scons-users at scons.org
>> http://four.pairlist.net/mailman/listinfo/scons-users
>>
>>
>
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> http://four.pairlist.net/mailman/listinfo/scons-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://four.pairlist.net/pipermail/scons-users/attachments/20131127/cb45df58/attachment-0001.html
More information about the Scons-users
mailing list