mirror of
https://git.yoctoproject.org/poky
synced 2026-02-08 09:46:38 +01:00
It turns out that while log filters added with addFilter are only associated with that logger, and not its children, handlers are inherited, and handlers can be filters. So, let's add filtering to our existing LogHandler class which dispatches our log records as bitbake events. (Bitbake rev: 0153ace246e7c88366f45c8f035a2b4505a1c115) Signed-off-by: Chris Larson <chris_larson@mentor.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
140 lines
4.4 KiB
Python
140 lines
4.4 KiB
Python
# ex:ts=4:sw=4:sts=4:et
|
|
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
|
#
|
|
# BitBake Build System Python Library
|
|
#
|
|
# Copyright (C) 2003 Holger Schurig
|
|
# Copyright (C) 2003, 2004 Chris Larson
|
|
#
|
|
# Based on Gentoo's portage.py.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 2 as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
__version__ = "1.11.0"
|
|
|
|
import sys
|
|
if sys.version_info < (2, 6, 0):
|
|
raise RuntimeError("Sorry, python 2.6.0 or later is required for this version of bitbake")
|
|
|
|
import os
|
|
import logging
|
|
import traceback
|
|
|
|
class NullHandler(logging.Handler):
|
|
def emit(self, record):
|
|
pass
|
|
|
|
Logger = logging.getLoggerClass()
|
|
class BBLogger(Logger):
|
|
def __init__(self, name):
|
|
if name.split(".")[0] == "BitBake":
|
|
self.debug = self.bbdebug
|
|
Logger.__init__(self, name)
|
|
|
|
def bbdebug(self, level, msg, *args, **kwargs):
|
|
return self.log(logging.DEBUG - level - 1, msg, *args, **kwargs)
|
|
|
|
def plain(self, msg, *args, **kwargs):
|
|
return self.log(logging.INFO + 1, msg, *args, **kwargs)
|
|
|
|
def verbose(self, msg, *args, **kwargs):
|
|
return self.log(logging.INFO - 1, msg, *args, **kwargs)
|
|
|
|
def exception(self, msg, *args, **kwargs):
|
|
return self.critical("%s\n%s" % (msg, traceback.format_exc()), *args, **kwargs)
|
|
|
|
logging.raiseExceptions = False
|
|
logging.setLoggerClass(BBLogger)
|
|
|
|
logger = logging.getLogger("BitBake")
|
|
logger.addHandler(NullHandler())
|
|
logger.setLevel(logging.INFO)
|
|
|
|
# This has to be imported after the setLoggerClass, as the import of bb.msg
|
|
# can result in construction of the various loggers.
|
|
import bb.msg
|
|
|
|
if "BBDEBUG" in os.environ:
|
|
level = int(os.environ["BBDEBUG"])
|
|
if level:
|
|
bb.msg.set_debug_level(level)
|
|
|
|
if True or os.environ.get("BBFETCH2"):
|
|
from bb import fetch2 as fetch
|
|
sys.modules['bb.fetch'] = sys.modules['bb.fetch2']
|
|
|
|
# Messaging convenience functions
|
|
def plain(*args):
|
|
logger.plain(''.join(args))
|
|
|
|
def debug(lvl, *args):
|
|
logger.debug(lvl, ''.join(args))
|
|
|
|
def note(*args):
|
|
logger.info(''.join(args))
|
|
|
|
def warn(*args):
|
|
logger.warn(''.join(args))
|
|
|
|
def error(*args):
|
|
logger.error(''.join(args))
|
|
|
|
def fatal(*args):
|
|
logger.critical(''.join(args))
|
|
sys.exit(1)
|
|
|
|
|
|
def deprecated(func, name = None, advice = ""):
|
|
"""This is a decorator which can be used to mark functions
|
|
as deprecated. It will result in a warning being emmitted
|
|
when the function is used."""
|
|
import warnings
|
|
|
|
if advice:
|
|
advice = ": %s" % advice
|
|
if name is None:
|
|
name = func.__name__
|
|
|
|
def newFunc(*args, **kwargs):
|
|
warnings.warn("Call to deprecated function %s%s." % (name,
|
|
advice),
|
|
category = PendingDeprecationWarning,
|
|
stacklevel = 2)
|
|
return func(*args, **kwargs)
|
|
newFunc.__name__ = func.__name__
|
|
newFunc.__doc__ = func.__doc__
|
|
newFunc.__dict__.update(func.__dict__)
|
|
return newFunc
|
|
|
|
# For compatibility
|
|
def deprecate_import(current, modulename, fromlist, renames = None):
|
|
"""Import objects from one module into another, wrapping them with a DeprecationWarning"""
|
|
import sys
|
|
|
|
module = __import__(modulename, fromlist = fromlist)
|
|
for position, objname in enumerate(fromlist):
|
|
obj = getattr(module, objname)
|
|
newobj = deprecated(obj, "{0}.{1}".format(current, objname),
|
|
"Please use {0}.{1} instead".format(modulename, objname))
|
|
if renames:
|
|
newname = renames[position]
|
|
else:
|
|
newname = objname
|
|
|
|
setattr(sys.modules[current], newname, newobj)
|
|
|
|
deprecate_import(__name__, "bb.fetch", ("MalformedUrl", "encodeurl", "decodeurl"))
|
|
deprecate_import(__name__, "bb.utils", ("mkdirhier", "movefile", "copyfile", "which"))
|
|
deprecate_import(__name__, "bb.utils", ["vercmp_string"], ["vercmp"])
|