1 # ex:ts=4:sw=4:sts=4:et
2 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4 BitBake Utility Functions
6 This program is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free Software
8 Foundation; either version 2 of the License, or (at your option) any later
11 This program is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
17 Place, Suite 330, Boston, MA 02111-1307 USA.
19 This file is part of the BitBake build tools.
23 ascii_letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
27 def explode_version(s):
29 alpha_regexp = re.compile('^([a-zA-Z]+)(.*)$')
30 numeric_regexp = re.compile('^(\d+)(.*)$')
33 m = numeric_regexp.match(s)
34 r.append(int(m.group(1)))
37 if s[0] in ascii_letters:
38 m = alpha_regexp.match(s)
45 def vercmp_part(a, b):
46 va = explode_version(a)
47 vb = explode_version(b)
57 if ca == None and cb == None:
68 r = vercmp_part(va, vb)
70 r = vercmp_part(ra, rb)
75 Take an RDEPENDS style string of format:
76 "DEPEND1 (optional version) DEPEND2 (optional version) ..."
77 and return a list of dependencies.
78 Version information is ignored.
91 if flag and i.endswith(')'):
94 #r[-1] += ' ' + ' '.join(j)
99 def _print_trace(body, line):
101 Print the Environment of a Text Body
105 # print the environment of the method
106 bb.msg.error(bb.msg.domain.Util, "Printing the environment of the function")
107 min_line = max(1,line-4)
108 max_line = min(line+4,len(body)-1)
109 for i in range(min_line,max_line+1):
110 bb.msg.error(bb.msg.domain.Util, "\t%.4d:%s" % (i, body[i-1]) )
113 def better_compile(text, file, realfile):
115 A better compile method. This method
116 will print the offending lines.
119 return compile(text, file, "exec")
123 # split the text into lines again
124 body = text.split('\n')
125 bb.msg.error(bb.msg.domain.Util, "Error in compiling: ", realfile)
126 bb.msg.error(bb.msg.domain.Util, "The lines resulting into this error were:")
127 bb.msg.error(bb.msg.domain.Util, "\t%d:%s:'%s'" % (e.lineno, e.__class__.__name__, body[e.lineno-1]))
129 _print_trace(body, e.lineno)
134 def better_exec(code, context, text, realfile):
136 Similiar to better_compile, better_exec will
137 print the lines that are responsible for the
144 (t,value,tb) = sys.exc_info()
146 if t in [bb.parse.SkipPackage, bb.build.FuncFailed]:
149 # print the Header of the Error Message
150 bb.msg.error(bb.msg.domain.Util, "Error in executing: ", realfile)
151 bb.msg.error(bb.msg.domain.Util, "Exception:%s Message:%s" % (t,value) )
153 # let us find the line number now
158 line = traceback.tb_lineno(tb)
160 _print_trace( text.split('\n'), line )
166 A simple class to give Enum support
169 assert names, "Empty enums are not supported"
171 class EnumClass(object):
173 def __iter__(self): return iter(constants)
174 def __len__(self): return len(constants)
175 def __getitem__(self, i): return constants[i]
176 def __repr__(self): return 'Enum' + str(names)
177 def __str__(self): return 'enum ' + str(constants)
179 class EnumValue(object):
180 __slots__ = ('__value')
181 def __init__(self, value): self.__value = value
182 Value = property(lambda self: self.__value)
183 EnumType = property(lambda self: EnumType)
184 def __hash__(self): return hash(self.__value)
185 def __cmp__(self, other):
186 # C fans might want to remove the following assertion
187 # to make all enums comparable by ordinal value {;))
188 assert self.EnumType is other.EnumType, "Only values from the same enum are comparable"
189 return cmp(self.__value, other.__value)
190 def __invert__(self): return constants[maximum - self.__value]
191 def __nonzero__(self): return bool(self.__value)
192 def __repr__(self): return str(names[self.__value])
194 maximum = len(names) - 1
195 constants = [None] * len(names)
196 for i, each in enumerate(names):
198 setattr(EnumClass, each, val)
200 constants = tuple(constants)
201 EnumType = EnumClass()