summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bblayers
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-08-10 14:34:22 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-08-12 11:49:29 +0100
commit7bd328f9d24b4fb23c7d5de50bddbb60828c9ffc (patch)
tree243a5d896a1b005deb35bd5d7bb167b86d0cdd23 /bitbake/lib/bblayers
parente19ce4191d94646e35386a5f2179c02ef8dc1cb6 (diff)
downloadpoky-7bd328f9d24b4fb23c7d5de50bddbb60828c9ffc.tar.gz
bitbake: BBHandler/cooker: Implement recipe and global classes
We have some confusion for users since some classes are meant to work in the configuration space (or "globally") and some are meant to be selected by recipes individually. The cleanest way I could find to clarify this is to create "classes-global" and "classes-recipe" directories which contain the approproate classes and have bitbake switch scope between them at the appropriate point during parsing. The existing "classes" directory is always searched as a fallback. Once a class is moved to a specific directory, it will no longer be found in the incorrect context. A good example from OE is that INHERIT += "testimage" will no longer work but IMAGE_CLASSES += "testimage" will, which makes the global scope cleaner by only including it where it is useful and intended to be used (images). (Bitbake rev: f33ce7e742f46635658c400b82558cf822690b5e) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bblayers')
-rw-r--r--bitbake/lib/bblayers/query.py26
1 files changed, 16 insertions, 10 deletions
diff --git a/bitbake/lib/bblayers/query.py b/bitbake/lib/bblayers/query.py
index 9142ec4474..afd39518e5 100644
--- a/bitbake/lib/bblayers/query.py
+++ b/bitbake/lib/bblayers/query.py
@@ -57,11 +57,12 @@ are overlayed will also be listed, with a " (skipped)" suffix.
57 # Check for overlayed .bbclass files 57 # Check for overlayed .bbclass files
58 classes = collections.defaultdict(list) 58 classes = collections.defaultdict(list)
59 for layerdir in self.bblayers: 59 for layerdir in self.bblayers:
60 classdir = os.path.join(layerdir, 'classes') 60 for c in ["classes-global", "classes-recipe", "classes"]:
61 if os.path.exists(classdir): 61 classdir = os.path.join(layerdir, c)
62 for classfile in os.listdir(classdir): 62 if os.path.exists(classdir):
63 if os.path.splitext(classfile)[1] == '.bbclass': 63 for classfile in os.listdir(classdir):
64 classes[classfile].append(classdir) 64 if os.path.splitext(classfile)[1] == '.bbclass':
65 classes[classfile].append(classdir)
65 66
66 # Locating classes and other files is a bit more complicated than recipes - 67 # Locating classes and other files is a bit more complicated than recipes -
67 # layer priority is not a factor; instead BitBake uses the first matching 68 # layer priority is not a factor; instead BitBake uses the first matching
@@ -124,9 +125,14 @@ skipped recipes will also be listed, with a " (skipped)" suffix.
124 if inherits: 125 if inherits:
125 bbpath = str(self.tinfoil.config_data.getVar('BBPATH')) 126 bbpath = str(self.tinfoil.config_data.getVar('BBPATH'))
126 for classname in inherits: 127 for classname in inherits:
127 classfile = 'classes/%s.bbclass' % classname 128 found = False
128 if not bb.utils.which(bbpath, classfile, history=False): 129 for c in ["classes-global", "classes-recipe", "classes"]:
129 logger.error('No class named %s found in BBPATH', classfile) 130 cfile = c + '/%s.bbclass' % classname
131 if bb.utils.which(bbpath, cfile, history=False):
132 found = True
133 break
134 if not found:
135 logger.error('No class named %s found in BBPATH', classname)
130 sys.exit(1) 136 sys.exit(1)
131 137
132 pkg_pn = self.tinfoil.cooker.recipecaches[mc].pkg_pn 138 pkg_pn = self.tinfoil.cooker.recipecaches[mc].pkg_pn
@@ -174,7 +180,7 @@ skipped recipes will also be listed, with a " (skipped)" suffix.
174 logger.plain(" %s %s%s", layer.ljust(20), ver, skipped) 180 logger.plain(" %s %s%s", layer.ljust(20), ver, skipped)
175 181
176 global_inherit = (self.tinfoil.config_data.getVar('INHERIT') or "").split() 182 global_inherit = (self.tinfoil.config_data.getVar('INHERIT') or "").split()
177 cls_re = re.compile('classes/') 183 cls_re = re.compile('classes.*/')
178 184
179 preffiles = [] 185 preffiles = []
180 show_unique_pn = [] 186 show_unique_pn = []
@@ -407,7 +413,7 @@ NOTE: .bbappend files can impact the dependencies.
407 self.check_cross_depends("RRECOMMENDS", layername, f, best, args.filenames, ignore_layers) 413 self.check_cross_depends("RRECOMMENDS", layername, f, best, args.filenames, ignore_layers)
408 414
409 # The inherit class 415 # The inherit class
410 cls_re = re.compile('classes/') 416 cls_re = re.compile('classes.*/')
411 if f in self.tinfoil.cooker_data.inherits: 417 if f in self.tinfoil.cooker_data.inherits:
412 inherits = self.tinfoil.cooker_data.inherits[f] 418 inherits = self.tinfoil.cooker_data.inherits[f]
413 for cls in inherits: 419 for cls in inherits: