我想添加一个仅影响编译器错误显示的变量,如下所示:
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是否允许这样做?如果是这样,怎么样?
答案 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文件。虽然这是一个非常糟糕的黑客攻击,但可能会在不同版本之间或更复杂的构建之间中断。
总而言之,你可以做你想要的,但是非常不明智。