summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/parse/ast.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/parse/ast.py')
-rw-r--r--bitbake/lib/bb/parse/ast.py85
1 files changed, 79 insertions, 6 deletions
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py
index 50a88f7da7..7581d003fd 100644
--- a/bitbake/lib/bb/parse/ast.py
+++ b/bitbake/lib/bb/parse/ast.py
@@ -9,6 +9,7 @@
9# SPDX-License-Identifier: GPL-2.0-only 9# SPDX-License-Identifier: GPL-2.0-only
10# 10#
11 11
12import sys
12import bb 13import bb
13from bb import methodpool 14from bb import methodpool
14from bb.parse import logger 15from bb.parse import logger
@@ -130,6 +131,10 @@ class DataNode(AstNode):
130 else: 131 else:
131 val = groupd["value"] 132 val = groupd["value"]
132 133
134 if ":append" in key or ":remove" in key or ":prepend" in key:
135 if op in ["append", "prepend", "postdot", "predot", "ques"]:
136 bb.warn(key + " " + groupd[op] + " is not a recommended operator combination, please replace it.")
137
133 flag = None 138 flag = None
134 if 'flag' in groupd and groupd['flag'] is not None: 139 if 'flag' in groupd and groupd['flag'] is not None:
135 flag = groupd['flag'] 140 flag = groupd['flag']
@@ -145,7 +150,7 @@ class DataNode(AstNode):
145 data.setVar(key, val, parsing=True, **loginfo) 150 data.setVar(key, val, parsing=True, **loginfo)
146 151
147class MethodNode(AstNode): 152class MethodNode(AstNode):
148 tr_tbl = str.maketrans('/.+-@%&', '_______') 153 tr_tbl = str.maketrans('/.+-@%&~', '________')
149 154
150 def __init__(self, filename, lineno, func_name, body, python, fakeroot): 155 def __init__(self, filename, lineno, func_name, body, python, fakeroot):
151 AstNode.__init__(self, filename, lineno) 156 AstNode.__init__(self, filename, lineno)
@@ -206,10 +211,12 @@ class ExportFuncsNode(AstNode):
206 211
207 def eval(self, data): 212 def eval(self, data):
208 213
214 sentinel = " # Export function set\n"
209 for func in self.n: 215 for func in self.n:
210 calledfunc = self.classname + "_" + func 216 calledfunc = self.classname + "_" + func
211 217
212 if data.getVar(func, False) and not data.getVarFlag(func, 'export_func', False): 218 basevar = data.getVar(func, False)
219 if basevar and sentinel not in basevar:
213 continue 220 continue
214 221
215 if data.getVar(func, False): 222 if data.getVar(func, False):
@@ -219,19 +226,18 @@ class ExportFuncsNode(AstNode):
219 for flag in [ "func", "python" ]: 226 for flag in [ "func", "python" ]:
220 if data.getVarFlag(calledfunc, flag, False): 227 if data.getVarFlag(calledfunc, flag, False):
221 data.setVarFlag(func, flag, data.getVarFlag(calledfunc, flag, False)) 228 data.setVarFlag(func, flag, data.getVarFlag(calledfunc, flag, False))
222 for flag in [ "dirs" ]: 229 for flag in ["dirs", "cleandirs", "fakeroot"]:
223 if data.getVarFlag(func, flag, False): 230 if data.getVarFlag(func, flag, False):
224 data.setVarFlag(calledfunc, flag, data.getVarFlag(func, flag, False)) 231 data.setVarFlag(calledfunc, flag, data.getVarFlag(func, flag, False))
225 data.setVarFlag(func, "filename", "autogenerated") 232 data.setVarFlag(func, "filename", "autogenerated")
226 data.setVarFlag(func, "lineno", 1) 233 data.setVarFlag(func, "lineno", 1)
227 234
228 if data.getVarFlag(calledfunc, "python", False): 235 if data.getVarFlag(calledfunc, "python", False):
229 data.setVar(func, " bb.build.exec_func('" + calledfunc + "', d)\n", parsing=True) 236 data.setVar(func, sentinel + " bb.build.exec_func('" + calledfunc + "', d)\n", parsing=True)
230 else: 237 else:
231 if "-" in self.classname: 238 if "-" in self.classname:
232 bb.fatal("The classname %s contains a dash character and is calling an sh function %s using EXPORT_FUNCTIONS. Since a dash is illegal in sh function names, this cannot work, please rename the class or don't use EXPORT_FUNCTIONS." % (self.classname, calledfunc)) 239 bb.fatal("The classname %s contains a dash character and is calling an sh function %s using EXPORT_FUNCTIONS. Since a dash is illegal in sh function names, this cannot work, please rename the class or don't use EXPORT_FUNCTIONS." % (self.classname, calledfunc))
233 data.setVar(func, " " + calledfunc + "\n", parsing=True) 240 data.setVar(func, sentinel + " " + calledfunc + "\n", parsing=True)
234 data.setVarFlag(func, 'export_func', '1')
235 241
236class AddTaskNode(AstNode): 242class AddTaskNode(AstNode):
237 def __init__(self, filename, lineno, func, before, after): 243 def __init__(self, filename, lineno, func, before, after):
@@ -265,6 +271,41 @@ class BBHandlerNode(AstNode):
265 data.setVarFlag(h, "handler", 1) 271 data.setVarFlag(h, "handler", 1)
266 data.setVar('__BBHANDLERS', bbhands) 272 data.setVar('__BBHANDLERS', bbhands)
267 273
274class PyLibNode(AstNode):
275 def __init__(self, filename, lineno, libdir, namespace):
276 AstNode.__init__(self, filename, lineno)
277 self.libdir = libdir
278 self.namespace = namespace
279
280 def eval(self, data):
281 global_mods = (data.getVar("BB_GLOBAL_PYMODULES") or "").split()
282 for m in global_mods:
283 if m not in bb.utils._context:
284 bb.utils._context[m] = __import__(m)
285
286 libdir = data.expand(self.libdir)
287 if libdir not in sys.path:
288 sys.path.append(libdir)
289 try:
290 bb.utils._context[self.namespace] = __import__(self.namespace)
291 toimport = getattr(bb.utils._context[self.namespace], "BBIMPORTS", [])
292 for i in toimport:
293 bb.utils._context[self.namespace] = __import__(self.namespace + "." + i)
294 mod = getattr(bb.utils._context[self.namespace], i)
295 fn = getattr(mod, "__file__")
296 funcs = {}
297 for f in dir(mod):
298 if f.startswith("_"):
299 continue
300 fcall = getattr(mod, f)
301 if not callable(fcall):
302 continue
303 funcs[f] = fcall
304 bb.codeparser.add_module_functions(fn, funcs, "%s.%s" % (self.namespace, i))
305
306 except AttributeError as e:
307 bb.error("Error importing OE modules: %s" % str(e))
308
268class InheritNode(AstNode): 309class InheritNode(AstNode):
269 def __init__(self, filename, lineno, classes): 310 def __init__(self, filename, lineno, classes):
270 AstNode.__init__(self, filename, lineno) 311 AstNode.__init__(self, filename, lineno)
@@ -273,6 +314,16 @@ class InheritNode(AstNode):
273 def eval(self, data): 314 def eval(self, data):
274 bb.parse.BBHandler.inherit(self.classes, self.filename, self.lineno, data) 315 bb.parse.BBHandler.inherit(self.classes, self.filename, self.lineno, data)
275 316
317class InheritDeferredNode(AstNode):
318 def __init__(self, filename, lineno, classes):
319 AstNode.__init__(self, filename, lineno)
320 self.inherit = (classes, filename, lineno)
321
322 def eval(self, data):
323 inherits = data.getVar('__BBDEFINHERITS', False) or []
324 inherits.append(self.inherit)
325 data.setVar('__BBDEFINHERITS', inherits)
326
276def handleInclude(statements, filename, lineno, m, force): 327def handleInclude(statements, filename, lineno, m, force):
277 statements.append(IncludeNode(filename, lineno, m.group(1), force)) 328 statements.append(IncludeNode(filename, lineno, m.group(1), force))
278 329
@@ -316,10 +367,17 @@ def handleDelTask(statements, filename, lineno, m):
316def handleBBHandlers(statements, filename, lineno, m): 367def handleBBHandlers(statements, filename, lineno, m):
317 statements.append(BBHandlerNode(filename, lineno, m.group(1))) 368 statements.append(BBHandlerNode(filename, lineno, m.group(1)))
318 369
370def handlePyLib(statements, filename, lineno, m):
371 statements.append(PyLibNode(filename, lineno, m.group(1), m.group(2)))
372
319def handleInherit(statements, filename, lineno, m): 373def handleInherit(statements, filename, lineno, m):
320 classes = m.group(1) 374 classes = m.group(1)
321 statements.append(InheritNode(filename, lineno, classes)) 375 statements.append(InheritNode(filename, lineno, classes))
322 376
377def handleInheritDeferred(statements, filename, lineno, m):
378 classes = m.group(1)
379 statements.append(InheritDeferredNode(filename, lineno, classes))
380
323def runAnonFuncs(d): 381def runAnonFuncs(d):
324 code = [] 382 code = []
325 for funcname in d.getVar("__BBANONFUNCS", False) or []: 383 for funcname in d.getVar("__BBANONFUNCS", False) or []:
@@ -329,6 +387,10 @@ def runAnonFuncs(d):
329def finalize(fn, d, variant = None): 387def finalize(fn, d, variant = None):
330 saved_handlers = bb.event.get_handlers().copy() 388 saved_handlers = bb.event.get_handlers().copy()
331 try: 389 try:
390 # Found renamed variables. Exit immediately
391 if d.getVar("_FAILPARSINGERRORHANDLED", False) == True:
392 raise bb.BBHandledException()
393
332 for var in d.getVar('__BBHANDLERS', False) or []: 394 for var in d.getVar('__BBHANDLERS', False) or []:
333 # try to add the handler 395 # try to add the handler
334 handlerfn = d.getVarFlag(var, "filename", False) 396 handlerfn = d.getVarFlag(var, "filename", False)
@@ -353,6 +415,9 @@ def finalize(fn, d, variant = None):
353 415
354 d.setVar('BBINCLUDED', bb.parse.get_file_depends(d)) 416 d.setVar('BBINCLUDED', bb.parse.get_file_depends(d))
355 417
418 if d.getVar('__BBAUTOREV_SEEN') and d.getVar('__BBSRCREV_SEEN') and not d.getVar("__BBAUTOREV_ACTED_UPON"):
419 bb.fatal("AUTOREV/SRCPV set too late for the fetcher to work properly, please set the variables earlier in parsing. Erroring instead of later obtuse build failures.")
420
356 bb.event.fire(bb.event.RecipeParsed(fn), d) 421 bb.event.fire(bb.event.RecipeParsed(fn), d)
357 finally: 422 finally:
358 bb.event.set_handlers(saved_handlers) 423 bb.event.set_handlers(saved_handlers)
@@ -379,6 +444,14 @@ def multi_finalize(fn, d):
379 logger.debug("Appending .bbappend file %s to %s", append, fn) 444 logger.debug("Appending .bbappend file %s to %s", append, fn)
380 bb.parse.BBHandler.handle(append, d, True) 445 bb.parse.BBHandler.handle(append, d, True)
381 446
447 while True:
448 inherits = d.getVar('__BBDEFINHERITS', False) or []
449 if not inherits:
450 break
451 inherit, filename, lineno = inherits.pop(0)
452 d.setVar('__BBDEFINHERITS', inherits)
453 bb.parse.BBHandler.inherit(inherit, filename, lineno, d, deferred=True)
454
382 onlyfinalise = d.getVar("__ONLYFINALISE", False) 455 onlyfinalise = d.getVar("__ONLYFINALISE", False)
383 456
384 safe_d = d 457 safe_d = d