diff options
Diffstat (limited to 'bitbake/lib/bb')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 104 | ||||
-rw-r--r-- | bitbake/lib/bb/event.py | 21 | ||||
-rw-r--r-- | bitbake/lib/bb/server/none.py | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/server/xmlrpc.py | 2 |
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 |