我可以在SConstruct中添加一个与“构建标识”无关的变量吗?

时间:2013-03-09 16:15:34

标签: scons

我想添加一个仅影响编译器错误显示的变量,如下所示:

vars = Variables()
vars.Add(BoolVariable('fatal', 'Stop on first error', True))
# ...
if env['fatal']:
    env.MergeFlags(['-Wfatal-errors'])

但是,如果我运行scons fatal=yes后跟scons fatal=no,我会得到一个完整的重建,而没有理由,因为这个标志对于已编译的目标文件无关紧要。 / p>

SCons是否允许这样做?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:3)

SCons并不真正允许您想要做的事情。必须构建的每个节点都有一个与之关联的命令行操作。存储命令行字符串的MD5校验和,如果这些校验和发生更改,则会触发重建。如果更改警告标志,则构建目标文件的命令行会更改,即使生成的目标文件相同也是如此。

如果你真的有决心,总会有一种方法来破解它。例如,你冷却改变在SCons中计算MD5总和的方式。作为一个概念证明,我在考虑重建时让SCons忽略了-Wall标志。这是通过将以下代码放在SConstruct文件的顶部来更改报告与操作关联的命令行的方法来完成的。

import SCons
import types
SCons.Action.ActionBase.get_contents_orig = SCons.Action.ActionBase.get_contents
def get_contents(self, *args, **kw):
    norebuild = ("-Wall",)
    cnt = self.get_contents_orig(*args, **kw).split()
    cnt_norebuild = " ".join(i for i in cnt if i not in norebuild)
    return cnt_norebuild
SCons.Action.ActionBase.get_contents = types.MethodType(
        get_contents, None, SCons.Action.ActionBase)

这对我来说非常简单,只有一个非常简单的SConstruct文件。虽然这是一个非常糟糕的黑客攻击,但可能会在不同版本之间或更复杂的构建之间中断。

总而言之,你可以做你想要的,但是非常不明智。