bitbake: parse: add support for 'addfragments' directive

It takes two parameters:
- location prefix for fragments
- name of variable that holds the list of enabled fragments, each of them prefixed
by layer id

Implementation of this directive essentially expands the fragment list
obtained from the variable into absolute fragment paths and hands them to the
implementation of 'require'.

(Bitbake rev: f687746703e7b096c5480668fd4f49bd4951182b)

Signed-off-by: Alexander Kanavin <alex@linutronix.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexander Kanavin
2024-12-05 18:13:38 +01:00
committed by Richard Purdie
parent 186b7c58d5
commit 3de3bda4c4
2 changed files with 42 additions and 0 deletions

View File

@@ -326,6 +326,37 @@ class InheritDeferredNode(AstNode):
inherits.append(self.inherit)
data.setVar('__BBDEFINHERITS', inherits)
class AddFragmentsNode(AstNode):
def __init__(self, filename, lineno, fragments_path_prefix, fragments_variable):
AstNode.__init__(self, filename, lineno)
self.fragments_path_prefix = fragments_path_prefix
self.fragments_variable = fragments_variable
def eval(self, data):
# No need to use mark_dependency since we would only match a fragment
# from a specific layer and there can only be a single layer with a
# given namespace.
def find_fragment(layers, layerid, full_fragment_name):
for layerpath in layers.split():
candidate_fragment_path = os.path.join(layerpath, full_fragment_name)
if os.path.exists(candidate_fragment_path) and bb.utils.get_file_layer(candidate_fragment_path, data) == layerid:
return candidate_fragment_path
return None
fragments = data.getVar(self.fragments_variable)
layers = data.getVar('BBLAYERS')
if not fragments:
return
for f in fragments.split():
layerid, fragment_name = f.split('/', 1)
full_fragment_name = data.expand("{}/{}.conf".format(self.fragments_path_prefix, fragment_name))
fragment_path = find_fragment(layers, layerid, full_fragment_name)
if fragment_path:
bb.parse.ConfHandler.include(self.filename, fragment_path, self.lineno, data, "include fragment")
else:
bb.error("Could not find fragment {} in enabled layers: {}".format(f, layers))
def handleInclude(statements, filename, lineno, m, force):
statements.append(IncludeNode(filename, lineno, m.group(1), force))
@@ -370,6 +401,11 @@ def handleInheritDeferred(statements, filename, lineno, m):
classes = m.group(1)
statements.append(InheritDeferredNode(filename, lineno, classes))
def handleAddFragments(statements, filename, lineno, m):
fragments_path_prefix = m.group(1)
fragments_variable = m.group(2)
statements.append(AddFragmentsNode(filename, lineno, fragments_path_prefix, fragments_variable))
def runAnonFuncs(d):
code = []
for funcname in d.getVar("__BBANONFUNCS", False) or []:

View File

@@ -47,6 +47,7 @@ __export_regexp__ = re.compile( r"export\s+([a-zA-Z0-9\-_+.${}/~]+)$" )
__unset_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/~]+)$" )
__unset_flag_regexp__ = re.compile( r"unset\s+([a-zA-Z0-9\-_+.${}/~]+)\[([a-zA-Z0-9\-_+.][a-zA-Z0-9\-_+.@]+)\]$" )
__addpylib_regexp__ = re.compile(r"addpylib\s+(.+)\s+(.+)" )
__addfragments_regexp__ = re.compile(r"addfragments\s+(.+)\s+(.+)" )
def init(data):
return
@@ -197,6 +198,11 @@ def feeder(lineno, s, fn, statements, baseconfig=False, conffile=True):
ast.handlePyLib(statements, fn, lineno, m)
return
m = __addfragments_regexp__.match(s)
if m:
ast.handleAddFragments(statements, fn, lineno, m)
return
raise ParseError("unparsed line: '%s'" % s, fn, lineno);
# Add us to the handlers list