这是我项目的依赖结构:
有一个文件 F,文件 A、B 和 C 是从该文件派生的。 项目中的其他所有内容最终都取决于 A、B 或 C。
A、B 和 C 是使用自定义生成器构建的,如下所示:
ABCbuilder = Builder(action = build_abc)
env = Environment(BUILDERS = {'abc' : ABCbuilder,...}
env.abc([A,B,C],[F])
问题是 F 很笨拙,我希望可以选择不将其包含在发行版中,而只包含 A、B 和 C。
我怎样才能使 SCons 接受 A、B 和 C 作为起始源,如果它们在没有 F 的情况下存在? 目前,如果我将 A、B 和 C 复制到不包含 F 的新目录中,它会尝试重建它们。
我已经查看了手册第 6.7 节。忽略依赖项:忽略函数,但我看不到如何将其应用于我的代码。
您可以在 SCons 手册页中找到有关 Ignore() 函数的更多详细信息。以下是根据手册页的签名:
Ignore(target, dependency)
env.Ignore(target, dependency)
您应该能够执行以下操作:
# assuming aTarget, bTarget, cTarget, and F are set accordingly
Ignore(aTarget, F)
Ignore(bTarget, F)
Ignore(cTarget, F)
有几种不同的方法可以在 SCons 中处理命令行选项,以下是概述:
最简单的方法是这样,这将允许您执行以下操作:
useF = ARGUMENTS.get('includeF', 0)
if not int(useF):
Ignore(aTarget, F)
Ignore(bTarget, F)
Ignore(cTarget, F)
命令行看起来像这样:
#scons includeF=1
好吧,我想到了一个解决方法。我创建了一个命令行变量,用于确定构建是否植根于 F。似乎可能有一种"SCons"方法可以做到这一点,但我错过了,但我认为这很好。
do_abc = False
for key, value in ARGLIST:
if key == "do_abc":
do_abc = bool(value)
if do_abc:
ABCbuilder = Builder(action = build_abc)
env = Environment(BUILDERS = {'abc' : ABCbuilder,...}
env.abc([A,B,C],[F])
else:
env = Environment(BUILDERS = {...})