summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bitbake-dev/lib/bb/cache.py89
-rw-r--r--bitbake-dev/lib/bb/cooker.py21
-rw-r--r--bitbake-dev/lib/bb/event.py5
-rw-r--r--bitbake-dev/lib/bb/parse/parse_py/BBHandler.py28
-rw-r--r--bitbake-dev/lib/bb/ui/knotty.py4
5 files changed, 79 insertions, 68 deletions
diff --git a/bitbake-dev/lib/bb/cache.py b/bitbake-dev/lib/bb/cache.py
index d30d57d33b..2f1b8fa601 100644
--- a/bitbake-dev/lib/bb/cache.py
+++ b/bitbake-dev/lib/bb/cache.py
@@ -134,7 +134,18 @@ class Cache:
self.data = data
# Make sure __depends makes the depends_cache
- self.getVar("__depends", virtualfn, True)
+ # If we're a virtual class we need to make sure all our depends are appended
+ # to the depends of fn.
+ depends = self.getVar("__depends", virtualfn, True) or []
+ if "__depends" not in self.depends_cache[fn] or not self.depends_cache[fn]["__depends"]:
+ self.depends_cache[fn]["__depends"] = depends
+ for dep in depends:
+ 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)
+
self.depends_cache[virtualfn]["CACHETIMESTAMP"] = bb.parse.cached_mtime(fn)
def virtualfn2realfn(self, virtualfn):
@@ -170,11 +181,8 @@ class Cache:
bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s (full)" % fn)
- bb_data, skipped = self.load_bbfile(fn, cfgData)
- if isinstance(bb_data, dict):
- return bb_data[cls]
-
- return bb_data
+ bb_data = self.load_bbfile(fn, cfgData)
+ return bb_data[cls]
def loadData(self, fn, cfgData, cacheData):
"""
@@ -184,42 +192,39 @@ class Cache:
to record the variables accessed.
Return the cache status and whether the file was skipped when parsed
"""
+ skipped = 0
+ virtuals = 0
+
if fn not in self.checked:
self.cacheValidUpdate(fn)
+
if self.cacheValid(fn):
- if "SKIPPED" in self.depends_cache[fn]:
- return True, True
- self.handle_data(fn, cacheData)
multi = self.getVar('BBCLASSEXTEND', fn, True)
- if multi:
- for cls in multi.split():
- virtualfn = self.realfn2virtual(fn, cls)
- # Pretend we're clean so getVar works
- self.clean[virtualfn] = ""
- self.handle_data(virtualfn, cacheData)
- return True, False
+ for cls in (multi or "").split() + [""]:
+ virtualfn = self.realfn2virtual(fn, cls)
+ if self.depends_cache[virtualfn]["__SKIPPED"]:
+ skipped += 1
+ bb.msg.debug(1, bb.msg.domain.Cache, "Skipping %s" % virtualfn)
+ continue
+ self.handle_data(virtualfn, cacheData)
+ virtuals += 1
+ return True, skipped, virtuals
bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s" % fn)
- bb_data, skipped = self.load_bbfile(fn, cfgData)
-
- if skipped:
- if isinstance(bb_data, dict):
- self.setData(fn, fn, bb_data[""])
- else:
- self.setData(fn, fn, bb_data)
- return False, skipped
+ bb_data = self.load_bbfile(fn, cfgData)
- if isinstance(bb_data, dict):
- for data in bb_data:
- virtualfn = self.realfn2virtual(fn, data)
- self.setData(virtualfn, fn, bb_data[data])
+ for data in bb_data:
+ virtualfn = self.realfn2virtual(fn, data)
+ self.setData(virtualfn, fn, bb_data[data])
+ if self.getVar("__SKIPPED", virtualfn, True):
+ skipped += 1
+ bb.msg.debug(1, bb.msg.domain.Cache, "Skipping %s" % virtualfn)
+ else:
self.handle_data(virtualfn, cacheData)
- return False, skipped
+ virtuals += 1
+ return False, skipped, virtuals
- self.setData(fn, fn, bb_data)
- self.handle_data(fn, cacheData)
- return False, skipped
def cacheValid(self, fn):
"""
@@ -286,16 +291,13 @@ class Cache:
if not fn in self.clean:
self.clean[fn] = ""
- return True
+ # Mark extended class data as clean too
+ multi = self.getVar('BBCLASSEXTEND', fn, True)
+ for cls in (multi or "").split():
+ virtualfn = self.realfn2virtual(fn, cls)
+ self.clean[virtualfn] = ""
- def skip(self, fn):
- """
- Mark a fn as skipped
- Called from the parser
- """
- if not fn in self.depends_cache:
- self.depends_cache[fn] = {}
- self.depends_cache[fn]["SKIPPED"] = "1"
+ return True
def remove(self, fn):
"""
@@ -462,10 +464,7 @@ class Cache:
try:
bb_data = parse.handle(bbfile, bb_data) # read .bb data
os.chdir(oldpath)
- return bb_data, False
- except bb.parse.SkipPackage:
- os.chdir(oldpath)
- return bb_data, True
+ return bb_data
except:
os.chdir(oldpath)
raise
diff --git a/bitbake-dev/lib/bb/cooker.py b/bitbake-dev/lib/bb/cooker.py
index 25131b7406..8036d7e9d5 100644
--- a/bitbake-dev/lib/bb/cooker.py
+++ b/bitbake-dev/lib/bb/cooker.py
@@ -923,11 +923,13 @@ class CookerParser:
# Accounting statistics
self.parsed = 0
self.cached = 0
- self.skipped = 0
self.error = 0
self.masked = masked
self.total = len(filelist)
+ self.skipped = 0
+ self.virtuals = 0
+
# Pointer to the next file to parse
self.pointer = 0
@@ -937,13 +939,14 @@ class CookerParser:
cooker = self.cooker
try:
- fromCache, skip = cooker.bb_cache.loadData(f, cooker.configuration.data, cooker.status)
- if skip:
- self.skipped += 1
- bb.msg.debug(2, bb.msg.domain.Collection, "skipping %s" % f)
- cooker.bb_cache.skip(f)
- elif fromCache: self.cached += 1
- else: self.parsed += 1
+ fromCache, skipped, virtuals = cooker.bb_cache.loadData(f, cooker.configuration.data, cooker.status)
+ if fromCache:
+ self.cached += 1
+ else:
+ self.parsed += 1
+
+ self.skipped += skipped
+ self.virtuals += virtuals
except IOError, e:
self.error += 1
@@ -962,7 +965,7 @@ class CookerParser:
cooker.bb_cache.remove(f)
raise
finally:
- bb.event.fire(bb.event.ParseProgress(self.cached, self.parsed, self.skipped, self.masked, self.error, self.total), cooker.configuration.event_data)
+ bb.event.fire(bb.event.ParseProgress(self.cached, self.parsed, self.skipped, self.masked, self.virtuals, self.error, self.total), cooker.configuration.event_data)
self.pointer += 1
diff --git a/bitbake-dev/lib/bb/event.py b/bitbake-dev/lib/bb/event.py
index 3062dc51be..7251d78715 100644
--- a/bitbake-dev/lib/bb/event.py
+++ b/bitbake-dev/lib/bb/event.py
@@ -253,14 +253,15 @@ class ParseProgress(Event):
Parsing Progress Event
"""
- def __init__(self, cached, parsed, skipped, masked, errors, total):
+ def __init__(self, cached, parsed, skipped, masked, virtuals, errors, total):
Event.__init__(self)
self.cached = cached
self.parsed = parsed
self.skipped = skipped
+ self.virtuals = virtuals
self.masked = masked
self.errors = errors
- self.sofar = cached + parsed + skipped
+ self.sofar = cached + parsed
self.total = total
class DepTreeGenerated(Event):
diff --git a/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py b/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py
index 9b353634ed..86fa18ebd2 100644
--- a/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py
+++ b/bitbake-dev/lib/bb/parse/parse_py/BBHandler.py
@@ -185,18 +185,26 @@ def handle(fn, d, include = 0):
multi = data.getVar('BBCLASSEXTEND', d, 1)
if multi:
based = bb.data.createCopy(d)
+ else:
+ based = d
+ try:
finalise(fn, based)
- darray = {"": based}
- for cls in multi.split():
- pn = data.getVar('PN', d, True)
- based = bb.data.createCopy(d)
- data.setVar('PN', pn + '-' + cls, based)
- inherit([cls], based)
+ except bb.parse.SkipPackage:
+ bb.data.setVar("__SKIPPED", True, based)
+ darray = {"": based}
+
+ for cls in (multi or "").split():
+ pn = data.getVar('PN', d, True)
+ based = bb.data.createCopy(d)
+ data.setVar('PN', pn + '-' + cls, based)
+ inherit([cls], based)
+ try:
finalise(fn, based)
- darray[cls] = based
- return darray
- else:
- finalise(fn, d)
+ except bb.parse.SkipPackage:
+ bb.data.setVar("__SKIPPED", True, based)
+ darray[cls] = based
+ return darray
+
bbpath.pop(0)
if oldfile:
bb.data.setVar("FILE", oldfile, d)
diff --git a/bitbake-dev/lib/bb/ui/knotty.py b/bitbake-dev/lib/bb/ui/knotty.py
index 6baed836a1..c69fd6ca64 100644
--- a/bitbake-dev/lib/bb/ui/knotty.py
+++ b/bitbake-dev/lib/bb/ui/knotty.py
@@ -114,8 +114,8 @@ def init(server, eventHandler):
sys.stdout.write("done.")
sys.stdout.flush()
if x == y:
- print("\nParsing finished. %d cached, %d parsed, %d skipped, %d masked, %d errors."
- % ( event.cached, event.parsed, event.skipped, event.masked, event.errors))
+ print("\nParsing of %d .bb files complete (%d cached, %d parsed). %d targets, %d skipped, %d masked, %d errors."
+ % ( event.total, event.cached, event.parsed, event.virtuals, event.skipped, event.masked, event.errors))
continue
if isinstance(event, bb.command.CookerCommandCompleted):