From e7ccd9071233d66afb0bc72774b0032fb8229fe4 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Fri, 23 Jan 2015 18:01:00 +0000 Subject: bitbake: data_smart: Remove need for update_data calls Move the update_data functionality into internal data store operations so the main finalize (update_data) call is a nop. To make this work we need to call the internal finalization function whenever OVERRIDES is changed to ensure values get updated correctly. This has performance issues but the subsequant patches look into this. (Bitbake rev: 546d9932d6c4413824319a9d780c0d77d2725f4a) Signed-off-by: Richard Purdie --- bitbake/lib/bb/data_smart.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'bitbake/lib/bb/data_smart.py') diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index b433489a84..77d0c61da0 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -298,6 +298,7 @@ class VariableHistory(object): class DataSmart(MutableMapping): def __init__(self, special = None, seen = None ): self.dict = {} + self.overrides = [] if special is None: special = COWDictBase.copy() @@ -354,11 +355,13 @@ class DataSmart(MutableMapping): def expand(self, s, varname = None): return self.expandWithRefs(s, varname).value - def finalize(self, parent = False): + return + + def internal_finalize(self, parent = False): """Performs final steps upon the datastore, including application of overrides""" - overrides = (self.getVar("OVERRIDES", True) or "").split(":") or [] + self.overrides = (self.getVar("OVERRIDES", True) or "").split(":") or [] finalize_caller = { 'op': 'finalize', } @@ -383,7 +386,7 @@ class DataSmart(MutableMapping): # We only want to report finalization once per variable overridden. finalizes_reported = {} - for o in overrides: + for o in self.overrides: # calculate '_'+override l = len(o) + 1 @@ -417,12 +420,15 @@ class DataSmart(MutableMapping): if op in self._special_values: appends = self._special_values[op] or [] for append in appends: + self.handle_special_values(append, op) + + def handle_special_values(self, append, op): keep = [] for (a, o) in self.getVarFlag(append, op) or []: match = True if o: for o2 in o.split("_"): - if not o2 in overrides: + if not o2 in self.overrides: match = False if not match: keep.append((a ,o)) @@ -502,6 +508,7 @@ class DataSmart(MutableMapping): except KeyError: self._special_values[keyword] = set() self._special_values[keyword].add(base) + self.handle_special_values(base, keyword) return @@ -521,6 +528,9 @@ class DataSmart(MutableMapping): self.dict[var]["_content"] = value self.varhistory.record(**loginfo) + if var == "OVERRIDES": + self.internal_finalize(True) + def _setvar_update_overrides(self, var): # aka pay the cookie monster override = var[var.rfind('_')+1:] @@ -733,6 +743,7 @@ class DataSmart(MutableMapping): # we really want this to be a DataSmart... data = DataSmart(seen=self._seen_overrides.copy(), special=self._special_values.copy()) data.dict["_data"] = self.dict + data.overrides = copy.copy(self.overrides) data.varhistory = self.varhistory.copy() data.varhistory.datasmart = data data.inchistory = self.inchistory.copy() -- cgit v1.2.3-54-g00ecf