Reputation: 382822
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
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