Support multiple read maps.

A build could require more than one map to be active at once. This
change allows more than one map to be set. An example is gcc and
newlib. Having separate maps allows a user to control which part
they test.
This commit is contained in:
Chris Johns 2013-04-20 21:42:39 +10:00
parent b0c2756190
commit fd5042a1c4

View File

@ -56,11 +56,11 @@ class macros:
self.macro_filter = re.compile(r'%{[^}]+}') self.macro_filter = re.compile(r'%{[^}]+}')
if original is None: if original is None:
self.macros = {} self.macros = {}
self.read_map = 'global' self.read_maps = []
self.write_map = 'global' self.write_map = 'global'
self.macros[self.read_map] = {} self.macros['global'] = {}
self.macros[self.read_map]['_cwd'] = ('dir', 'required', path.shell(os.getcwd())) self.macros['global']['_cwd'] = ('dir', 'required', path.shell(os.getcwd()))
self.macros[self.read_map]['_sbdir'] = ('dir', 'required', path.shell(sbdir)) self.macros['global']['_sbdir'] = ('dir', 'required', path.shell(sbdir))
else: else:
self.macros = {} self.macros = {}
for m in original.macros: for m in original.macros:
@ -68,7 +68,7 @@ class macros:
self.macros[m] = {} self.macros[m] = {}
for k in original.macros[m]: for k in original.macros[m]:
self.macros[m][k] = original.macros[m][k] self.macros[m][k] = original.macros[m][k]
self.read_map = original.read_map self.read_maps = sorted(original.read_maps)
self.write_map = original.write_map self.write_map = original.write_map
if name is not None: if name is not None:
self.load(name) self.load(name)
@ -157,24 +157,14 @@ class macros:
return len(self.keys()) return len(self.keys())
def keys(self): def keys(self):
keys = self.macros['global'].keys()
def _map_keys(_map): for rm in self.get_read_maps():
u = [] for mk in self.macros[rm]:
k = [] if self.macros[rm][mk][1] == 'undefine':
for mk in _map: if mk in keys:
if _map[mk][1] == 'undefine': keys.remove(mk)
u += [mk]
else: else:
k += [mk] keys.append(mk)
return k, u
keys, undefined = _map_keys(self.macros[self.read_map])
if map is not 'global':
gk, u = _map_keys(self.macros['global'])
undefined = set(undefined + u)
for k in gk:
if k not in undefined:
keys += [k]
return sorted(set(keys)) return sorted(set(keys))
def has_key(self, key): def has_key(self, key):
@ -187,6 +177,9 @@ class macros:
def maps(self): def maps(self):
return self.macros.keys() return self.macros.keys()
def get_read_maps(self):
return [rm[5:] for rm in self.read_maps]
def key_filter(self, key): def key_filter(self, key):
if key.startswith('%{') and key[-1] is '}': if key.startswith('%{') and key[-1] is '}':
key = key[2:-1] key = key[2:-1]
@ -310,8 +303,9 @@ class macros:
if type(key) is not str: if type(key) is not str:
raise TypeError('bad key type: %s' % (type(key))) raise TypeError('bad key type: %s' % (type(key)))
key = self.key_filter(key) key = self.key_filter(key)
if self.read_map is not 'global'and key in self.macros[self.read_map]: for rm in self.get_read_maps():
return self.macros[self.read_map][key] if key in self.macros[rm]:
return self.macros[rm][key]
if key in self.macros['global']: if key in self.macros['global']:
return self.macros['global'][key] return self.macros['global'][key]
return None return None
@ -367,9 +361,19 @@ class macros:
keys += [key] keys += [key]
return keys return keys
def set_read_map(self, map): def set_read_map(self, _map):
if map in self.macros: if _map in self.macros:
self.read_map = map if _map not in self.get_read_maps():
rm = '%04d_%s' % (len(self.read_maps), _map)
self.read_maps = sorted(self.read_maps + [rm])
return True
return False
def unset_read_map(self, _map):
if _map in self.get_read_maps():
for i in range(0, len(self.read_maps)):
if '%04d_%s' % (i, _map) == self.read_maps[i]:
self.read_maps.pop(i)
return True return True
return False return False
@ -391,12 +395,13 @@ if __name__ == "__main__":
m.parse("[test]\n" \ m.parse("[test]\n" \
"test1: none, undefine, ''\n" \ "test1: none, undefine, ''\n" \
"name: none, override, 'pink'\n") "name: none, override, 'pink'\n")
m.set_read_map('test') print 'set test:', m.set_read_map('test')
if m['name'] != 'pink': if m['name'] != 'pink':
print 'error: override failed. name is %s' % (m['name']) print 'error: override failed. name is %s' % (m['name'])
sys.exit(1) sys.exit(1)
if m.has_key('test1'): if m.has_key('test1'):
print 'error: map undefine failed.' print 'error: map undefine failed.'
sys.exit(1) sys.exit(1)
print 'unset test:', m.unset_read_map('test')
print m print m
print m.keys() print m.keys()