Avoid rescanning site-local.py

This commit is contained in:
Kp 2013-10-26 18:13:28 +00:00
parent a701acce42
commit e4834184f0

View file

@ -349,31 +349,32 @@ class DXXCommon(LazyObjectConstructor):
return [('%s_%s' % (p, name)) for p in prefix if p] return [('%s_%s' % (p, name)) for p in prefix if p]
def __init__(self,program=None): def __init__(self,program=None):
self._program = program self._program = program
def init(self,prefix,variables): def register_variables(self,prefix,variables):
filtered_help = FilterHelpText() self.known_variables = []
variables.FormatVariableHelpText = filtered_help.FormatVariableHelpText
for grp in self._options(): for grp in self._options():
variable = grp['variable'] variable = grp['variable']
for opt in grp['arguments']: for opt in grp['arguments']:
(name,value,help) = opt[0:3] (name,value,help) = opt[0:3]
kwargs = opt[3] if len(opt) > 3 else {} kwargs = opt[3] if len(opt) > 3 else {}
if callable(value):
value = value()
names = self._names(name, prefix) names = self._names(name, prefix)
for n in names: for n in names:
if n not in variables.keys(): if n not in variables.keys():
variables.Add(variable(key=n, help=help, default=None, **kwargs)) variables.Add(variable(key=n, help=help, default=None, **kwargs))
filtered_help.visible_arguments.append(name) if name not in variables.keys():
variables.Add(variable(key=name, help=help, default=value, **kwargs)) filtered_help.visible_arguments.append(name)
d = SCons.Environment.SubstitutionEnvironment() variables.Add(variable(key=name, help=help, default=None if callable(value) else value, **kwargs))
variables.Update(d) self.known_variables.append((names + [name], value))
for n in names + [name]: def read_variables(self,variables,d):
try: for (namelist,value) in self.known_variables:
value = d[n] for n in namelist:
break try:
except KeyError as e: value = d[n]
pass break
setattr(self, name, value) except KeyError as e:
pass
if callable(value):
value = value()
setattr(self, namelist[-1], value)
if self.builddir != '' and self.builddir[-1:] != '/': if self.builddir != '' and self.builddir[-1:] != '/':
self.builddir += '/' self.builddir += '/'
def clone(self): def clone(self):
@ -961,13 +962,16 @@ class DXXProgram(DXXCommon):
if (self.user_settings.use_udp == 1): if (self.user_settings.use_udp == 1):
objects_common = objects_common + self.objects_use_udp objects_common = objects_common + self.objects_use_udp
return objects_common + self.platform_settings.platform_objects return objects_common + self.platform_settings.platform_objects
def __init__(self,prefix): def __init__(self,prefix,variables):
self.variables = Variables('site-local.py', ARGUMENTS) self.variables = variables
self._argument_prefix_list = prefix self._argument_prefix_list = prefix
DXXCommon.__init__(self) DXXCommon.__init__(self)
self.banner() self.banner()
self.user_settings = self.UserSettings(program=self) self.user_settings = self.UserSettings(program=self)
self.user_settings.init(prefix=prefix, variables=self.variables) self.user_settings.register_variables(prefix=prefix, variables=self.variables)
def init(self,substenv):
self.user_settings.read_variables(self.variables, substenv)
if not DXXProgram.static_archive_construction.has_key(self.user_settings.builddir): if not DXXProgram.static_archive_construction.has_key(self.user_settings.builddir):
DXXProgram.static_archive_construction[self.user_settings.builddir] = DXXArchive(self.user_settings) DXXProgram.static_archive_construction[self.user_settings.builddir] = DXXArchive(self.user_settings)
self.check_platform() self.check_platform()
@ -1188,6 +1192,9 @@ class D2XProgram(DXXProgram):
def register_program(self): def register_program(self):
self._register_program('d2x') self._register_program('d2x')
variables = Variables(['site-local.py'], ARGUMENTS)
filtered_help = FilterHelpText()
variables.FormatVariableHelpText = filtered_help.FormatVariableHelpText
def register_program(s,program): def register_program(s,program):
import itertools import itertools
l = [v for (k,v) in ARGLIST if k == s] or [1] l = [v for (k,v) in ARGLIST if k == s] or [1]
@ -1195,7 +1202,7 @@ def register_program(s,program):
if len(l) == 1: if len(l) == 1:
try: try:
if int(l[0]): if int(l[0]):
return [program((s,))] return [program((s,), variables)]
return [] return []
except ValueError: except ValueError:
# If not an integer, treat this as a configuration profile. # If not an integer, treat this as a configuration profile.
@ -1203,7 +1210,7 @@ def register_program(s,program):
r = [] r = []
for e in l: for e in l:
for prefix in itertools.product(*[v.split('+') for v in e.split(',')]): for prefix in itertools.product(*[v.split('+') for v in e.split(',')]):
r.append(program(prefix)) r.append(program(prefix, variables))
return r return r
d1x = register_program('d1x', D1XProgram) d1x = register_program('d1x', D1XProgram)
d2x = register_program('d2x', D2XProgram) d2x = register_program('d2x', D2XProgram)
@ -1221,7 +1228,10 @@ h = 'DXX-Rebirth, SConstruct file help:' + """
d2x=[0/1] Disable/enable D2X-Rebirth d2x=[0/1] Disable/enable D2X-Rebirth
d2x=prefix-list Enable D2X-Rebirth with prefix-list modifiers d2x=prefix-list Enable D2X-Rebirth with prefix-list modifiers
""" """
substenv = SCons.Environment.SubstitutionEnvironment()
variables.Update(substenv)
for d in d1x + d2x: for d in d1x + d2x:
d.init(substenv)
h += d.PROGRAM_NAME + ('.%d:\n' % d.program_instance) + d.GenerateHelpText() h += d.PROGRAM_NAME + ('.%d:\n' % d.program_instance) + d.GenerateHelpText()
Help(h) Help(h)