如何使SCons可选地忽略自定义构建器的依赖关系?

时间:2013-11-05 00:40:07

标签: dependencies scons

这是我项目的依赖结构:

有一个文件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.

如果没有F,SCons会如何接受A,B和C作为起始来源?目前,如果我将A,B和C复制到一个不包含F的新目录中,它会尝试重建它们。

我查看了手册部分6.7. Ignoring Dependencies: the Ignore Function,但我看不到如何将其应用到我的代码中。

2 个答案:

答案 0 :(得分:4)

您可以在SCons man pages中找到有关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中处理命令行选项有几种不同的方法,here是一个概述:

最简单的方法是this,这样您就可以执行以下操作:

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

命令行看起来像这样:

#scons includeF=1

答案 1 :(得分: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 = {...})