diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/cache.py | 10 | ||||
-rw-r--r-- | bitbake/lib/bb/parse/ast.py | 114 | ||||
-rw-r--r-- | bitbake/lib/bb/parse/parse_py/BBHandler.py | 26 |
3 files changed, 121 insertions, 29 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index 43091daa26..9a962ecc74 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py @@ -143,8 +143,8 @@ class Cache: if dep not in self.depends_cache[fn]["__depends"]: self.depends_cache[fn]["__depends"].append(dep) - # Make sure BBCLASSEXTEND always makes the cache too - self.getVar('BBCLASSEXTEND', virtualfn, True) + # Make sure the variants always make it into the cache too + self.getVar('__VARIANTS', virtualfn, True) self.depends_cache[virtualfn]["CACHETIMESTAMP"] = bb.parse.cached_mtime(fn) @@ -199,7 +199,7 @@ class Cache: self.cacheValidUpdate(fn) if self.cacheValid(fn): - multi = self.getVar('BBCLASSEXTEND', fn, True) + multi = self.getVar('__VARIANTS', fn, True) for cls in (multi or "").split() + [""]: virtualfn = self.realfn2virtual(fn, cls) if self.depends_cache[virtualfn]["__SKIPPED"]: @@ -292,7 +292,7 @@ class Cache: self.clean[fn] = "" # Mark extended class data as clean too - multi = self.getVar('BBCLASSEXTEND', fn, True) + multi = self.getVar('__VARIANTS', fn, True) for cls in (multi or "").split(): virtualfn = self.realfn2virtual(fn, cls) self.clean[virtualfn] = "" @@ -443,7 +443,7 @@ class Cache: # Touch this to make sure its in the cache self.getVar('__BB_DONT_CACHE', file_name, True) - self.getVar('BBCLASSEXTEND', file_name, True) + self.getVar('__VARIANTS', file_name, True) def load_bbfile( self, bbfile , config): """ diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 70a69b8d14..59aa44bee0 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py @@ -22,9 +22,11 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import bb, re, string +from itertools import chain __word__ = re.compile(r"\S+") __parsed_methods__ = bb.methodpool.get_parsed_dict() +_bbversions_re = re.compile(r"\[(?P<from>[0-9]+)-(?P<to>[0-9]+)\]") class StatementGroup(list): def eval(self, data): @@ -335,3 +337,115 @@ def finalise(fn, d): bb.event.fire(bb.event.RecipeParsed(fn), d) +def _create_variants(datastores, names, function): + def create_variant(name, orig_d, arg = None): + new_d = bb.data.createCopy(orig_d) + function(arg or name, new_d) + datastores[name] = new_d + + for variant, variant_d in datastores.items(): + for name in names: + if not variant: + # Based on main recipe + create_variant(name, variant_d) + else: + create_variant("%s-%s" % (variant, name), variant_d, name) + +def _expand_versions(versions): + def expand_one(version, start, end): + for i in xrange(start, end + 1): + ver = _bbversions_re.sub(str(i), version, 1) + yield ver + + versions = iter(versions) + while True: + try: + version = versions.next() + except StopIteration: + break + + range_ver = _bbversions_re.search(version) + if not range_ver: + yield version + else: + newversions = expand_one(version, int(range_ver.group("from")), + int(range_ver.group("to"))) + versions = chain(newversions, versions) + +def multi_finalize(fn, d): + safe_d = d + + d = bb.data.createCopy(safe_d) + try: + finalise(fn, d) + except bb.parse.SkipPackage: + bb.data.setVar("__SKIPPED", True, d) + datastores = {"": safe_d} + + versions = (d.getVar("BBVERSIONS", True) or "").split() + if versions: + pv = orig_pv = d.getVar("PV", True) + baseversions = {} + + def verfunc(ver, d, pv_d = None): + if pv_d is None: + pv_d = d + + overrides = d.getVar("OVERRIDES", True).split(":") + pv_d.setVar("PV", ver) + overrides.append(ver) + bpv = baseversions.get(ver) or orig_pv + pv_d.setVar("BPV", bpv) + overrides.append(bpv) + d.setVar("OVERRIDES", ":".join(overrides)) + + versions = list(_expand_versions(versions)) + for pos, version in enumerate(list(versions)): + try: + pv, bpv = version.split(":", 2) + except ValueError: + pass + else: + versions[pos] = pv + baseversions[pv] = bpv + + if pv in versions and not baseversions.get(pv): + versions.remove(pv) + else: + pv = versions.pop() + + # This is necessary because our existing main datastore + # has already been finalized with the old PV, we need one + # that's been finalized with the new PV. + d = bb.data.createCopy(safe_d) + verfunc(pv, d, safe_d) + try: + finalise(fn, d) + except bb.parse.SkipPackage: + bb.data.setVar("__SKIPPED", True, d) + + _create_variants(datastores, versions, verfunc) + + extended = d.getVar("BBCLASSEXTEND", True) or "" + if extended: + pn = d.getVar("PN", True) + def extendfunc(name, d): + d.setVar("PN", "%s-%s" % (pn, name)) + bb.parse.BBHandler.inherit([name], d) + + safe_d.setVar("BBCLASSEXTEND", extended) + _create_variants(datastores, extended.split(), extendfunc) + + for variant, variant_d in datastores.items(): + if variant: + try: + finalise(fn, variant_d) + except bb.parse.SkipPackage: + bb.data.setVar("__SKIPPED", True, variant_d) + + if len(datastores) > 1: + variants = filter(None, datastores.keys()) + safe_d.setVar("__VARIANTS", " ".join(variants)) + + datastores[""] = d + return datastores diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py index 4641c13d9c..262c883c95 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py @@ -152,30 +152,8 @@ def handle(fn, d, include): classes.remove(__classname__) else: if include == 0: - safe_d = d - d = bb.data.createCopy(safe_d) - try: - ast.finalise(fn, d) - except bb.parse.SkipPackage: - bb.data.setVar("__SKIPPED", True, d) - darray = {"": d} - - extended = bb.data.getVar("BBCLASSEXTEND", d, True) - if extended: - bb.data.setVar("BBCLASSEXTEND", extended, safe_d) - - for cls in (extended or "").split(): - pn = data.getVar('PN', d, True) - variant_d = bb.data.createCopy(safe_d) - data.setVar('PN', pn + '-' + cls, variant_d) - inherit([cls], variant_d) - try: - ast.finalise(fn, variant_d) - except bb.parse.SkipPackage: - bb.data.setVar("__SKIPPED", True, variant_d) - darray[cls] = variant_d - return darray - + return ast.multi_finalize(fn, d) + if oldfile: bb.data.setVar("FILE", oldfile, d) |