[Scons-dev] env.subst and variable substitution including whitespace in parameters
Bill Deegan
bill at baddogconsulting.com
Mon Sep 17 14:07:36 EDT 2018
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 <scons-dev at scons.org>
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 at scons.org
> https://pairlist2.pair.net/mailman/listinfo/scons-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist2.pair.net/pipermail/scons-dev/attachments/20180917/9cdaef04/attachment.html>
More information about the Scons-dev
mailing list