summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/parse/ast.py22
-rw-r--r--bitbake/lib/bb/parse/parse_py/BBHandler.py10
2 files changed, 31 insertions, 1 deletions
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py
index d30b688965..7581d003fd 100644
--- a/bitbake/lib/bb/parse/ast.py
+++ b/bitbake/lib/bb/parse/ast.py
@@ -314,6 +314,16 @@ class InheritNode(AstNode):
314 def eval(self, data): 314 def eval(self, data):
315 bb.parse.BBHandler.inherit(self.classes, self.filename, self.lineno, data) 315 bb.parse.BBHandler.inherit(self.classes, self.filename, self.lineno, data)
316 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
317def handleInclude(statements, filename, lineno, m, force): 327def handleInclude(statements, filename, lineno, m, force):
318 statements.append(IncludeNode(filename, lineno, m.group(1), force)) 328 statements.append(IncludeNode(filename, lineno, m.group(1), force))
319 329
@@ -364,6 +374,10 @@ def handleInherit(statements, filename, lineno, m):
364 classes = m.group(1) 374 classes = m.group(1)
365 statements.append(InheritNode(filename, lineno, classes)) 375 statements.append(InheritNode(filename, lineno, classes))
366 376
377def handleInheritDeferred(statements, filename, lineno, m):
378 classes = m.group(1)
379 statements.append(InheritDeferredNode(filename, lineno, classes))
380
367def runAnonFuncs(d): 381def runAnonFuncs(d):
368 code = [] 382 code = []
369 for funcname in d.getVar("__BBANONFUNCS", False) or []: 383 for funcname in d.getVar("__BBANONFUNCS", False) or []:
@@ -430,6 +444,14 @@ def multi_finalize(fn, d):
430 logger.debug("Appending .bbappend file %s to %s", append, fn) 444 logger.debug("Appending .bbappend file %s to %s", append, fn)
431 bb.parse.BBHandler.handle(append, d, True) 445 bb.parse.BBHandler.handle(append, d, True)
432 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
433 onlyfinalise = d.getVar("__ONLYFINALISE", False) 455 onlyfinalise = d.getVar("__ONLYFINALISE", False)
434 456
435 safe_d = d 457 safe_d = d
diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py
index 4d5b45e1ef..cd1c998f8f 100644
--- a/bitbake/lib/bb/parse/parse_py/BBHandler.py
+++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py
@@ -21,6 +21,7 @@ from .ConfHandler import include, init
21 21
22__func_start_regexp__ = re.compile(r"(((?P<py>python(?=(\s|\()))|(?P<fr>fakeroot(?=\s)))\s*)*(?P<func>[\w\.\-\+\{\}\$:]+)?\s*\(\s*\)\s*{$" ) 22__func_start_regexp__ = re.compile(r"(((?P<py>python(?=(\s|\()))|(?P<fr>fakeroot(?=\s)))\s*)*(?P<func>[\w\.\-\+\{\}\$:]+)?\s*\(\s*\)\s*{$" )
23__inherit_regexp__ = re.compile(r"inherit\s+(.+)" ) 23__inherit_regexp__ = re.compile(r"inherit\s+(.+)" )
24__inherit_def_regexp__ = re.compile(r"inherit_defer\s+(.+)" )
24__export_func_regexp__ = re.compile(r"EXPORT_FUNCTIONS\s+(.+)" ) 25__export_func_regexp__ = re.compile(r"EXPORT_FUNCTIONS\s+(.+)" )
25__addtask_regexp__ = re.compile(r"addtask\s+(?P<func>\w+)\s*((before\s*(?P<before>((.*(?=after))|(.*))))|(after\s*(?P<after>((.*(?=before))|(.*)))))*") 26__addtask_regexp__ = re.compile(r"addtask\s+(?P<func>\w+)\s*((before\s*(?P<before>((.*(?=after))|(.*))))|(after\s*(?P<after>((.*(?=before))|(.*)))))*")
26__deltask_regexp__ = re.compile(r"deltask\s+(.+)") 27__deltask_regexp__ = re.compile(r"deltask\s+(.+)")
@@ -40,8 +41,10 @@ def supports(fn, d):
40 """Return True if fn has a supported extension""" 41 """Return True if fn has a supported extension"""
41 return os.path.splitext(fn)[-1] in [".bb", ".bbclass", ".inc"] 42 return os.path.splitext(fn)[-1] in [".bb", ".bbclass", ".inc"]
42 43
43def inherit(files, fn, lineno, d): 44def inherit(files, fn, lineno, d, deferred=False):
44 __inherit_cache = d.getVar('__inherit_cache', False) or [] 45 __inherit_cache = d.getVar('__inherit_cache', False) or []
46 #if "${" in files and not deferred:
47 # bb.warn("%s:%s has non deferred conditional inherit" % (fn, lineno))
45 files = d.expand(files).split() 48 files = d.expand(files).split()
46 for file in files: 49 for file in files:
47 classtype = d.getVar("__bbclasstype", False) 50 classtype = d.getVar("__bbclasstype", False)
@@ -265,6 +268,11 @@ def feeder(lineno, s, fn, root, statements, eof=False):
265 ast.handleInherit(statements, fn, lineno, m) 268 ast.handleInherit(statements, fn, lineno, m)
266 return 269 return
267 270
271 m = __inherit_def_regexp__.match(s)
272 if m:
273 ast.handleInheritDeferred(statements, fn, lineno, m)
274 return
275
268 return ConfHandler.feeder(lineno, s, fn, statements, conffile=False) 276 return ConfHandler.feeder(lineno, s, fn, statements, conffile=False)
269 277
270# Add us to the handlers list 278# Add us to the handlers list