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@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@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