К сожалению, нет способа сделать это, используя основные функции SCons.Решение о том, сохранять или нет значение переменной , встроено в 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".