[OE-core] [PATCH] wic: allow to create a rootfs subdir partition

Riccardo Ferrazzo f.riccardo87 at gmail.com
Thu May 2 21:14:30 UTC 2019


Allows to create a rootfs partition starting from a subdirectory of the rootfs.
The subdirectory path can be specified as a `sourceparams` value in the form `subdir=<path>`.
The path can either start with `/` or not. It will be treated as relative  to the rootfs anyway.
Cannot specify a path outside the rootfs folder.

Signed-off-by: Riccardo Ferrazzo <f.riccardo87 at gmail.com>
---
scripts/lib/wic/plugins/source/rootfs.py | 39 ++++++++++++++++--------
1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index aec720fb22..6193ed273f 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -46,17 +46,29 @@ class RootfsPlugin(SourcePlugin):
    name = 'rootfs'

    @staticmethod
-    def __get_rootfs_dir(rootfs_dir):
-        if os.path.isdir(rootfs_dir):
-            return os.path.realpath(rootfs_dir)
-
-        image_rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", rootfs_dir)
-        if not os.path.isdir(image_rootfs_dir):
-            raise WicError("No valid artifact IMAGE_ROOTFS from image "
-                           "named %s has been found at %s, exiting." %
-                           (rootfs_dir, image_rootfs_dir))
-
-        return os.path.realpath(image_rootfs_dir)
+    def __get_rootfs_dir(rootfs_dir, subdir):
+        real_rootfs=True
+
+        if not os.path.isdir(rootfs_dir):
+            image_rootfs_dir = get_bitbake_var("IMAGE_ROOTFS", rootfs_dir)
+            if not os.path.isdir(image_rootfs_dir):
+                raise WicError("No valid artifact IMAGE_ROOTFS from image "
+                               "named %s has been found at %s, exiting." %
+                               (rootfs_dir, image_rootfs_dir))
+            rootfs_dir = image_rootfs_dir
+
+        if subdir:
+            real_rootfs = False
+            subdir = subdir[1:] if subdir.startswith("/") else subdir
+            sub_rootfs_dir = os.path.join(rootfs_dir, subdir)
+            if not sub_rootfs_dir.startswith(rootfs_dir):
+                raise WicError("'%s' points to a path outside the rootfs" % (subdir,))
+            if not os.path.isdir(sub_rootfs_dir):
+                raise WicError("Couldn't find subdir=%s in rootfs %s" %
+                               (subdir, rootfs_dir))
+            rootfs_dir = sub_rootfs_dir
+
+        return (os.path.realpath(rootfs_dir), real_rootfs)

    @classmethod
    def do_prepare_partition(cls, part, source_params, cr, cr_workdir,
@@ -81,7 +93,8 @@ class RootfsPlugin(SourcePlugin):
                raise WicError("Couldn't find --rootfs-dir=%s connection or "
                               "it is not a valid path, exiting" % part.rootfs_dir)

-        part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir)
+        part.rootfs_dir, real_rootfs = cls.__get_rootfs_dir(rootfs_dir,
+                                                            source_params.get("subdir", ""))

        new_rootfs = None
        # Handle excluded paths.
@@ -123,4 +136,4 @@ class RootfsPlugin(SourcePlugin):
                    shutil.rmtree(full_path)

        part.prepare_rootfs(cr_workdir, oe_builddir,
-                            new_rootfs or part.rootfs_dir, native_sysroot)
+                            new_rootfs or part.rootfs_dir, native_sysroot, real_rootfs)
--
2.21.0



More information about the Openembedded-core mailing list