3

这是我的项目的依赖结构:

有一个文件 F,从中派生出文件 A、B 和 C。项目中的其他一切最终都依赖于 A、B 或 C。

A、B 和 C 是使用这样的自定义 Builder 构建的:

ABCbuilder = Builder(action = build_abc)
env = Environment(BUILDERS = {'abc' : ABCbuilder,...}
env.abc([A,B,C],[F])

问题是 F 很笨拙,我想选择不将它包含在分发中,而只包含 A、B 和 C。

如果它们在没有 F 的情况下存在,我怎样才能使 SCons 接受 A、B 和 C 作为起始源?目前,如果我将 A、B 和 C 复制到不包含 F 的新目录中,它会尝试重建它们。

我看过手册第6.7 节。Ignoring Dependencies: Ignore Function,但我不知道如何将它应用到我的代码中。

4

2 回答 2

4

您可以在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 中有几种不同的方式来处理命令行选项,这里是一个概述:

最简单的方法是this,这将允许您执行以下操作:

useF = ARGUMENTS.get('includeF', 0)
if not int(useF):
    Ignore(aTarget, F)
    Ignore(bTarget, F)
    Ignore(cTarget, F)

命令行看起来像这样:

#scons includeF=1
于 2013-11-05T16:08:13.330 回答
0

好吧,我想到了一个解决方法。我创建了一个命令行变量,用于确定构建是否植根于 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 = {...})
于 2013-11-05T13:20:50.070 回答