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

2018-09-17 Thread Bill Deegan
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.

BTW. This is really a scons-users mailing list item and not a scons-dev.


On Mon, Sep 17, 2018 at 10:37 AM RW via Scons-dev 
wrote:

> Hi,
> 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.
> one approach to this might be
>
> ```
> cmdstr = '${CPP} -E ${CFLAGS} ${CCFLAGS} ${_CCCOMCOM} -'
> cmd = env.subst(cmdstr)
> ```
>
> However if any of the include directories include spaces then this doesn't
> work
> we end up with:
> ``
> arm-none-eabi-gcc -E -I. -ID:\Some Folder with whitespace\src -Ibuild -
> ```
> instead of:
> ``
> arm-none-eabi-gcc -E -I. "-ID:\Some Folder with whitespace\src" -Ibuild -
> ```
>
> It turns out the Action / CommandAction class has a way of dealing with
> this.
> the use of env.subst_list and the escape method burried in the
> SCons/Subst.py code
> Typically the function that puts quotes around strings contaning
> whitespace is quote_spaces within SCons/Subst.py
> If I follow the code back, this is called by CmdStringHolder which is only
> referenced within the ListSubber class
> which appears to be used by env.subst_list but not env.subst
>
> The end result after a bit of copying / pasting is the below
> I'm fairly sure this isn't using what's supposed to be public API's
>
> ```
> def generate(env):
> env.AddMethod(PreProcessStream, 'PreProcessStream')
>
>
> def PreProcessStream(env, stdin_str):
> 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
> ```
>
> After a bit googling for "env.subst_list" it looks like a few others have
> also used this method
> I also came across this
>
>   * https://github.com/SCons/scons/wiki/ProposalForImprovedSubstEngine
>
> So what I'm proposing here is that perhaps we need some public api way of
> handling this problem without diving into the scons internals
>
> Many Thanks
> Richard
> ___
> Scons-dev mailing list
> Scons-dev@scons.org
> https://pairlist2.pair.net/mailman/listinfo/scons-dev
>
___
Scons-dev mailing list
Scons-dev@scons.org
https://pairlist2.pair.net/mailman/listinfo/scons-dev


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

2018-09-17 Thread RW via Scons-dev
Hi,
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.
one approach to this might be

```
cmdstr = '${CPP} -E ${CFLAGS} ${CCFLAGS} ${_CCCOMCOM} -'
cmd = env.subst(cmdstr)
```

However if any of the include directories include spaces then this doesn't
work
we end up with:
``
arm-none-eabi-gcc -E -I. -ID:\Some Folder with whitespace\src -Ibuild -
```
instead of:
``
arm-none-eabi-gcc -E -I. "-ID:\Some Folder with whitespace\src" -Ibuild -
```

It turns out the Action / CommandAction class has a way of dealing with
this.
the use of env.subst_list and the escape method burried in the
SCons/Subst.py code
Typically the function that puts quotes around strings contaning whitespace
is quote_spaces within SCons/Subst.py
If I follow the code back, this is called by CmdStringHolder which is only
referenced within the ListSubber class
which appears to be used by env.subst_list but not env.subst

The end result after a bit of copying / pasting is the below
I'm fairly sure this isn't using what's supposed to be public API's

```
def generate(env):
env.AddMethod(PreProcessStream, 'PreProcessStream')


def PreProcessStream(env, stdin_str):
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
```

After a bit googling for "env.subst_list" it looks like a few others have
also used this method
I also came across this

  * https://github.com/SCons/scons/wiki/ProposalForImprovedSubstEngine

So what I'm proposing here is that perhaps we need some public api way of
handling this problem without diving into the scons internals

Many Thanks
Richard
___
Scons-dev mailing list
Scons-dev@scons.org
https://pairlist2.pair.net/mailman/listinfo/scons-dev