[Scons-users] Compact notation

Brian Cody brian.j.cody at gmail.com
Sun Dec 11 11:27:06 EST 2016


Hey Andrew,

For your first issue, does this work:

env.Library(
    target="foo",
    source=[
        'source1.cpp',
        'source2.cpp',
        'source_windows.cpp' if windows else [],
    ],
    LIBS=[
        'lib1',
        'lib2',
        'lib_windows' if windows else [],
    ]
)

I think it will automatically flatten the lists internally.

On Sun, Dec 11, 2016 at 10:55 AM, Andrew C. Morrow <
andrew.c.morrow at gmail.com> wrote:

>
> Over the past few years, I've encountered a few things that seem to lead
> to more-verbose-than-needed python code when writing SConscripts, leading
> to a less declarative feel. I've recently been thinking about how I would
> want to write these things better. Perhaps others have encountered these
> same issues and have found solutions?
>
> 1) Conditionally including a file or library:
>
> If I have a library that may or may not include a particular file (say,
> based on if the target platform is windows), I generally need to pull the
> list of sources out, and then conditionally append:
>
> fooSources=[
>     'source1.cpp',
>     'source2.cpp',
> ]
>
> fooLibs=[
>     'lib1',
>     'lib2,
> ]
>
> if windows:
>    fooSources.append('source_windows.cpp')
>    fooLibs.append('lib_windows')
>
> env.Library(
>     target='foo',
>     source=fooSources
>     LIBS=fooLibs
> )
>
> It would be nicer to write:
>
> env.Library(
>     target="foo",
>     source=[
>         'source1.cpp',
>         'source2.cpp',
>         'source_windows.cpp' if windows else None,
>     ],
>     LIBS=[
>         'lib1',
>         'lib2',
>         'lib_windows' if windows else None,
>     ]
> )
>
> But SCons seems to reject this:
>
> AttributeError: 'NoneType' object has no attribute 'name':
>
> Would it be a reasonable enhancement request that the various built-in
> builders filter incoming lists for None? Is there another way to achieve
> this? I could obviously attach filter each expression for None at the point
> of its declaration, but that seems verbose.
>
> It doesn't come up often, but it would be nice.
>
>
> 2) Inline manipulation of Environment variables.
>
> I can easily override an Env var when declaring a target:
>
> // Happens far away
> env.Append(CPPDEFINES="whatever")
>
> env.Library(
>     target="foo",
>     source=...
>     CPPDEFINES=["applies"]
> )
>
> This will build with -Dapplies, overriding "whatever" in CPPDEFINES for
> the sources in this target. But what if I want to Append or Prepend
> (Unique), instead of override? There doesn't seem to be a compact syntax
> for that. I need to write:
>
> // Happens far away
> env.Append(CPPDEFINES=["whatever"])
>
> env = env.Clone()
> env.AppendUnique(CPPDEFINES=["applies"])
> env.Library(
>     target="foo",
>     source=...
> )
>
> Now I get both -Dwhatever and -Dapplies for the sources.
>
> But what I'd really like to write is:
>
>
> // Happens far away
> env.Append(CPPDEFINES=["whatever"])
>
> env.Library(
>     target="foo",
>     source=...
>     CPPDEFINES=UniqueAppender(["applies"]),
> )
>
> Where UniqueAppender is a mutator that causes the effects of
> env.AppendUnique(arg) to be applied to the local Environment for the target.
>
> Is there any existing mechanism to achieve this? If not, is it possible?
> Reasonable? Other suggestions for how to do this?
>
> Combining the two techniques:
>
> Old:
>
> fooSources=[
>     'source1.cpp',
>     'source2.cpp',
> ]
>
> fooLibs=[
>     'lib1',
>     'lib2,
> ]
>
> if windows:
>    fooSources.append('source_windows.cpp')
>    fooLibs.append('lib_windows')
>
> env = env.Clone()
> env.AppendUnique(CPPDEFINES=["applies"])
> env.Library(
>     target='foo',
>     source=fooSources
>     LIBS=fooLibs
> )
>
> New (and making the 'applies' conditional as well, just for fun):
>
>
> env.Library(
>     target="foo",
>     source=[
>         'source1.cpp',
>         'source2.cpp',
>         'source_windows.cpp' if windows else None,
>     ],
>     CPPDEFINES=UniqueAppender([
>         "applies" if windows else None,
>     ]),
>     LIBS=[
>         'lib1',
>         'lib2',
>         'lib_windows' if windows else None,
>     ]
> )
>
> I think these two features would go a long way towards making complex
> SConscripts more declarative.
>
> Thoughts? Suggestions? Ways I can do this now with SCons that I'm missing?
>
> Thanks,
> Andrew
>
>
>
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> https://pairlist4.pair.net/mailman/listinfo/scons-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20161211/16b8f306/attachment-0001.html>


More information about the Scons-users mailing list