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

RW garlicbready at googlemail.com
Mon Sep 17 05:37:17 EDT 2018


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20180917/e22b1ccb/attachment.html>


More information about the Scons-users mailing list