summaryrefslogtreecommitdiff
path: root/bitbake/lib/bb
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb')
-rw-r--r--bitbake/lib/bb/cooker.py104
-rw-r--r--bitbake/lib/bb/event.py21
-rw-r--r--bitbake/lib/bb/server/none.py2
-rw-r--r--bitbake/lib/bb/server/xmlrpc.py2
4 files changed, 78 insertions, 51 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index c1e2105c5..7adda09fd 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -494,69 +494,71 @@ class BBCooker:
path, _ = os.path.split(path)
def parseConfigurationFiles(self, files):
- try:
- data = self.configuration.data
-
- bb.parse.init_parser(data, self.configuration.dump_signatures)
- for f in files:
- data = bb.parse.handle(f, data)
+ def _parse(f, data):
+ try:
+ return bb.parse.handle(f, data)
+ except (IOError, bb.parse.ParseError) as exc:
+ parselog.critical("Unable to parse %s: %s" % (f, exc))
+ sys.exit(1)
+
+ data = self.configuration.data
- layerconf = self._findLayerConf()
- if layerconf:
- parselog.debug(2, "Found bblayers.conf (%s)", layerconf)
- data = bb.parse.handle(layerconf, data)
+ bb.parse.init_parser(data, self.configuration.dump_signatures)
+ for f in files:
+ data = _parse(f, data)
- layers = (bb.data.getVar('BBLAYERS', data, True) or "").split()
+ layerconf = self._findLayerConf()
+ if layerconf:
+ parselog.debug(2, "Found bblayers.conf (%s)", layerconf)
+ data = _parse(layerconf, data)
- data = bb.data.createCopy(data)
- for layer in layers:
- parselog.debug(2, "Adding layer %s", layer)
- bb.data.setVar('LAYERDIR', layer, data)
- data = bb.parse.handle(os.path.join(layer, "conf", "layer.conf"), data)
+ layers = (bb.data.getVar('BBLAYERS', data, True) or "").split()
- # XXX: Hack, relies on the local keys of the datasmart
- # instance being stored in the 'dict' attribute and makes
- # assumptions about how variable expansion works, but
- # there's no better way to force an expansion of a single
- # variable across the datastore today, and this at least
- # lets us reference LAYERDIR without having to immediately
- # eval all our variables that use it.
- for key in data.dict:
- if key != "_data":
- value = data.getVar(key, False)
- if value and "${LAYERDIR}" in value:
- data.setVar(key, value.replace("${LAYERDIR}", layer))
+ data = bb.data.createCopy(data)
+ for layer in layers:
+ parselog.debug(2, "Adding layer %s", layer)
+ bb.data.setVar('LAYERDIR', layer, data)
+ data = _parse(os.path.join(layer, "conf", "layer.conf"), data)
- bb.data.delVar('LAYERDIR', data)
+ # XXX: Hack, relies on the local keys of the datasmart
+ # instance being stored in the 'dict' attribute and makes
+ # assumptions about how variable expansion works, but
+ # there's no better way to force an expansion of a single
+ # variable across the datastore today, and this at least
+ # lets us reference LAYERDIR without having to immediately
+ # eval all our variables that use it.
+ for key in data.dict:
+ if key != "_data":
+ value = data.getVar(key, False)
+ if value and "${LAYERDIR}" in value:
+ data.setVar(key, value.replace("${LAYERDIR}", layer))
- if not data.getVar("BBPATH", True):
- raise SystemExit("The BBPATH variable is not set")
+ bb.data.delVar('LAYERDIR', data)
- data = bb.parse.handle(os.path.join("conf", "bitbake.conf"), data)
+ if not data.getVar("BBPATH", True):
+ raise SystemExit("The BBPATH variable is not set")
- self.configuration.data = data
+ data = _parse(os.path.join("conf", "bitbake.conf"), data)
- # Handle any INHERITs and inherit the base class
- inherits = ["base"] + (bb.data.getVar('INHERIT', self.configuration.data, True ) or "").split()
- for inherit in inherits:
- self.configuration.data = bb.parse.handle(os.path.join('classes', '%s.bbclass' % inherit), self.configuration.data, True )
+ self.configuration.data = data
- # Nomally we only register event handlers at the end of parsing .bb files
- # We register any handlers we've found so far here...
- for var in bb.data.getVar('__BBHANDLERS', self.configuration.data) or []:
- bb.event.register(var, bb.data.getVar(var, self.configuration.data))
+ # Handle any INHERITs and inherit the base class
+ inherits = ["base"] + (bb.data.getVar('INHERIT', self.configuration.data, True ) or "").split()
+ for inherit in inherits:
+ self.configuration.data = _parse(os.path.join('classes', '%s.bbclass' % inherit), self.configuration.data, True )
- if bb.data.getVar("BB_WORKERCONTEXT", self.configuration.data) is None:
- bb.fetch.fetcher_init(self.configuration.data)
- bb.codeparser.parser_cache_init(self.configuration.data)
+ # Nomally we only register event handlers at the end of parsing .bb files
+ # We register any handlers we've found so far here...
+ for var in bb.data.getVar('__BBHANDLERS', self.configuration.data) or []:
+ bb.event.register(var, bb.data.getVar(var, self.configuration.data))
- bb.parse.init_parser(data, self.configuration.dump_signatures)
+ if bb.data.getVar("BB_WORKERCONTEXT", self.configuration.data) is None:
+ bb.fetch.fetcher_init(self.configuration.data)
+ bb.codeparser.parser_cache_init(self.configuration.data)
- bb.event.fire(bb.event.ConfigParsed(), self.configuration.data)
+ bb.parse.init_parser(data, self.configuration.dump_signatures)
- except (IOError, bb.parse.ParseError):
- parselog.exception("Error when parsing %s", files)
- sys.exit(1)
+ bb.event.fire(bb.event.ConfigParsed(), self.configuration.data)
def handleCollections( self, collections ):
"""Handle collections"""
@@ -899,7 +901,7 @@ class BBCooker:
if not base in self.appendlist:
self.appendlist[base] = []
self.appendlist[base].append(f)
-
+
return (bbfiles, masked)
def get_file_appends(self, fn):
@@ -909,7 +911,7 @@ class BBCooker:
"""
f = os.path.basename(fn)
if f in self.appendlist:
- return self.appendlist[f]
+ return self.appendlist[f]
return []
def pre_serve(self):
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py
index f3efae9bd..fb355089a 100644
--- a/bitbake/lib/bb/event.py
+++ b/bitbake/lib/bb/event.py
@@ -26,6 +26,7 @@ import os, sys
import warnings
import pickle
import logging
+import atexit
import bb.utils
# This is the pid for which we should generate the event. This is set when
@@ -74,7 +75,27 @@ def fire_class_handlers(event, d):
h(event)
del event.data
+ui_queue = []
+@atexit.register
+def print_ui_queue():
+ """If we're exiting before a UI has been spawned, display any queued
+ LogRecords to the console."""
+ logger = logging.getLogger("BitBake")
+ if not _ui_handlers:
+ console = logging.StreamHandler(sys.stdout)
+ console.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))
+ logger.handlers = [console]
+ while ui_queue:
+ event, d = ui_queue.pop()
+ if isinstance(event, logging.LogRecord):
+ logger.handle(event)
+
def fire_ui_handlers(event, d):
+ if not _ui_handlers:
+ # No UI handlers registered yet, queue up the messages
+ ui_queue.append((event, d))
+ return
+
errors = []
for h in _ui_handlers:
#print "Sending event %s" % event
diff --git a/bitbake/lib/bb/server/none.py b/bitbake/lib/bb/server/none.py
index dafb2feba..2708807df 100644
--- a/bitbake/lib/bb/server/none.py
+++ b/bitbake/lib/bb/server/none.py
@@ -174,6 +174,8 @@ class BitBakeServerConnection():
self.server = serverinfo.server
self.connection = serverinfo.commands
self.events = bb.server.none.BBUIEventQueue(self.server)
+ for event in bb.event.ui_queue:
+ self.events.queue_event(event)
def terminate(self):
try:
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py
index c2bfe1217..0d03e308d 100644
--- a/bitbake/lib/bb/server/xmlrpc.py
+++ b/bitbake/lib/bb/server/xmlrpc.py
@@ -243,6 +243,8 @@ class BitBakeServerConnection():
t = BBTransport()
self.connection = xmlrpclib.Server("http://%s:%s" % (serverinfo.host, serverinfo.port), transport=t, allow_none=True)
self.events = uievent.BBUIEventQueue(self.connection)
+ for event in bb.event.ui_queue:
+ self.events.queue_event(event)
def terminate(self):
# Don't wait for server indefinitely