summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/parse
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/parse')
-rw-r--r--bitbake/lib/bb/parse/ast.py105
-rw-r--r--bitbake/lib/bb/parse/parse_py/BBHandler.py15
-rw-r--r--bitbake/lib/bb/parse/parse_py/ConfHandler.py8
3 files changed, 68 insertions, 60 deletions
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py
index e34f1fe894..8fffe1e8f0 100644
--- a/bitbake/lib/bb/parse/ast.py
+++ b/bitbake/lib/bb/parse/ast.py
@@ -40,13 +40,14 @@ class StatementGroup(list):
40 statement.eval(data) 40 statement.eval(data)
41 41
42class AstNode(object): 42class AstNode(object):
43 pass 43 def __init__(self, filename, lineno):
44 self.filename = filename
45 self.lineno = lineno
44 46
45class IncludeNode(AstNode): 47class IncludeNode(AstNode):
46 def __init__(self, what_file, fn, lineno, force): 48 def __init__(self, filename, lineno, what_file, force):
49 AstNode.__init__(self, filename, lineno)
47 self.what_file = what_file 50 self.what_file = what_file
48 self.from_fn = fn
49 self.from_lineno = lineno
50 self.force = force 51 self.force = force
51 52
52 def eval(self, data): 53 def eval(self, data):
@@ -54,16 +55,17 @@ class IncludeNode(AstNode):
54 Include the file and evaluate the statements 55 Include the file and evaluate the statements
55 """ 56 """
56 s = bb.data.expand(self.what_file, data) 57 s = bb.data.expand(self.what_file, data)
57 logger.debug(2, "CONF %s:%s: including %s", self.from_fn, self.from_lineno, s) 58 logger.debug(2, "CONF %s:%s: including %s", self.filename, self.lineno, s)
58 59
59 # TODO: Cache those includes... maybe not here though 60 # TODO: Cache those includes... maybe not here though
60 if self.force: 61 if self.force:
61 bb.parse.ConfHandler.include(self.from_fn, s, data, "include required") 62 bb.parse.ConfHandler.include(self.filename, s, data, "include required")
62 else: 63 else:
63 bb.parse.ConfHandler.include(self.from_fn, s, data, False) 64 bb.parse.ConfHandler.include(self.filename, s, data, False)
64 65
65class ExportNode(AstNode): 66class ExportNode(AstNode):
66 def __init__(self, var): 67 def __init__(self, filename, lineno, var):
68 AstNode.__init__(self, filename, lineno)
67 self.var = var 69 self.var = var
68 70
69 def eval(self, data): 71 def eval(self, data):
@@ -76,7 +78,8 @@ class DataNode(AstNode):
76 this need to be re-evaluated... we might be able to do 78 this need to be re-evaluated... we might be able to do
77 that faster with multiple classes. 79 that faster with multiple classes.
78 """ 80 """
79 def __init__(self, groupd): 81 def __init__(self, filename, lineno, groupd):
82 AstNode.__init__(self, filename, lineno)
80 self.groupd = groupd 83 self.groupd = groupd
81 84
82 def getFunc(self, key, data): 85 def getFunc(self, key, data):
@@ -119,19 +122,18 @@ class DataNode(AstNode):
119 else: 122 else:
120 bb.data.setVar(key, val, data) 123 bb.data.setVar(key, val, data)
121 124
122class MethodNode: 125class MethodNode(AstNode):
123 def __init__(self, func_name, body, lineno, fn): 126 def __init__(self, filename, lineno, func_name, body):
127 AstNode.__init__(self, filename, lineno)
124 self.func_name = func_name 128 self.func_name = func_name
125 self.body = body 129 self.body = body
126 self.fn = fn
127 self.lineno = lineno
128 130
129 def eval(self, data): 131 def eval(self, data):
130 if self.func_name == "__anonymous": 132 if self.func_name == "__anonymous":
131 funcname = ("__anon_%s_%s" % (self.lineno, self.fn.translate(string.maketrans('/.+-', '____')))) 133 funcname = ("__anon_%s_%s" % (self.lineno, self.filename.translate(string.maketrans('/.+-', '____'))))
132 if not funcname in bb.methodpool._parsed_fns: 134 if not funcname in bb.methodpool._parsed_fns:
133 text = "def %s(d):\n" % (funcname) + '\n'.join(self.body) 135 text = "def %s(d):\n" % (funcname) + '\n'.join(self.body)
134 bb.methodpool.insert_method(funcname, text, self.fn) 136 bb.methodpool.insert_method(funcname, text, self.filename)
135 anonfuncs = bb.data.getVar('__BBANONFUNCS', data) or [] 137 anonfuncs = bb.data.getVar('__BBANONFUNCS', data) or []
136 anonfuncs.append(funcname) 138 anonfuncs.append(funcname)
137 bb.data.setVar('__BBANONFUNCS', anonfuncs, data) 139 bb.data.setVar('__BBANONFUNCS', anonfuncs, data)
@@ -140,25 +142,26 @@ class MethodNode:
140 bb.data.setVar(self.func_name, '\n'.join(self.body), data) 142 bb.data.setVar(self.func_name, '\n'.join(self.body), data)
141 143
142class PythonMethodNode(AstNode): 144class PythonMethodNode(AstNode):
143 def __init__(self, funcname, root, body, fn): 145 def __init__(self, filename, lineno, function, define, body):
144 self.func_name = funcname 146 AstNode.__init__(self, filename, lineno)
145 self.root = root 147 self.function = function
148 self.define = define
146 self.body = body 149 self.body = body
147 self.fn = fn
148 150
149 def eval(self, data): 151 def eval(self, data):
150 # Note we will add root to parsedmethods after having parse 152 # Note we will add root to parsedmethods after having parse
151 # 'this' file. This means we will not parse methods from 153 # 'this' file. This means we will not parse methods from
152 # bb classes twice 154 # bb classes twice
153 text = '\n'.join(self.body) 155 text = '\n'.join(self.body)
154 if not bb.methodpool.parsed_module(self.root): 156 if not bb.methodpool.parsed_module(self.define):
155 bb.methodpool.insert_method(self.root, text, self.fn) 157 bb.methodpool.insert_method(self.define, text, self.filename)
156 bb.data.setVarFlag(self.func_name, "func", 1, data) 158 bb.data.setVarFlag(self.function, "func", 1, data)
157 bb.data.setVarFlag(self.func_name, "python", 1, data) 159 bb.data.setVarFlag(self.function, "python", 1, data)
158 bb.data.setVar(self.func_name, text, data) 160 bb.data.setVar(self.function, text, data)
159 161
160class MethodFlagsNode(AstNode): 162class MethodFlagsNode(AstNode):
161 def __init__(self, key, m): 163 def __init__(self, filename, lineno, key, m):
164 AstNode.__init__(self, filename, lineno)
162 self.key = key 165 self.key = key
163 self.m = m 166 self.m = m
164 167
@@ -178,7 +181,8 @@ class MethodFlagsNode(AstNode):
178 bb.data.delVarFlag(self.key, "fakeroot", data) 181 bb.data.delVarFlag(self.key, "fakeroot", data)
179 182
180class ExportFuncsNode(AstNode): 183class ExportFuncsNode(AstNode):
181 def __init__(self, fns, classes): 184 def __init__(self, filename, lineno, fns, classes):
185 AstNode.__init__(self, filename, lineno)
182 self.n = fns.split() 186 self.n = fns.split()
183 self.classes = classes 187 self.classes = classes
184 188
@@ -217,7 +221,8 @@ class ExportFuncsNode(AstNode):
217 bb.data.setVarFlag(var, 'export_func', '1', data) 221 bb.data.setVarFlag(var, 'export_func', '1', data)
218 222
219class AddTaskNode(AstNode): 223class AddTaskNode(AstNode):
220 def __init__(self, func, before, after): 224 def __init__(self, filename, lineno, func, before, after):
225 AstNode.__init__(self, filename, lineno)
221 self.func = func 226 self.func = func
222 self.before = before 227 self.before = before
223 self.after = after 228 self.after = after
@@ -248,7 +253,8 @@ class AddTaskNode(AstNode):
248 bb.data.setVarFlag(entry, "deps", [var] + existing, data) 253 bb.data.setVarFlag(entry, "deps", [var] + existing, data)
249 254
250class BBHandlerNode(AstNode): 255class BBHandlerNode(AstNode):
251 def __init__(self, fns): 256 def __init__(self, filename, lineno, fns):
257 AstNode.__init__(self, filename, lineno)
252 self.hs = fns.split() 258 self.hs = fns.split()
253 259
254 def eval(self, data): 260 def eval(self, data):
@@ -259,48 +265,49 @@ class BBHandlerNode(AstNode):
259 bb.data.setVar('__BBHANDLERS', bbhands, data) 265 bb.data.setVar('__BBHANDLERS', bbhands, data)
260 266
261class InheritNode(AstNode): 267class InheritNode(AstNode):
262 def __init__(self, classes): 268 def __init__(self, filename, lineno, classes):
269 AstNode.__init__(self, filename, lineno)
263 self.classes = classes 270 self.classes = classes
264 271
265 def eval(self, data): 272 def eval(self, data):
266 bb.parse.BBHandler.inherit(self.classes, data) 273 bb.parse.BBHandler.inherit(self.classes, data)
267 274
268def handleInclude(statements, m, fn, lineno, force): 275def handleInclude(statements, filename, lineno, m, force):
269 statements.append(IncludeNode(m.group(1), fn, lineno, force)) 276 statements.append(IncludeNode(filename, lineno, m.group(1), force))
270 277
271def handleExport(statements, m): 278def handleExport(statements, filename, lineno, m):
272 statements.append(ExportNode(m.group(1))) 279 statements.append(ExportNode(filename, lineno, m.group(1)))
273 280
274def handleData(statements, groupd): 281def handleData(statements, filename, lineno, groupd):
275 statements.append(DataNode(groupd)) 282 statements.append(DataNode(filename, lineno, groupd))
276 283
277def handleMethod(statements, func_name, lineno, fn, body): 284def handleMethod(statements, filename, lineno, func_name, body):
278 statements.append(MethodNode(func_name, body, lineno, fn)) 285 statements.append(MethodNode(filename, lineno, func_name, body))
279 286
280def handlePythonMethod(statements, funcname, root, body, fn): 287def handlePythonMethod(statements, filename, lineno, funcname, root, body):
281 statements.append(PythonMethodNode(funcname, root, body, fn)) 288 statements.append(PythonMethodNode(filename, lineno, funcname, root, body))
282 289
283def handleMethodFlags(statements, key, m): 290def handleMethodFlags(statements, filename, lineno, key, m):
284 statements.append(MethodFlagsNode(key, m)) 291 statements.append(MethodFlagsNode(filename, lineno, key, m))
285 292
286def handleExportFuncs(statements, m, classes): 293def handleExportFuncs(statements, filename, lineno, m, classes):
287 statements.append(ExportFuncsNode(m.group(1), classes)) 294 statements.append(ExportFuncsNode(filename, lineno, m.group(1), classes))
288 295
289def handleAddTask(statements, m): 296def handleAddTask(statements, filename, lineno, m):
290 func = m.group("func") 297 func = m.group("func")
291 before = m.group("before") 298 before = m.group("before")
292 after = m.group("after") 299 after = m.group("after")
293 if func is None: 300 if func is None:
294 return 301 return
295 302
296 statements.append(AddTaskNode(func, before, after)) 303 statements.append(AddTaskNode(filename, lineno, func, before, after))
297 304
298def handleBBHandlers(statements, m): 305def handleBBHandlers(statements, filename, lineno, m):
299 statements.append(BBHandlerNode(m.group(1))) 306 statements.append(BBHandlerNode(filename, lineno, m.group(1)))
300 307
301def handleInherit(statements, m): 308def handleInherit(statements, filename, lineno, m):
302 classes = m.group(1) 309 classes = m.group(1)
303 statements.append(InheritNode(classes.split())) 310 statements.append(InheritNode(filename, lineno, classes.split()))
304 311
305def finalize(fn, d, variant = None): 312def finalize(fn, d, variant = None):
306 for lazykey in bb.data.getVar("__lazy_assigned", d) or (): 313 for lazykey in bb.data.getVar("__lazy_assigned", d) or ():
diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py
index 81554b9435..4a938b911c 100644
--- a/bitbake/lib/bb/parse/parse_py/BBHandler.py
+++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py
@@ -172,7 +172,7 @@ def feeder(lineno, s, fn, root, statements):
172 if __infunc__: 172 if __infunc__:
173 if s == '}': 173 if s == '}':
174 __body__.append('') 174 __body__.append('')
175 ast.handleMethod(statements, __infunc__, lineno, fn, __body__) 175 ast.handleMethod(statements, fn, lineno, __infunc__, __body__)
176 __infunc__ = "" 176 __infunc__ = ""
177 __body__ = [] 177 __body__ = []
178 else: 178 else:
@@ -185,7 +185,8 @@ def feeder(lineno, s, fn, root, statements):
185 __body__.append(s) 185 __body__.append(s)
186 return 186 return
187 else: 187 else:
188 ast.handlePythonMethod(statements, __inpython__, root, __body__, fn) 188 ast.handlePythonMethod(statements, fn, lineno, __inpython__,
189 root, __body__)
189 __body__ = [] 190 __body__ = []
190 __inpython__ = False 191 __inpython__ = False
191 192
@@ -206,7 +207,7 @@ def feeder(lineno, s, fn, root, statements):
206 m = __func_start_regexp__.match(s) 207 m = __func_start_regexp__.match(s)
207 if m: 208 if m:
208 __infunc__ = m.group("func") or "__anonymous" 209 __infunc__ = m.group("func") or "__anonymous"
209 ast.handleMethodFlags(statements, __infunc__, m) 210 ast.handleMethodFlags(statements, fn, lineno, __infunc__, m)
210 return 211 return
211 212
212 m = __def_regexp__.match(s) 213 m = __def_regexp__.match(s)
@@ -218,22 +219,22 @@ def feeder(lineno, s, fn, root, statements):
218 219
219 m = __export_func_regexp__.match(s) 220 m = __export_func_regexp__.match(s)
220 if m: 221 if m:
221 ast.handleExportFuncs(statements, m, classes) 222 ast.handleExportFuncs(statements, fn, lineno, m, classes)
222 return 223 return
223 224
224 m = __addtask_regexp__.match(s) 225 m = __addtask_regexp__.match(s)
225 if m: 226 if m:
226 ast.handleAddTask(statements, m) 227 ast.handleAddTask(statements, fn, lineno, m)
227 return 228 return
228 229
229 m = __addhandler_regexp__.match(s) 230 m = __addhandler_regexp__.match(s)
230 if m: 231 if m:
231 ast.handleBBHandlers(statements, m) 232 ast.handleBBHandlers(statements, fn, lineno, m)
232 return 233 return
233 234
234 m = __inherit_regexp__.match(s) 235 m = __inherit_regexp__.match(s)
235 if m: 236 if m:
236 ast.handleInherit(statements, m) 237 ast.handleInherit(statements, fn, lineno, m)
237 return 238 return
238 239
239 return ConfHandler.feeder(lineno, s, fn, statements) 240 return ConfHandler.feeder(lineno, s, fn, statements)
diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py
index d90f5d868e..fc239a3540 100644
--- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py
+++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py
@@ -113,22 +113,22 @@ def feeder(lineno, s, fn, statements):
113 m = __config_regexp__.match(s) 113 m = __config_regexp__.match(s)
114 if m: 114 if m:
115 groupd = m.groupdict() 115 groupd = m.groupdict()
116 ast.handleData(statements, groupd) 116 ast.handleData(statements, fn, lineno, groupd)
117 return 117 return
118 118
119 m = __include_regexp__.match(s) 119 m = __include_regexp__.match(s)
120 if m: 120 if m:
121 ast.handleInclude(statements, m, fn, lineno, False) 121 ast.handleInclude(statements, fn, lineno, m, False)
122 return 122 return
123 123
124 m = __require_regexp__.match(s) 124 m = __require_regexp__.match(s)
125 if m: 125 if m:
126 ast.handleInclude(statements, m, fn, lineno, True) 126 ast.handleInclude(statements, fn, lineno, m, True)
127 return 127 return
128 128
129 m = __export_regexp__.match(s) 129 m = __export_regexp__.match(s)
130 if m: 130 if m:
131 ast.handleExport(statements, m) 131 ast.handleExport(statements, fn, lineno, m)
132 return 132 return
133 133
134 raise ParseError("%s:%d: unparsed line: '%s'" % (fn, lineno, s)); 134 raise ParseError("%s:%d: unparsed line: '%s'" % (fn, lineno, s));