Как установить disable duplicate = 0 для всех вариантов сборки SCons, не повторяя эту опцию несколько раз? - PullRequest
0 голосов

Я имею дело с проектом, в котором есть много вариантов директорий, созданных с помощью SConscript(variant_dir=).

Я хочу заставить scons прекратить копировать мои .c файлы в каталоги сборки.

Я знаю, что могу сделать это, если я передам duplicate=0 для каждого из этих вызовов, как описано в: https://scons.org/doc/2.4.1/HTML/scons-user.html#idp1378843980

Но есть ли более простой способ заставить duplicate=0 автоматически вступать в силу для всех вариантов dirs?

Например, в упрощенном примере:

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, который влияет на все варианты dir за один раз.

Еслитолько у меня был --duplicate none, я мог также установить его по умолчанию с SetOption из моего сценария, и все было бы хорошо.

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

1 Ответ

0 голосов
/ 09 февраля 2019

Вы можете сделать свою собственную среду унаследованной от среды 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)
...