我正在处理一个项目,该项目具有许多由SConscript(variant_dir=)
创建的变体目录。
我想让scons
停止将我的.c
文件复制到构建目录中。
我知道,如果我为https://scons.org/doc/2.4.1/HTML/scons-user.html#idp1378843980
中记录的每个电话传递duplicate=0
,我就能做到
但是,有没有更简单的方法使duplicate=0
对所有变体目录自动生效?
例如,在一个简化的示例中:
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)
我想做类似的事情:
env = Environment(duplicate=0)
但是我不想在任何地方将其作为变量传递,因为人们可能会忘记早晚传递它:
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)
这类似于--duplicate soft-copy
,它一口气影响所有变种dirs。
如果只有一个--duplicate none
,我也可以通过脚本中的SetOption
对其进行默认设置,一切都会很好。
https://pairlist4.pair.net/pipermail/scons-users/2018-December/007474.html
答案 0 :(得分:0)
您可以使您自己的环境继承自SCons环境,覆盖所需的功能并将其作为您的SCons文件的别名。例如:
# 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)
现在,在SConstruct中,导入自定义类并将该类别名为SCons Environment类:
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)