1

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

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

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

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

4

1 回答 1

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 文件。不过,这是一个非常糟糕的 hack,并且可能会在不同版本之间或更复杂的构建之间中断。

因此,总而言之,可以按照您的要求进行操作,但非常不明智。

于 2013-03-11T03:09:49.257 回答