diff --git a/lib/bb/tests/utils.py b/lib/bb/tests/utils.py
index 52b7bf85bf..13c3c16a75 100644
--- a/lib/bb/tests/utils.py
+++ b/lib/bb/tests/utils.py
@@ -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)
+
diff --git a/lib/bb/utils.py b/lib/bb/utils.py
index 366836bfc9..8106ada29c 100644
--- a/lib/bb/utils.py
+++ b/lib/bb/utils.py
@@ -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
