Сохранить все scons Переменные, а не только указанные (сохранить значения по умолчанию) - PullRequest
1 голос
/ 22 марта 2012

Как получить Variables.save для сохранения всех переменных, а не только той, которая указана пользователем.Я хочу убедиться, что будущие прогоны scons будут использовать точно такие же настройки.

1 Ответ

0 голосов
/ 25 марта 2012

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

...