summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb
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/bb
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/bb')
-rw-r--r--bitbake/lib/bb/cooker.py1
-rw-r--r--bitbake/lib/bb/cookerdata.py1
-rw-r--r--bitbake/lib/bb/data.py2
-rw-r--r--bitbake/lib/bb/parse/parse_py/BBHandler.py29
-rw-r--r--bitbake/lib/bb/tests/parse.py1
5 files changed, 22 insertions, 12 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index 2adf4d297d..1b6ee3032c 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -402,6 +402,7 @@ class BBCooker:
402 for mc in self.databuilder.mcdata.values(): 402 for mc in self.databuilder.mcdata.values():
403 mc.renameVar("__depends", "__base_depends") 403 mc.renameVar("__depends", "__base_depends")
404 self.add_filewatch(mc.getVar("__base_depends", False), self.configwatcher) 404 self.add_filewatch(mc.getVar("__base_depends", False), self.configwatcher)
405 mc.setVar("__bbclasstype", "recipe")
405 406
406 self.baseconfig_valid = True 407 self.baseconfig_valid = True
407 self.parsecache_valid = False 408 self.parsecache_valid = False
diff --git a/bitbake/lib/bb/cookerdata.py b/bitbake/lib/bb/cookerdata.py
index d54ac932e5..9706948ab3 100644
--- a/bitbake/lib/bb/cookerdata.py
+++ b/bitbake/lib/bb/cookerdata.py
@@ -254,6 +254,7 @@ class CookerDataBuilder(object):
254 filtered_keys = bb.utils.approved_variables() 254 filtered_keys = bb.utils.approved_variables()
255 bb.data.inheritFromOS(self.basedata, self.savedenv, filtered_keys) 255 bb.data.inheritFromOS(self.basedata, self.savedenv, filtered_keys)
256 self.basedata.setVar("BB_ORIGENV", self.savedenv) 256 self.basedata.setVar("BB_ORIGENV", self.savedenv)
257 self.basedata.setVar("__bbclasstype", "global")
257 258
258 if worker: 259 if worker:
259 self.basedata.setVar("BB_WORKERCONTEXT", "1") 260 self.basedata.setVar("BB_WORKERCONTEXT", "1")
diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py
index c09d9b04bb..53fe34825d 100644
--- a/bitbake/lib/bb/data.py
+++ b/bitbake/lib/bb/data.py
@@ -441,7 +441,7 @@ def generate_dependency_hash(tasklist, gendeps, lookupcache, ignored_vars, fn):
441 441
442def inherits_class(klass, d): 442def inherits_class(klass, d):
443 val = d.getVar('__inherit_cache', False) or [] 443 val = d.getVar('__inherit_cache', False) or []
444 needle = os.path.join('classes', '%s.bbclass' % klass) 444 needle = '/%s.bbclass' % klass
445 for v in val: 445 for v in val:
446 if v.endswith(needle): 446 if v.endswith(needle):
447 return True 447 return True
diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py
index 1189114341..18e6868387 100644
--- a/bitbake/lib/bb/parse/parse_py/BBHandler.py
+++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py
@@ -44,17 +44,24 @@ def inherit(files, fn, lineno, d):
44 __inherit_cache = d.getVar('__inherit_cache', False) or [] 44 __inherit_cache = d.getVar('__inherit_cache', False) or []
45 files = d.expand(files).split() 45 files = d.expand(files).split()
46 for file in files: 46 for file in files:
47 if not os.path.isabs(file) and not file.endswith(".bbclass"): 47 classtype = d.getVar("__bbclasstype", False)
48 file = os.path.join('classes', '%s.bbclass' % file) 48 origfile = file
49 49 for t in ["classes-" + classtype, "classes"]:
50 if not os.path.isabs(file): 50 file = origfile
51 bbpath = d.getVar("BBPATH") 51 if not os.path.isabs(file) and not file.endswith(".bbclass"):
52 abs_fn, attempts = bb.utils.which(bbpath, file, history=True) 52 file = os.path.join(t, '%s.bbclass' % file)
53 for af in attempts: 53
54 if af != abs_fn: 54 if not os.path.isabs(file):
55 bb.parse.mark_dependency(d, af) 55 bbpath = d.getVar("BBPATH")
56 if abs_fn: 56 abs_fn, attempts = bb.utils.which(bbpath, file, history=True)
57 file = abs_fn 57 for af in attempts:
58 if af != abs_fn:
59 bb.parse.mark_dependency(d, af)
60 if abs_fn:
61 file = abs_fn
62
63 if os.path.exists(file):
64 break
58 65
59 if not os.path.exists(file): 66 if not os.path.exists(file):
60 raise ParseError("Could not inherit file %s" % (file), fn, lineno) 67 raise ParseError("Could not inherit file %s" % (file), fn, lineno)
diff --git a/bitbake/lib/bb/tests/parse.py b/bitbake/lib/bb/tests/parse.py
index 1a3b74934d..ee7f2534f1 100644
--- a/bitbake/lib/bb/tests/parse.py
+++ b/bitbake/lib/bb/tests/parse.py
@@ -164,6 +164,7 @@ python () {
164 # become unset/disappear. 164 # become unset/disappear.
165 # 165 #
166 def test_parse_classextend_contamination(self): 166 def test_parse_classextend_contamination(self):
167 self.d.setVar("__bbclasstype", "recipe")
167 cls = self.parsehelper(self.classextend_bbclass, suffix=".bbclass") 168 cls = self.parsehelper(self.classextend_bbclass, suffix=".bbclass")
168 #clsname = os.path.basename(cls.name).replace(".bbclass", "") 169 #clsname = os.path.basename(cls.name).replace(".bbclass", "")
169 self.classextend = self.classextend.replace("###CLASS###", cls.name) 170 self.classextend = self.classextend.replace("###CLASS###", cls.name)