mirror of
https://git.rtems.org/rtems-source-builder
synced 2024-10-09 07:15:10 +08:00
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:
parent
b0c2756190
commit
fd5042a1c4
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user