From: Adam Duskett <adam.duskett@amarulasolutions.com>
To: openembedded-core@lists.openembedded.org
Cc: Adam Duskett <adam.duskett@amarulasolutions.com>
Subject: [PATCH v5 6/6] wic: extra-partitions: extend to support extra directories
Date: Fri, 16 Jan 2026 10:32:15 +0100 [thread overview]
Message-ID: <20260116093215.26108-6-adam.duskett@amarulasolutions.com> (raw)
In-Reply-To: <20260116093215.26108-1-adam.duskett@amarulasolutions.com>
- Add the ability to define a space-delminated list of directories
to create on the extra partition.
- Extend the fail condition to fail if both extra directories and
extra files is not defined.
Signed-off-by: Adam Duskett <adam.duskett@amarulasolutions.com>
---
v1 -> v2: Make the list space deliminated instead of semicolon deliminated.
If the list is blank, print a warning instead of an info.
v2 -> v3: Remove uneeded logic in _parse_extra_directories
v3 -> v4: Rework to error if extra directories and files are not set.
v4 -> v5: Fix double image_extra_partition_dirs_var_name typo
Change logger.debug print for consistency
Reword plugin description for clarity
Add an extra line in the plugin description before the WICVARS
Remove extra space between _get_extra_vars and _parse_extra_directories
meta/lib/oeqa/selftest/cases/wic.py | 11 ++++
| 60 +++++++++++++++----
2 files changed, 59 insertions(+), 12 deletions(-)
diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index d7a9b14658..83072deaae 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -1657,10 +1657,14 @@ INITRAMFS_IMAGE = "core-image-initramfs-boot"
def test_extra_partition_plugin(self):
"""Test extra partition plugin"""
config = dedent("""\
+ IMAGE_EXTRA_PARTITION_DIRECTORIES_label-foo = "/test1 /test2/test3"
+ IMAGE_EXTRA_PARTITION_DIRECTORIES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d = "/test1 /test2/test3"
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_DIRECTORIES_label-foo \
+ IMAGE_EXTRA_PARTITION_DIRECTORIES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d \
IMAGE_EXTRA_PARTITION_FILES_label-foo \
IMAGE_EXTRA_PARTITION_FILES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d \
"
@@ -1692,6 +1696,13 @@ INITRAMFS_IMAGE = "core-image-initramfs-boot"
result = runCmd("wic ls %s | wc -l" % wicimg)
self.assertEqual('4', result.output, msg="Expect 3 partitions, not %s" % result.output)
+ for part, extra_dir in enumerate(["test1", "test2"]):
+ result = runCmd("wic ls %s:%d | grep -q \"%s\"" % (wicimg, part + 1, extra_dir))
+ self.assertEqual(0, result.status, msg="Directory '%s' not found in the partition #%d" % (extra_dir, part))
+
+ result = runCmd("wic ls %s:%d/test2 | grep -q \"test3\"" % (wicimg, part + 1))
+ self.assertEqual(0, result.status, msg="Directory test2/test3 not found in the partition #%d" % part)
+
for part, file in enumerate(["foo.conf", "foobar.conf", "bar.conf"]):
result = runCmd("wic ls %s:%d | grep -q \"%s\"" % (wicimg, part + 1, file))
self.assertEqual(0, result.status, msg="File '%s' not found in the partition #%d" % (file, part))
--git a/scripts/lib/wic/plugins/source/extra_partition.py b/scripts/lib/wic/plugins/source/extra_partition.py
index 327bc2b8c3..3be7aed374 100644
--- a/scripts/lib/wic/plugins/source/extra_partition.py
+++ b/scripts/lib/wic/plugins/source/extra_partition.py
@@ -12,21 +12,31 @@ logger = logging.getLogger('wic')
class ExtraPartitionPlugin(SourcePlugin):
"""
- Populates an extra partition with files listed in the IMAGE_EXTRA_PARTITION_FILES
- BitBake variable. Files should be deployed to the DEPLOY_DIR_IMAGE directory.
+ Populates an extra partition with:
+ - Files listed in the IMAGE_EXTRA_PARTITION_FILES BitBake variable. Files should be deployed to
+ the DEPLOY_DIR_IMAGE directory.
+ - Empty directories listed in the IMAGE_EXTRA_PARTITION_DIRECTORIES Bitbake variable.
+ Directories are created automatically.
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.
+ - Extra directories.
For example:
+ IMAGE_EXTRA_PARTITION_DIRECTORIES_label-foo = "/foo /bar/baz"
+ IMAGE_EXTRA_PARTITION_DIRECTORIES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d = "/foo /bar/baz"
+
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_DIRECTORIES_label-foo \
+ IMAGE_EXTRA_PARTITION_DIRECTORIES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d \
IMAGE_EXTRA_PARTITION_FILES_label-foo \
IMAGE_EXTRA_PARTITION_FILES_uuid-e7d0824e-cda3-4bed-9f54-9ef5312d105d \
"
@@ -34,6 +44,7 @@ class ExtraPartitionPlugin(SourcePlugin):
"""
name = 'extra_partition'
+ image_extra_partition_dirs_var_name = 'IMAGE_EXTRA_PARTITION_DIRECTORIES'
image_extra_partition_files_var_name = 'IMAGE_EXTRA_PARTITION_FILES'
@classmethod
@@ -50,6 +61,22 @@ class ExtraPartitionPlugin(SourcePlugin):
break
return extra_vars
+ @classmethod
+ def _parse_extra_directories(cls, part):
+ """
+ Parse the directories of which to copy.
+ """
+ cls.extra_dirs_task = []
+
+ extra_dirs = cls._get_extra_vars(part, cls.image_extra_partition_dirs_var_name)
+ if extra_dirs is None:
+ logger.info('No extra directories defined, %s unset for entry #%d' % (cls.image_extra_partition_dirs_var_name, part.lineno))
+ return
+
+ logger.info('Extra dirs: %s', extra_dirs)
+ for src_entry in extra_dirs.strip().split(' '):
+ cls.extra_dirs_task.append(src_entry)
+
@classmethod
def _parse_extra_files(cls, part, kernel_dir):
"""
@@ -113,6 +140,7 @@ class ExtraPartitionPlugin(SourcePlugin):
if not kernel_dir:
raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting")
+ cls._parse_extra_directories(part)
cls._parse_extra_files(part, kernel_dir)
@classmethod
@@ -126,24 +154,32 @@ class ExtraPartitionPlugin(SourcePlugin):
"""
extradir = "%s/extra.%d" % (cr_workdir, part.lineno)
- if not cls.extra_files_task:
- raise WicError("Entry #%d does not have a corresponding %s variable set!"
+ if not cls.extra_dirs_task and not cls.extra_files_task:
+ raise WicError("Entry #%d does not have a corresponding %s or %s variable set!"
"If you wish to create an empty partition, remove "
"--source extra-partition from the wks file"
- % (part.lineno, cls.image_extra_partition_files_var_name))
+ % (part.lineno, cls.image_extra_partition_dirs_var_name,
+ cls.image_extra_partition_files_var_name))
if not kernel_dir:
kernel_dir = get_bitbake_var("DEPLOY_DIR_IMAGE")
if not kernel_dir:
raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting")
- for task in cls.extra_files_task:
- src_path, dst_path = task
- logger.debug('Install %s as %s', src_path, dst_path)
- install_cmd = "install -m 0644 -D %s %s" \
- % (os.path.join(kernel_dir, src_path),
- os.path.join(extradir, dst_path))
- exec_cmd(install_cmd)
+ if cls.extra_dirs_task:
+ for task in cls.extra_dirs_task:
+ logger.debug("Create directory %s" % task)
+ mkdir_cmd = "mkdir -p %s/%s" % (extradir, task)
+ exec_cmd(mkdir_cmd)
+
+ if cls.extra_files_task:
+ for task in cls.extra_files_task:
+ src_path, dst_path = task
+ logger.debug('Install %s as %s', src_path, dst_path)
+ install_cmd = "install -m 0644 -D %s %s" \
+ % (os.path.join(kernel_dir, src_path),
+ os.path.join(extradir, dst_path))
+ exec_cmd(install_cmd)
logger.debug('Prepare extra partition using rootfs in %s', extradir)
part.prepare_rootfs(cr_workdir, oe_builddir, extradir,
--
2.52.0
next prev parent reply other threads:[~2026-01-16 9:32 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-16 9:32 [PATCH v5 1/6] wic: extra-partition: Small code cleanup Adam Duskett
2026-01-16 9:32 ` [PATCH v5 2/6] wic: extra-partition: Move extra file parsing to a dedicated method Adam Duskett
2026-01-16 9:32 ` [PATCH v5 3/6] wic: extra-partition: Move extra var handling " Adam Duskett
2026-01-16 9:32 ` [PATCH v5 4/6] wic: extra-partition: Rename install_task to extra_files_task Adam Duskett
2026-01-16 9:32 ` [PATCH v5 5/6] wic: extra-partitions: move extra-files WicError to do_prepare_partition Adam Duskett
2026-01-16 9:32 ` Adam Duskett [this message]
2026-01-16 10:39 ` [OE-core] [PATCH v5 6/6] wic: extra-partitions: extend to support extra directories Pierre-loup GOSSE
2026-01-19 8:55 ` [OE-core] [PATCH v5 1/6] wic: extra-partition: Small code cleanup Antonin Godard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260116093215.26108-6-adam.duskett@amarulasolutions.com \
--to=adam.duskett@amarulasolutions.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox