env.subst and variable substitution including whitespace in parameters

RW via Scons-dev <[email protected]>
Newsgroups gmane.comp.programming.tools.scons.devel
Message-ID <CAMMCZ5Md6rZwNUh_sNuMH-KsLxwBn4MyXW3eP=aP-V6mj-n8tQ@mail.gmail.com>
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
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.