[PATCH 2/2] wic: extra-partition: introduce variable matching sourceparams

Louis Rannou via B4 Relay
2026-01-07T10:41:14Z

From: Louis Rannou <louis.rannou@non.se.com>

The current extra_partition plugin uses predictable variable names (the
configuration must predict the image partition label or uuid). This has two
inconveniences:

- an extra partition that has a specific label (or uuid) is doomed with the
associated variable. The partition cannot be configured unless the label
(or uuid) is changed.
- two partitions with same label from distincts .wks cannot have different
content.

This allows the new suffix _sourceparams_foo to be appended to
IMAGE_EXTRA_PARTITION_FILES. This variable will be preferred whenever the
.wks specifies a name in the --sourceparams option.

For example:
an image may define:
IMAGE_EXTRA_PARTITION_FILES_sourceparams_foo = "bar.conf"
and the .wks line have line:
part --source extra_partition --sourceparams "name=foo"

Signed-off-by: Louis Rannou <louis.rannou@non.se.com>
---
meta/lib/oeqa/selftest/cases/wic.py | 16 ++++++++++-----
scripts/lib/wic/plugins/source/extra_partition.py | 24 +++++++++++++++++------
2 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index 55fb8dfd1b..542ce6fb05 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -1657,6 +1657,7 @@ INITRAMFS_IMAGE = "core-image-initramfs-boot"
def test_extra_partition_plugin(self):
"""Test extra partition plugin"""
config = dedent("""\
+ IMAGE_EXTRA_PARTITION_FILES_sourceparams-foo = "bar.conf"
IMAGE_EXTRA_PARTITION_FILES_label-foo = "bar.conf;foo.conf"
IMAGE_EXTRA_PARTITION_FILES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d = "bar.conf;foobar.conf bar2.conf;foobar2.conf bar3.conf bar4.conf"
IMAGE_EXTRA_PARTITION_FILES = "foo/*"
@@ -1688,9 +1689,13 @@ INITRAMFS_IMAGE = "core-image-initramfs-boot"

try:
with NamedTemporaryFile("w", suffix=".wks") as wks:
- wks.writelines(['part / --source extra_partition --ondisk sda --label foo --align 4 --size 5M\n',
- 'part / --source extra_partition --ondisk sda --fstype=vfat --uuid e7d0824e-cda3-4bed-9f54-9ef5312d105d --align 4 --size 5M\n',
- 'part / --source extra_partition --ondisk sda --fstype=ext4 --label bar --align 4 --size 5M\n'])
+ wks.writelines([
+ 'part / --source extra_partition --ondisk sda --sourceparams "name=foo" --align 4 --size 5M\n',
+ 'part / --source extra_partition --ondisk sda --label foo --align 4 --size 5M\n',
+ 'part / --source extra_partition --ondisk sda --fstype=vfat --uuid e7d0824e-cda3-4bed-9f54-9ef5312d105d --align 4 --size 5M\n',
+ 'part / --source extra_partition --ondisk sda --fstype=ext4 --label bar --align 4 --size 5M\n',
+ 'bootloader --ptable gpt\n',
+ ])
wks.flush()
_, wicimg = self._get_wic(wks.name)

@@ -1698,14 +1703,15 @@ INITRAMFS_IMAGE = "core-image-initramfs-boot"
partls = result.output.split('\n')[1:]

# Assert the number of partitions is correct
- self.assertEqual(3, len(partls), msg="Expect 3 partitions, not %s" % result.output)
+ self.assertEqual(4, len(partls), msg="Expect 4 partitions, not %s" % result.output)

# Fstype column from 'wic ls' should be fstype as given in the part command
- for part_id, part_fs in enumerate(["fat16", "fat16", "ext4"]):
+ for part_id, part_fs in enumerate(["fat16", "fat16", "fat16", "ext4"]):
self.assertIn(part_fs, partls[part_id])

# For each partition, assert expected files exist
for part, part_glob in enumerate([
+ ["bar.conf"],
["foo.conf"],
["foobar.conf", "foobar2.conf", "bar3.conf", "bar4.conf"],
["bar.conf", "bar2.conf"],
diff --git a/scripts/lib/wic/plugins/source/extra_partition.py b/scripts/lib/wic/plugins/source/extra_partition.py
index d370b0107e..f9410388fa 100644
--- a/scripts/lib/wic/plugins/source/extra_partition.py
+++ b/scripts/lib/wic/plugins/source/extra_partition.py
@@ -18,15 +18,17 @@ class ExtraPartitionPlugin(SourcePlugin):
The plugin supports:
- Glob pattern matching for file selection.
- File renaming.
- - Suffixes to specify the target partition (by label, UUID, or partname),
- enabling multiple extra partitions to coexist.
+ - Suffixes to specify the target partition (by params-name, label, UUID,
+ or partname), enabling multiple extra partitions to coexist.

For example:

+ IMAGE_EXTRA_PARTITION_FILES_sourceparams-name = "bar.conf;foo.conf"
IMAGE_EXTRA_PARTITION_FILES_label-foo = "bar.conf;foo.conf"
IMAGE_EXTRA_PARTITION_FILES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d = "bar.conf;foobar.conf"
IMAGE_EXTRA_PARTITION_FILES = "foo/*"
WICVARS:append = "\
+ IMAGE_EXTRA_PARTITION_FILES_sourceparams-name \
IMAGE_EXTRA_PARTITION_FILES_label-foo \
IMAGE_EXTRA_PARTITION_FILES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d \
"
@@ -53,11 +55,21 @@ class ExtraPartitionPlugin(SourcePlugin):
raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting")

extra_files = None
- for (fmt, id) in (("_uuid-%s", part.uuid), ("_label-%s", part.label), ("_part-name-%s", part.part_name), (None, None)):
- if fmt:
- var = fmt % id
- else:
+ for (fmt, part_id) in (
+ ("_sourceparams-%s", source_params.get("name")),
+ ("_uuid-%s", part.uuid),
+ ("_label-%s", part.label),
+ ("_part-name-%s", part.part_name),
+ (None, None)
+ ):
+ if fmt is None:
var = ""
+ elif part_id is not None:
+ var = fmt % part_id
+ else:
+ continue
+
+ logger.debug("Looking for extra files in %s" % cls.image_extra_partition_files_var_name + var)
extra_files = get_bitbake_var(cls.image_extra_partition_files_var_name + var)
if extra_files is not None:
break

--
2.43.0