Update version to 1.13.1
[bitbake.git] / lib / bb / __init__.py
1 # ex:ts=4:sw=4:sts=4:et
2 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
3 #
4 # BitBake Build System Python Library
5 #
6 # Copyright (C) 2003  Holger Schurig
7 # Copyright (C) 2003, 2004  Chris Larson
8 #
9 # Based on Gentoo's portage.py.
10 #
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License version 2 as
13 # published by the Free Software Foundation.
14 #
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 # GNU General Public License for more details.
19 #
20 # You should have received a copy of the GNU General Public License along
21 # with this program; if not, write to the Free Software Foundation, Inc.,
22 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23
24 __version__ = "1.13.1"
25
26 import sys
27 if sys.version_info < (2, 6, 0):
28     raise RuntimeError("Sorry, python 2.6.0 or later is required for this version of bitbake")
29
30 import os
31 import logging
32
33
34 class NullHandler(logging.Handler):
35     def emit(self, record):
36         pass
37
38 Logger = logging.getLoggerClass()
39 class BBLogger(Logger):
40     def __init__(self, name):
41         if name.split(".")[0] == "BitBake":
42             self.debug = self.bbdebug
43         Logger.__init__(self, name)
44
45     def bbdebug(self, level, msg, *args, **kwargs):
46         return self.log(logging.DEBUG - level + 1, msg, *args, **kwargs)
47
48     def plain(self, msg, *args, **kwargs):
49         return self.log(logging.INFO + 1, msg, *args, **kwargs)
50
51     def verbose(self, msg, *args, **kwargs):
52         return self.log(logging.INFO - 1, msg, *args, **kwargs)
53
54 logging.raiseExceptions = False
55 logging.setLoggerClass(BBLogger)
56
57 logger = logging.getLogger("BitBake")
58 logger.addHandler(NullHandler())
59 logger.setLevel(logging.INFO)
60
61 # This has to be imported after the setLoggerClass, as the import of bb.msg
62 # can result in construction of the various loggers.
63 import bb.msg
64
65 if "BBDEBUG" in os.environ:
66     level = int(os.environ["BBDEBUG"])
67     if level:
68         bb.msg.set_debug_level(level)
69
70 if os.environ.get("BBFETCH2"):
71     from bb import fetch2 as fetch
72     sys.modules['bb.fetch'] = sys.modules['bb.fetch2']
73
74 # Messaging convenience functions
75 def plain(*args):
76     logger.plain(''.join(args))
77
78 def debug(lvl, *args):
79     if isinstance(lvl, basestring):
80         logger.warn("Passed invalid debug level '%s' to bb.debug", lvl)
81         args = (lvl,) + args
82         lvl = 1
83     logger.debug(lvl, ''.join(args))
84
85 def note(*args):
86     logger.info(''.join(args))
87
88 def warn(*args):
89     logger.warn(''.join(args))
90
91 def error(*args):
92     logger.error(''.join(args))
93
94 def fatal(*args):
95     logger.critical(''.join(args))
96     sys.exit(1)
97
98
99 def deprecated(func, name=None, advice=""):
100     """This is a decorator which can be used to mark functions
101     as deprecated. It will result in a warning being emmitted
102     when the function is used."""
103     import warnings
104
105     if advice:
106         advice = ": %s" % advice
107     if name is None:
108         name = func.__name__
109
110     def newFunc(*args, **kwargs):
111         warnings.warn("Call to deprecated function %s%s." % (name,
112                                                              advice),
113                       category=DeprecationWarning,
114                       stacklevel=2)
115         return func(*args, **kwargs)
116     newFunc.__name__ = func.__name__
117     newFunc.__doc__ = func.__doc__
118     newFunc.__dict__.update(func.__dict__)
119     return newFunc
120
121 # For compatibility
122 def deprecate_import(current, modulename, fromlist, renames = None):
123     """Import objects from one module into another, wrapping them with a DeprecationWarning"""
124     import sys
125
126     module = __import__(modulename, fromlist = fromlist)
127     for position, objname in enumerate(fromlist):
128         obj = getattr(module, objname)
129         newobj = deprecated(obj, "{0}.{1}".format(current, objname),
130                             "Please use {0}.{1} instead".format(modulename, objname))
131         if renames:
132             newname = renames[position]
133         else:
134             newname = objname
135
136         setattr(sys.modules[current], newname, newobj)
137
138 deprecate_import(__name__, "bb.fetch", ("MalformedUrl", "encodeurl", "decodeurl"))
139 deprecate_import(__name__, "bb.utils", ("mkdirhier", "movefile", "copyfile", "which"))
140 deprecate_import(__name__, "bb.utils", ["vercmp_string"], ["vercmp"])