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

Bill Deegan <[email protected]>
Newsgroups gmane.comp.programming.tools.scons.user
Message-ID <CAEyG4CFZ0Vf9B=3bcocvLA79sa7jCDFve74Ok-=HfDCkU7UJCQ@mail.gmail.com>
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 <[email protected]>
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
> [email protected]
> https://pairlist2.pair.net/mailman/listinfo/scons-dev
>

_______________________________________________
Scons-users mailing list
[email protected]
https://pairlist4.pair.net/mailman/listinfo/scons-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.