gpt4 book ai didi

scons - 如何为所有 SCons 构建变体设置重复=0,而无需在每个 SConscript 调用上多次重复该选项?

转载 作者:行者123 更新时间:2023-12-02 15:09:40 26 4
gpt4 key购买 nike

我正在处理一个项目,该项目有许多使用 SConscript(variant_dir=) 创建的变体目录。

我想让 scons 停止软链接(soft link)/硬链接(hard link)/将我的 .c 文件复制到构建目录中。

我知道,如果我为每个调用传递 duplicate=0 ,我就可以做到这一点,如:https://scons.org/doc/2.4.1/HTML/scons-user.html#idp1378843980 中所述。

但是有没有更简单的方法让 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,它一次性影响所有变体目录。

如果我有一个--duplicate none,我也可以在我的脚本中使用SetOption默认设置它,一切都会好起来的。

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

最佳答案

您可以使您自己的环境继承自 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 环境类:

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)

关于scons - 如何为所有 SCons 构建变体设置重复=0,而无需在每个 SConscript 调用上多次重复该选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53656787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com