@@ -697,8 +697,15 @@ class DataSmart(MutableMapping):
found = True
self.overridedata[newkey] = []
for (v, o) in self.overridedata[key]:
- self.overridedata[newkey].append([v.replace(key, newkey), o])
- self.renameVar(v, v.replace(key, newkey))
+ newv = v.replace(key, newkey)
+ # The derived name may still hold a variable reference which
+ # expandKeys() will never revisit, so expand it here. Only once
+ # newkey is expanded though, otherwise expandKeys() has still to
+ # rename newkey and handles the dependent keys along with it.
+ if '${' in newv and '${' not in newkey:
+ newv = self.expand(newv)
+ self.overridedata[newkey].append([newv, o])
+ self.renameVar(v, newv)
if not found:
# No variable to rename so not worth the work in writing extra
@@ -406,6 +406,31 @@ class TestOverrides(unittest.TestCase):
bb.data.expandKeys(self.d)
self.assertEqual(self.d.getVar("VERSION"), "2")
+ # Test an :append whose override name is only resolved by key expansion
+ def test_append_in_expanded_override(self):
+ self.d.setVar("MACHINE", "qemux86")
+ self.d.setVar("PN", "gizmo")
+ self.d.setVar("OVERRIDES", "gizmo:pn-gizmo-qemux86")
+ self.d.setVar("TEST:${PN}", "base")
+ self.d.setVar("TEST:${PN}:append:pn-gizmo-${MACHINE}", " appended")
+ bb.data.expandKeys(self.d)
+ self.assertEqual(self.d.getVar("TEST"), "base appended")
+
+ # Test renaming to a key which is itself not expanded yet, as native.bbclass
+ # does. The dependent override keys must be left for expandKeys() to rename.
+ def test_rename_to_unexpanded_key_with_override(self):
+ self.d.setVar("BPN", "gizmo")
+ self.d.setVar("PN", "gizmo-native")
+ self.d.setVar("OVERRIDES", "class-target")
+ self.d.setVar("TEST:${PN}-lib", "base")
+ self.d.setVar("TEST:${PN}-lib:class-target", "target")
+ with LogRecord() as logs:
+ self.d.renameVar("TEST:${PN}-lib", "TEST:${BPN}-lib-native")
+ bb.data.expandKeys(self.d)
+ self.assertFalse(logContains("renameVar with equivalent keys", logs))
+ self.assertFalse(logContains("replaces original key", logs))
+ self.assertEqual(self.d.getVar("TEST:gizmo-lib-native"), "target")
+
def test_remove_with_override(self):
self.d.setVar("TEST:bar", "testvalue2")
self.d.setVar("TEST:some_val", "testvalue3 testvalue5")
An operation whose override name needs key expansion is silently dropped: RDEPENDS:${PN}:append:pn-foo-${MACHINE} = " bar" renameVar() rebuilds the dependent override keys with a plain string replace, so renaming RDEPENDS:${PN} leaves the append attached to RDEPENDS:foo:append:pn-foo-${MACHINE}, which never matches an active override. expandKeys() cannot fix that up afterwards either, as it works from a list of keys collected before any renaming happened. Expand the derived name before renaming it. Only do so once newkey is itself expanded, otherwise expandKeys() has still to rename newkey and handles the dependent keys along with it. Add regression tests for both cases. Fixes [YOCTO #14867] Signed-off-by: Nguyen Minh Tien <zizuzacker@gmail.com> --- lib/bb/data_smart.py | 11 +++++++++-- lib/bb/tests/data.py | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-)