How to set duplicate=0 for all SCons build variants without repeating the option multiple times on each SConscript call?

I am dealing with a project that has many variant dirs created with SConscript(variant_dir=).

I want to make scons stop soft linking/hard linking/copying my .c files into the build directories.

I know that I can do that if I pass duplicate=0 for each of those calls as documented at: https://scons.org/doc/2.4.1/HTML/scons-user.html#idp1378843980

But is there an easier way to make duplicate=0 automatically take effect for all variant dirs?

For example, in a simplified example:

env = Environment()
objects = [env.Object('main.c')]
build_dir = 'build'
objects.extend(env.SConscript(
    os.path.join('lib', 'SConscript'),
    variant_dir=os.path.join(build_dir, 'lib'),
))
objects.extend(env.SConscript(
    os.path.join('lib2', 'SConscript'),
    variant_dir=os.path.join(build_dir, 'lib2'),
))
env.Program('main.out', objects)

I would like to do something like:

env = Environment(duplicate=0)

I would not however like to pass it as a variable everywhere, since people will likely forget to pass it sooner or later:

env = Environment()
objects = [env.Object('main.c')]
build_dir = 'build'
duplicate = 0
objects.extend(env.SConscript(
    os.path.join('lib', 'SConscript'),
    variant_dir=os.path.join(build_dir, 'lib'),
    duplicate=duplicate
))
objects.extend(env.SConscript(
    os.path.join('lib2', 'SConscript'),
    variant_dir=os.path.join(build_dir, 'lib2'),
    duplicate=duplicate
))
env.Program('main.out', objects)

This would be analogous to --duplicate soft-copy, which affects all variant dirs in one go.

If only I had a --duplicate none I could also set it by default with SetOption from my script and all would be fine.

https://pairlist4.pair.net/pipermail/scons-users/2018-December/007474.html

Upvotes: 3

Views: 297

Answers (1)

dmoody256
dmoody256

Reputation: 583

You could make your own environment inherited from the SCons environment, override the desired functions and alias it in to your SCons files. For example:

# MyEnvironment.py
import SCons
import SCons.Script.SConscript

class MyEnvironment(SCons.Environment.Environment):

    def VariantDir(self, variant_dir, src_dir, duplicate=0):
        print("Using my environment")
        super(MyEnvironment, self).VariantDir(variant_dir, src_dir, self.get('duplicate', duplicate))

    def _get_SConscript_filenames(self, ls, kw):
        print("Using my environment sconscript")
        kw['duplicate'] = self.get('duplicate', 0)
        return super(MyEnvironment, self)._get_SConscript_filenames(ls, kw)

Now in your SConstruct you import your custom class and alias the class as SCons Environment class:

from MyEnvironment import MyEnvironment as Environment
env = Environment(duplicate=0)
objects = [env.Object('main.c')]
build_dir = 'build'
objects.extend(env.SConscript(
    os.path.join('lib', 'SConscript'),
    variant_dir=os.path.join(build_dir, 'lib'),
))
objects.extend(env.SConscript(
    os.path.join('lib2', 'SConscript'),
    variant_dir=os.path.join(build_dir, 'lib2'),
))
env.Program('main.out', objects)

Upvotes: 1

Related Questions