@@ -703,3 +703,33 @@ class FilemodeTests(unittest.TestCase):
with self.assertRaises(ValueError):
bb.utils.to_filemode("999")
+class LayerPathTests(unittest.TestCase):
+ def parsehelper(self, content, suffix=".bb"):
+ f = tempfile.NamedTemporaryFile(mode="wt", suffix=suffix)
+ f.write(content)
+ f.flush()
+ return f
+
+ def test_layer_path(self):
+ config = """
+BBPATH = "/layer/core:/layer/bsptwo:/layer/bsp:/layer/malformed"
+BBFILE_PATTERN_core = "^/layer/core/"
+BBFILE_PATTERN_bsp = "^/layer/bsp/"
+BBFILE_PATTERN_bsptwo = "^/layer/bsptwo/"
+BBFILE_PATTERN_malformed = "^/layer/mal-formed/"
+ """
+ d = bb.data.init()
+ bb.parse.siggen = bb.siggen.init(d)
+ with self.parsehelper(config) as f:
+ d = bb.parse.handle(f.name, d)['']
+
+ self.assertEqual(bb.utils.layer_path("core", d), "/layer/core")
+ self.assertEqual(bb.utils.layer_path("bsp", d), "/layer/bsp")
+ self.assertEqual(bb.utils.layer_path("bsptwo", d), "/layer/bsptwo")
+
+ with self.assertRaises(KeyError):
+ bb.utils.layer_path("no-such-layer", d)
+
+ with self.assertRaises(KeyError):
+ bb.utils.layer_path("malformed", d)
+
@@ -1902,6 +1902,22 @@ def get_file_layer(filename, d, collection_res={}):
return result
+def layer_path(layername, d):
+ """
+ Return the path to the specified layer, or raises KeyError if the layer
+ cannot be found.
+ """
+ bbpath = d.getVar("BBPATH").split(":")
+ pattern = d.getVar('BBFILE_PATTERN_' + layername)
+ if not pattern:
+ raise KeyError(f"Cannot find BBFILE_PATTERN for {layername}")
+
+ # Sort and reverse to protect against BBFILE_PATTERNs that don't have
+ # trailing slashes
+ for path in reversed(sorted(bbpath)):
+ if re.match(pattern, path + "/"):
+ return path
+ raise KeyError(f"Could not match BBFILE_PATTERN for {layername}")
# Constant taken from http://linux.die.net/include/linux/prctl.h
PR_SET_PDEATHSIG = 1
Add layer_path() which will return the path to a layer. Useful to programatically find other layers at build time, or from tinfoil. Signed-off-by: Ross Burton <ross.burton@arm.com> --- lib/bb/tests/utils.py | 30 ++++++++++++++++++++++++++++++ lib/bb/utils.py | 16 ++++++++++++++++ 2 files changed, 46 insertions(+)