保存所有scons变量不仅仅是指定的变量(保存默认值)

时间:2012-03-22 15:20:54

标签: scons

如何让Variables.save保存所有变量,而不仅仅是用户指定的变量。我想确保未来的scons运行使用完全相同的设置。

1 个答案:

答案 0 :(得分:0)

遗憾的是,使用核心SCons功能无法做到这一点。是否保存变量值的决定is hard-wired into Save,只能保存不是默认值的值。

但是,您可以通过滥用未记录的“转换器”功能来保存所有变量。它并不漂亮,但能完成这项工作。

当你调用Variables.Save()时,它调用每个变量的转换器函数并检查结果以查看它是否与默认(输入)值相同。如果从Save调用时返回的值不是输入值,则所有值都存储在缓存文件中。在其他地方,您需要转换器按原样返回输入值,否则它将使用不正确的变量值。

def save_all(value, env=None):
    import traceback
    # if called in Save method, return non-default
    for line in traceback.format_stack():
        lines = line.splitlines()
        if lines[0].endswith('Save'):
            return value + 'save'
    # return correct value otherwise
    return value

import SCons
var = Variables("config.py", ARGUMENTS)

# AddVariables accepts tuples of:
# Variable key, description, default-value, validator, converter
var.AddVariables(
    ('CC', 'The C Compiler', 'cc', None, save_all),
    ('CFLAGS', 'Flags to pass to compiler', '-Wall', None, save_all))

env = Environment(tools=[], variables=var)
var.Save('config.py', env)

print 'CC', env['CC']
print 'CFLAGS', env['CFLAGS']

这里函数save_all是黑客。它使用堆栈跟踪来检查是否从Save中调用它。如果是,则返回篡改值,否则返回输入值不变。您可以在缓存文件“config.py”中检查此示例的结果。