* [PATCH v4 2/6] wic: extra-partition: Move extra file parsing to a dedicated method
2026-01-15 10:14 [PATCH v4 1/6] wic: extra-partition: Small code cleanup Adam Duskett
@ 2026-01-15 10:14 ` Adam Duskett
2026-01-15 10:14 ` [PATCH v4 3/6] wic: extra-partition: Move extra var handling " Adam Duskett
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Adam Duskett @ 2026-01-15 10:14 UTC (permalink / raw)
To: openembedded-core; +Cc: Adam Duskett
For organizational purposes, and to make the following patches
easier to follow, move the extra file parsing to a dedicated
method.
Signed-off-by: Adam Duskett <adam.duskett@amarulasolutions.com>
---
| 35 +++++++++++--------
1 file changed, 20 insertions(+), 15 deletions(-)
--git a/scripts/lib/wic/plugins/source/extra_partition.py b/scripts/lib/wic/plugins/source/extra_partition.py
index a1d9aa9a7b..aa4fb931c2 100644
--- a/scripts/lib/wic/plugins/source/extra_partition.py
+++ b/scripts/lib/wic/plugins/source/extra_partition.py
@@ -37,20 +37,11 @@ class ExtraPartitionPlugin(SourcePlugin):
image_extra_partition_files_var_name = 'IMAGE_EXTRA_PARTITION_FILES'
@classmethod
- def do_configure_partition(cls, part, source_params, cr, cr_workdir,
- oe_builddir, bootimg_dir, kernel_dir,
- native_sysroot):
+ def _parse_extra_files(cls, part, kernel_dir):
"""
- Called before do_prepare_partition(), list the files to copy
+ Parse the files of which to copy.
"""
- extradir = "%s/extra.%d" % (cr_workdir, part.lineno)
- install_cmd = "install -d %s" % extradir
- exec_cmd(install_cmd)
-
- 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")
+ deploy_files = []
extra_files = None
for (fmt, id) in (("_uuid-%s", part.uuid), ("_label-%s", part.label), ("_part-name-%s", part.part_name), (None, None)):
@@ -66,9 +57,6 @@ class ExtraPartitionPlugin(SourcePlugin):
raise WicError('No extra files defined, %s unset for entry #%d' % (cls.image_extra_partition_files_var_name, part.lineno))
logger.info('Extra files: %s', extra_files)
-
- # list of tuples (src_name, dst_name)
- deploy_files = []
for src_entry in re.findall(r'[\w;\-./*]+', extra_files):
if ';' in src_entry:
dst_entry = tuple(src_entry.split(';'))
@@ -103,6 +91,23 @@ class ExtraPartitionPlugin(SourcePlugin):
else:
cls.install_task.append((src, dst))
+ @classmethod
+ def do_configure_partition(cls, part, source_params, cr, cr_workdir,
+ oe_builddir, bootimg_dir, kernel_dir,
+ native_sysroot):
+ """
+ Called before do_prepare_partition(), list the files to copy
+ """
+ extradir = "%s/extra.%d" % (cr_workdir, part.lineno)
+ install_cmd = "install -d %s" % extradir
+ exec_cmd(install_cmd)
+
+ 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")
+
+ cls._parse_extra_files(part, kernel_dir)
@classmethod
def do_prepare_partition(cls, part, source_params, cr, cr_workdir,
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 3/6] wic: extra-partition: Move extra var handling to a dedicated method
2026-01-15 10:14 [PATCH v4 1/6] wic: extra-partition: Small code cleanup Adam Duskett
2026-01-15 10:14 ` [PATCH v4 2/6] wic: extra-partition: Move extra file parsing to a dedicated method Adam Duskett
@ 2026-01-15 10:14 ` Adam Duskett
2026-01-15 10:14 ` [PATCH v4 4/6] wic: extra-partition: Rename install_task to extra_files_task Adam Duskett
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Adam Duskett @ 2026-01-15 10:14 UTC (permalink / raw)
To: openembedded-core; +Cc: Adam Duskett
For organizational purposes, and to make the following patches
easier to follow, move the extra file parsing to a dedicated
method.
Signed-off-by: Adam Duskett <adam.duskett@amarulasolutions.com>
---
| 25 +++++++++++--------
1 file changed, 15 insertions(+), 10 deletions(-)
--git a/scripts/lib/wic/plugins/source/extra_partition.py b/scripts/lib/wic/plugins/source/extra_partition.py
index aa4fb931c2..05b0ace361 100644
--- a/scripts/lib/wic/plugins/source/extra_partition.py
+++ b/scripts/lib/wic/plugins/source/extra_partition.py
@@ -36,6 +36,20 @@ class ExtraPartitionPlugin(SourcePlugin):
name = 'extra_partition'
image_extra_partition_files_var_name = 'IMAGE_EXTRA_PARTITION_FILES'
+ @classmethod
+ def _get_extra_vars(cls, part, var_name):
+ """Get extra partition directory or file variables"""
+ extra_vars = None
+ for (fmt, id) in (("_uuid-%s", part.uuid), ("_label-%s", part.label), ("_part-name-%s", part.part_name), (None, None)):
+ var = ""
+ if fmt:
+ var = fmt % id
+ thing = var_name + var
+ extra_vars = get_bitbake_var(thing)
+ if extra_vars is not None:
+ break
+ return extra_vars
+
@classmethod
def _parse_extra_files(cls, part, kernel_dir):
"""
@@ -43,16 +57,7 @@ class ExtraPartitionPlugin(SourcePlugin):
"""
deploy_files = []
- 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:
- var = ""
- extra_files = get_bitbake_var(cls.image_extra_partition_files_var_name + var)
- if extra_files is not None:
- break
-
+ extra_files = cls._get_extra_vars(part, cls.image_extra_partition_files_var_name)
if extra_files is None:
raise WicError('No extra files defined, %s unset for entry #%d' % (cls.image_extra_partition_files_var_name, part.lineno))
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 4/6] wic: extra-partition: Rename install_task to extra_files_task
2026-01-15 10:14 [PATCH v4 1/6] wic: extra-partition: Small code cleanup Adam Duskett
2026-01-15 10:14 ` [PATCH v4 2/6] wic: extra-partition: Move extra file parsing to a dedicated method Adam Duskett
2026-01-15 10:14 ` [PATCH v4 3/6] wic: extra-partition: Move extra var handling " Adam Duskett
@ 2026-01-15 10:14 ` Adam Duskett
2026-01-15 10:14 ` [PATCH v4 5/6] wic: extra-partitions: move extra-files WicError to do_prepare_partition Adam Duskett
2026-01-15 10:14 ` [PATCH v4 6/6] wic: extra-partitions: extend to support extra directories Adam Duskett
4 siblings, 0 replies; 8+ messages in thread
From: Adam Duskett @ 2026-01-15 10:14 UTC (permalink / raw)
To: openembedded-core; +Cc: Adam Duskett
Rename install_task to extra_files_task for clarity
Signed-off-by: Adam Duskett <adam.duskett@amarulasolutions.com>
---
| 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
--git a/scripts/lib/wic/plugins/source/extra_partition.py b/scripts/lib/wic/plugins/source/extra_partition.py
index 05b0ace361..25aab06c52 100644
--- a/scripts/lib/wic/plugins/source/extra_partition.py
+++ b/scripts/lib/wic/plugins/source/extra_partition.py
@@ -73,7 +73,7 @@ class ExtraPartitionPlugin(SourcePlugin):
logger.debug('Destination entry: %r', dst_entry)
deploy_files.append(dst_entry)
- cls.install_task = []
+ cls.extra_files_task = []
for deploy_entry in deploy_files:
src, dst = deploy_entry
if '*' in src:
@@ -92,9 +92,9 @@ class ExtraPartitionPlugin(SourcePlugin):
for entry in srcs:
src = os.path.relpath(entry, kernel_dir)
entry_dst_name = entry_name_fn(entry)
- cls.install_task.append((src, entry_dst_name))
+ cls.extra_files_task.append((src, entry_dst_name))
else:
- cls.install_task.append((src, dst))
+ cls.extra_files_task.append((src, dst))
@classmethod
def do_configure_partition(cls, part, source_params, cr, cr_workdir,
@@ -130,7 +130,7 @@ class ExtraPartitionPlugin(SourcePlugin):
if not kernel_dir:
raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting")
- for task in cls.install_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" \
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 5/6] wic: extra-partitions: move extra-files WicError to do_prepare_partition
2026-01-15 10:14 [PATCH v4 1/6] wic: extra-partition: Small code cleanup Adam Duskett
` (2 preceding siblings ...)
2026-01-15 10:14 ` [PATCH v4 4/6] wic: extra-partition: Rename install_task to extra_files_task Adam Duskett
@ 2026-01-15 10:14 ` Adam Duskett
2026-01-15 10:14 ` [PATCH v4 6/6] wic: extra-partitions: extend to support extra directories Adam Duskett
4 siblings, 0 replies; 8+ messages in thread
From: Adam Duskett @ 2026-01-15 10:14 UTC (permalink / raw)
To: openembedded-core; +Cc: Adam Duskett
For organizational purposes, move the raised WicError if extra files isn't
provided by a user to the do_prepare_partition method and rewrite the message
to be more clear if a user wishes to create an empty partition.
The original error is changed to a warning in the event a user has a typo
in the variable. For example:
IMAGE_EXTRA_PARTITION_FILES_label-fooo = "bar.conf"
part --source extra-partition --fstype=ext4 --label foo
Signed-off-by: Adam Duskett <adam.duskett@amarulasolutions.com>
---
v1 -> v2: If the list is blank, print a warning instead of an info.
v2 -> v4: Raise an error in do_prepare_partition instead of making
extra files optional. Extend error message.
| 26 ++++++++++++-------
1 file changed, 17 insertions(+), 9 deletions(-)
--git a/scripts/lib/wic/plugins/source/extra_partition.py b/scripts/lib/wic/plugins/source/extra_partition.py
index 25aab06c52..62a7b4b1d3 100644
--- a/scripts/lib/wic/plugins/source/extra_partition.py
+++ b/scripts/lib/wic/plugins/source/extra_partition.py
@@ -55,11 +55,13 @@ class ExtraPartitionPlugin(SourcePlugin):
"""
Parse the files of which to copy.
"""
+ cls.extra_files_task = []
deploy_files = []
extra_files = cls._get_extra_vars(part, cls.image_extra_partition_files_var_name)
if extra_files is None:
- raise WicError('No extra files defined, %s unset for entry #%d' % (cls.image_extra_partition_files_var_name, part.lineno))
+ logger.warning('No extra files defined, %s unset for entry #%d' % (cls.image_extra_partition_files_var_name, part.lineno))
+ return
logger.info('Extra files: %s', extra_files)
for src_entry in re.findall(r'[\w;\-./*]+', extra_files):
@@ -73,7 +75,6 @@ class ExtraPartitionPlugin(SourcePlugin):
logger.debug('Destination entry: %r', dst_entry)
deploy_files.append(dst_entry)
- cls.extra_files_task = []
for deploy_entry in deploy_files:
src, dst = deploy_entry
if '*' in src:
@@ -125,18 +126,25 @@ 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 you wish to create an empty partition, remove "
+ "--source extra-partition from the wks file"
+ % (part.lineno, cls.image_extra_partition_dirs_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_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
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 6/6] wic: extra-partitions: extend to support extra directories
2026-01-15 10:14 [PATCH v4 1/6] wic: extra-partition: Small code cleanup Adam Duskett
` (3 preceding siblings ...)
2026-01-15 10:14 ` [PATCH v4 5/6] wic: extra-partitions: move extra-files WicError to do_prepare_partition Adam Duskett
@ 2026-01-15 10:14 ` Adam Duskett
2026-01-15 14:55 ` [OE-core] " Pierre-loup GOSSE
4 siblings, 1 reply; 8+ messages in thread
From: Adam Duskett @ 2026-01-15 10:14 UTC (permalink / raw)
To: openembedded-core; +Cc: Adam Duskett
- 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.
meta/lib/oeqa/selftest/cases/wic.py | 11 +++++
| 43 +++++++++++++++++--
2 files changed, 50 insertions(+), 4 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 62a7b4b1d3..185fcab585 100644
--- a/scripts/lib/wic/plugins/source/extra_partition.py
+++ b/scripts/lib/wic/plugins/source/extra_partition.py
@@ -13,20 +13,29 @@ 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.
+ BitBake variable or directories listed in the IMAGE_EXTRA_PARTITION_DIRECTORIES Bitbake variable.
+
+ Directories are created automatically.
+ Files should be deployed to the DEPLOY_DIR_IMAGE directory.
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 +43,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 +60,23 @@ 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.warning('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,17 +154,24 @@ 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_dirs_var_name))
+ % (part.lineno, cls.image_extra_partition_dirs_var_name,
+ cls.image_extra_partition_dirs_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")
+ if cls.extra_dirs_task:
+ for task in cls.extra_dirs_task:
+ mkdir_cmd = "mkdir -p %s/%s" % (extradir, task)
+ logger.debug(mkdir_cmd)
+ exec_cmd(mkdir_cmd)
+
if cls.extra_files_task:
for task in cls.extra_files_task:
src_path, dst_path = task
--
2.52.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [OE-core] [PATCH v4 6/6] wic: extra-partitions: extend to support extra directories
2026-01-15 10:14 ` [PATCH v4 6/6] wic: extra-partitions: extend to support extra directories Adam Duskett
@ 2026-01-15 14:55 ` Pierre-loup GOSSE
2026-01-15 16:41 ` Pierre-loup GOSSE
0 siblings, 1 reply; 8+ messages in thread
From: Pierre-loup GOSSE @ 2026-01-15 14:55 UTC (permalink / raw)
To: adam.duskett; +Cc: openembedded-core
[-- Attachment #1: Type: text/plain, Size: 12223 bytes --]
Hi Adam,
Thanks for this v4 patch series.
- 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_dirs_var_name))
> + % (part.lineno,
> cls.image_extra_partition_dirs_var_name,
> + cls.image_extra_partition_dirs_var_name))
There is a typo, one of the printed variables should be
image_extra_partition_files_var_name.
+ if cls.extra_dirs_task:
> + for task in cls.extra_dirs_task:
> + mkdir_cmd = "mkdir -p %s/%s" % (extradir, task)
> + logger.debug(mkdir_cmd)
> + exec_cmd(mkdir_cmd)
> +
To maintain consistency with the extra files log, instead of printing the
mkdir command, you could print something like:
logger.debug("Create directory %s" % task)
@@ -13,20 +13,29 @@ 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.
> + BitBake variable or directories listed in the
> IMAGE_EXTRA_PARTITION_DIRECTORIES Bitbake variable.
> +
> + Directories are created automatically.
> + Files should be deployed to the DEPLOY_DIR_IMAGE directory.
>
I think the description should be reworded to avoid the confusion that the
plugin copies directories from DEPLOY_DIR_IMAGE like the files. Here is my
suggestion:
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.
What do you think ?
And just two minor points:
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 \
>
I would add an extra line in the plugin description before the WICVARS,
just as you did to separate the directories and files variables.
@@ -50,6 +60,23 @@ class ExtraPartitionPlugin(SourcePlugin):
> break
> return extra_vars
>
> +
> + @classmethod
> + def _parse_extra_directories(cls, part):
> + """
> + Parse the directories of which to copy.
> + """
>
There is an extra line between the functions.
Thanks for your compromise, I appreciate it.
Pierre-Loup,
On Thu, Jan 15, 2026 at 11:15 AM Adam Duskett via lists.openembedded.org
<adam.duskett=amarulasolutions.com@lists.openembedded.org> wrote:
> - 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.
>
> meta/lib/oeqa/selftest/cases/wic.py | 11 +++++
> .../lib/wic/plugins/source/extra_partition.py | 43 +++++++++++++++++--
> 2 files changed, 50 insertions(+), 4 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))
> diff --git a/scripts/lib/wic/plugins/source/extra_partition.py
> b/scripts/lib/wic/plugins/source/extra_partition.py
> index 62a7b4b1d3..185fcab585 100644
> --- a/scripts/lib/wic/plugins/source/extra_partition.py
> +++ b/scripts/lib/wic/plugins/source/extra_partition.py
> @@ -13,20 +13,29 @@ 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.
> + BitBake variable or directories listed in the
> IMAGE_EXTRA_PARTITION_DIRECTORIES Bitbake variable.
> +
> + Directories are created automatically.
> + Files should be deployed to the DEPLOY_DIR_IMAGE directory.
>
> 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 +43,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 +60,23 @@ 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.warning('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,17 +154,24 @@ 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_dirs_var_name))
> + % (part.lineno,
> cls.image_extra_partition_dirs_var_name,
> + cls.image_extra_partition_dirs_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")
>
> + if cls.extra_dirs_task:
> + for task in cls.extra_dirs_task:
> + mkdir_cmd = "mkdir -p %s/%s" % (extradir, task)
> + logger.debug(mkdir_cmd)
> + exec_cmd(mkdir_cmd)
> +
> if cls.extra_files_task:
> for task in cls.extra_files_task:
> src_path, dst_path = task
> --
> 2.52.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Liens: Vous recevez tous les messages envoyés à ce groupe.
> Voir/Répondre en ligne (#229404):
> https://lists.openembedded.org/g/openembedded-core/message/229404
> Sujets: https://lists.openembedded.org/mt/117276849/9955716
> Propriétaire du groupe: openembedded-core+owner@lists.openembedded.org
> Se désabonner: https://lists.openembedded.org/g/openembedded-core/unsub [
> pierre-loup.gosse@smile.fr]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
[-- Attachment #2: Type: text/html, Size: 16539 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread