如何为所有SCons构建变体设置禁用重复= 0,而无需多次重复该选项?

时间:2018-12-06 17:30:00

标签: scons

我正在处理一个项目,该项目具有许多由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

1 个答案:

答案 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)