[Scons-users] [Scons-dev] env.subst and variable substitution including whitespace in parameters

RW garlicbready at googlemail.com
Mon Sep 17 19:09:55 EDT 2018


I've put a bunch of examples here

https://github.com/grbd/Scons.EscapingExample

On Mon, 17 Sep 2018 at 20:12, Bill Deegan <bill at baddogconsulting.com> wrote:

> Really shouldn't need to run paths through subst to get the strings
> properly escaped (or quoted depending on the platform)..
>
> Can you create a small testcase demonstrating the problem, and I'll take a
> look at it in a few days when I'm back from vacation..
>
> On Mon, Sep 17, 2018 at 8:03 PM RW via Scons-users <scons-users at scons.org>
> wrote:
>
>> Sorry I'll keep any replies to the user list,
>> I'm basically piping in a string from python then capturing the output
>> and using the results in python
>> so I'm capturing stdin and stdout. PSPAWN might work thanks for the info
>>
>> I did also find another example where env.subst_list is useful
>> if you have a list of paths stored in an env variable, and those paths
>> contain spaces
>>
>> ```
>> env.Replace(Example1=['D:\\Temp\Test Folder 1\\src1.c'])
>> env.Append(Example1=['D:\\Temp\Test Folder 1\\src2.c'])
>> env.Append(Example1=['D:\\Temp\Test Folder 1\\src3.c'])
>>
>> env.Replace(Example2=['D:\\Temp\Test Folder 1\\src4.c'])
>> env.Append(Example2=['D:\\Temp\Test Folder 1\\src5.c'])
>> env.Append(Example2=['D:\\Temp\Test Folder 1\\src6.c'])
>>
>> env.Replace(SRCS='$Example1 $Example2')
>>
>> # This doesn't work due to spaces in path
>> #items = env.Split('$SRCS')
>>
>> # This results in a single string with unescaped paths
>> # making it difficult to split them apart or escape them
>> #items = env.subst('$SRCS')
>>
>> items = env.subst_list('$SRCS')[0]
>> for item in items:
>>     print(item)
>> ```
>>
>> this is why I was wondering if having env.subst_list as some form of
>> public api should be on the github issues / todo list
>> to give some context, this is what the Preprocess tool I've written looks
>> like so far
>>
>> ```
>> def generate(env):
>>     env.AddMethod(PreProcessStream, 'PreProcessStream')
>>
>>
>> def PreProcessStream(env, stdin_str):
>>     # Handle escaping / quoting variable expansion
>>     escape = env.get('ESCAPE', lambda x: x)
>>     escape_list = SCons.Subst.escape_list
>>
>>     cmdstr = '${CPP} -E ${CFLAGS} ${CCFLAGS} ${_CCCOMCOM} -'
>>     cmd_list = env.subst_list(cmdstr, SCons.Subst.SUBST_CMD)
>>
>>     cmd_list = escape_list(cmd_list[0], escape)
>>     cmd = ' '.join(cmd_list)
>>
>>     p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
>> stdin=subprocess.PIPE, stderr=subprocess.PIPE)
>>     out, err = p.communicate(input=stdin_str.encode())
>>     return out, err
>> ```
>>
>> Many Thanks
>> Richard
>>
>>
>> On Mon, 17 Sep 2018 at 19:47, Mats Wichmann <mats at wichmann.us> wrote:
>>
>>> On 09/17/2018 12:07 PM, Bill Deegan wrote:
>>> > Did you try having pipes in your action command string?
>>> > I'm thinking it should work..
>>> >
>>> > I wrote the wiki page you mentioned and it's a WIP.
>>>
>>> >> I'm wondering if this should be filed as a github issue
>>> >>
>>> >> Recently I ran into a problem, I needed to write a method to pipe some
>>> >> input into and out of gcc via the preprocessor
>>> >> this meant using subprocess instead of calling an scons Action since I
>>> >> wanted to do piping, but to do that I needed to expand outwards the
>>> gcc /
>>> >> cpppath etc into a string.
>>>
>>> there is some mechanism for piping in a command, see the PSPAWN
>>> construction environment variable.
>>> _______________________________________________
>>> 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/20180918/8740b259/attachment.html>


More information about the Scons-users mailing list