diff options
| -rw-r--r-- | bitbake/lib/bb/parse/ast.py | 36 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/parse_py/ConfHandler.py | 6 |
2 files changed, 42 insertions, 0 deletions
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 001ba8d289..7abefab2c2 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py | |||
| @@ -326,6 +326,37 @@ class InheritDeferredNode(AstNode): | |||
| 326 | inherits.append(self.inherit) | 326 | inherits.append(self.inherit) |
| 327 | data.setVar('__BBDEFINHERITS', inherits) | 327 | data.setVar('__BBDEFINHERITS', inherits) |
| 328 | 328 | ||
| 329 | class AddFragmentsNode(AstNode): | ||
| 330 | def __init__(self, filename, lineno, fragments_path_prefix, fragments_variable): | ||
| 331 | AstNode.__init__(self, filename, lineno) | ||
| 332 | self.fragments_path_prefix = fragments_path_prefix | ||
| 333 | self.fragments_variable = fragments_variable | ||
| 334 | |||
| 335 | def eval(self, data): | ||
| 336 | # No need to use mark_dependency since we would only match a fragment | ||
| 337 | # from a specific layer and there can only be a single layer with a | ||
| 338 | # given namespace. | ||
| 339 | def find_fragment(layers, layerid, full_fragment_name): | ||
| 340 | for layerpath in layers.split(): | ||
| 341 | candidate_fragment_path = os.path.join(layerpath, full_fragment_name) | ||
| 342 | if os.path.exists(candidate_fragment_path) and bb.utils.get_file_layer(candidate_fragment_path, data) == layerid: | ||
| 343 | return candidate_fragment_path | ||
| 344 | return None | ||
| 345 | |||
| 346 | fragments = data.getVar(self.fragments_variable) | ||
| 347 | layers = data.getVar('BBLAYERS') | ||
| 348 | |||
| 349 | if not fragments: | ||
| 350 | return | ||
| 351 | for f in fragments.split(): | ||
| 352 | layerid, fragment_name = f.split('/', 1) | ||
| 353 | full_fragment_name = data.expand("{}/{}.conf".format(self.fragments_path_prefix, fragment_name)) | ||
| 354 | fragment_path = find_fragment(layers, layerid, full_fragment_name) | ||
| 355 | if fragment_path: | ||
| 356 | bb.parse.ConfHandler.include(self.filename, fragment_path, self.lineno, data, "include fragment") | ||
| 357 | else: | ||
| 358 | bb.error("Could not find fragment {} in enabled layers: {}".format(f, layers)) | ||
| 359 | |||
| 329 | def handleInclude(statements, filename, lineno, m, force): | 360 | def handleInclude(statements, filename, lineno, m, force): |
| 330 | statements.append(IncludeNode(filename, lineno, m.group(1), force)) | 361 | statements.append(IncludeNode(filename, lineno, m.group(1), force)) |
| 331 | 362 | ||
| @@ -370,6 +401,11 @@ def handleInheritDeferred(statements, filename, lineno, m): | |||
| 370 | classes = m.group(1) | 401 | classes = m.group(1) |
| 371 | statements.append(InheritDeferredNode(filename, lineno, classes)) | 402 | statements.append(InheritDeferredNode(filename, lineno, classes)) |
| 372 | 403 | ||
| 404 | def handleAddFragments(statements, filename, lineno, m): | ||
| 405 | fragments_path_prefix = m.group(1) | ||
| 406 | fragments_variable = m.group(2) | ||
| 407 | statements.append(AddFragmentsNode(filename, lineno, fragments_path_prefix, fragments_variable)) | ||
| 408 | |||
| 373 | def runAnonFuncs(d): | 409 | def runAnonFuncs(d): |
| 374 | code = [] | 410 | code = [] |
| 375 | for funcname in d.getVar("__BBANONFUNCS", False) or []: | 411 | for funcname in d.getVar("__BBANONFUNCS", False) or []: |
diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py index 27665443dd..35321dacfe 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py | |||
| @@ -47,6 +47,7 @@ __export_regexp__ = re.compile( r"export\s+([a-zA-Z0-9\-_+.${}/~]+)$" ) | |||
| 47 | __unset_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/~]+)$" ) | 47 | __unset_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/~]+)$" ) |
| 48 | __unset_flag_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/~]+)\[([a-zA-Z0-9\-_+.][a-zA-Z0-9\-_+.@]+)\]$" ) | 48 | __unset_flag_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/~]+)\[([a-zA-Z0-9\-_+.][a-zA-Z0-9\-_+.@]+)\]$" ) |
| 49 | __addpylib_regexp__ = re.compile(r"addpylib\s+(.+)\s+(.+)" ) | 49 | __addpylib_regexp__ = re.compile(r"addpylib\s+(.+)\s+(.+)" ) |
| 50 | __addfragments_regexp__ = re.compile(r"addfragments\s+(.+)\s+(.+)" ) | ||
| 50 | 51 | ||
| 51 | def init(data): | 52 | def init(data): |
| 52 | return | 53 | return |
| @@ -197,6 +198,11 @@ def feeder(lineno, s, fn, statements, baseconfig=False, conffile=True): | |||
| 197 | ast.handlePyLib(statements, fn, lineno, m) | 198 | ast.handlePyLib(statements, fn, lineno, m) |
| 198 | return | 199 | return |
| 199 | 200 | ||
| 201 | m = __addfragments_regexp__.match(s) | ||
| 202 | if m: | ||
| 203 | ast.handleAddFragments(statements, fn, lineno, m) | ||
| 204 | return | ||
| 205 | |||
| 200 | raise ParseError("unparsed line: '%s'" % s, fn, lineno); | 206 | raise ParseError("unparsed line: '%s'" % s, fn, lineno); |
| 201 | 207 | ||
| 202 | # Add us to the handlers list | 208 | # Add us to the handlers list |
