2012-03-22 3 views

답변

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"에서이 예제의 결과를 확인할 수 있습니다.