Add a helper function to be executed after do_unpack, if PRUNE_KEEP_PATHS
is defined.

This variable is a list (space-separated) of paths that should be kept,
while the others will be pruned. They can be directory names and
filenames, but globbing is not supported as of now.

prune_source_tree() is not a task on its own, of course. It belongs in
do_unpack's 'postfuncs' list, and also in do_unpack_and_patch
(archiver.bbclass): this ensures the archived sources (patched or
configured) will also be pruned.

As a concrete example, add PRUNE_KEEP_PATHS to vim-xxd so that vim's
sources are deleted and only xxd sources are kept.

Signed-off-by: João Marcos Costa <[email protected]>
---
 meta/classes-global/base.bbclass        | 49 +++++++++++++++++++++++++
 meta/classes/archiver.bbclass           |  1 +
 meta/recipes-support/vim/vim-xxd_9.2.bb |  4 ++
 3 files changed, 54 insertions(+)

diff --git a/meta/classes-global/base.bbclass b/meta/classes-global/base.bbclass
index 62f2814bb7..edf37a8016 100644
--- a/meta/classes-global/base.bbclass
+++ b/meta/classes-global/base.bbclass
@@ -256,6 +256,55 @@ python create_source_date_epoch_stamp() {
 }
 do_unpack[postfuncs] += "create_source_date_epoch_stamp"
 
+PRUNE_KEEP_PATHS ??= ""
+python prune_source_tree() {
+    import shutil
+
+    # Space-separated list of paths (relative to ${S}) to keep.
+    #
+    # Example:
+    #   PRUNE_KEEP_PATHS = "READMEdir/Contents.info src/xxd SECURITY.md"
+    #
+    keep_paths = (d.getVar("PRUNE_KEEP_PATHS") or "").split()
+
+    if not keep_paths:
+        bb.debug(1, "do_unpack: prune_source_tree is disabled")
+        return
+
+    s = d.getVar("S")
+    keep_abs = {os.path.abspath(os.path.join(s, p)) for p in keep_paths}
+
+    def should_keep(path):
+        path = os.path.abspath(path)
+
+        for keep in keep_abs:
+            if (
+                path == keep or # exact match with PRUNE_KEEP_PATHS
+                path.startswith(keep + os.sep) or # parent directories
+                keep.startswith(path + os.sep) # child directories
+            ):
+                return True
+        return False
+
+    for root, dirs, _ in os.walk(s, topdown=False):
+        for d in dirs:
+            path = os.path.join(root, d)
+
+            if not should_keep(path):
+                bb.debug(1, "Removing directory: %s" % path)
+                shutil.rmtree(path)
+
+    # in case there are leftover files:
+    for root, _, files in os.walk(s):
+        for f in files:
+            path = os.path.join(root, f)
+
+            if not should_keep(path):
+                bb.debug(1, "Removing file: %s" % path)
+                os.remove(path)
+}
+do_unpack[postfuncs] .= "${@" prune_source_tree" if 
d.getVar("PRUNE_KEEP_PATHS") else ''}"
+
 def get_source_date_epoch_value(d):
     return oe.reproducible.epochfile_read(d.getVar('SDE_FILE'), d)
 
diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass
index 1f1ee45bd7..1a0d6f8eea 100644
--- a/meta/classes/archiver.bbclass
+++ b/meta/classes/archiver.bbclass
@@ -620,6 +620,7 @@ addtask do_deploy_archives
 do_build[recrdeptask] += "do_deploy_archives"
 do_rootfs[recrdeptask] += "do_deploy_archives"
 do_populate_sdk[recrdeptask] += "do_deploy_archives"
+do_unpack_and_patch[postfuncs] .= "${@" prune_source_tree" if 
d.getVar("PRUNE_KEEP_PATHS") else ''}"
 
 python () {
     # Add tasks in the correct order, specifically for linux-yocto to avoid 
race condition.
diff --git a/meta/recipes-support/vim/vim-xxd_9.2.bb 
b/meta/recipes-support/vim/vim-xxd_9.2.bb
index 5cfacbcea6..b1058e18b7 100644
--- a/meta/recipes-support/vim/vim-xxd_9.2.bb
+++ b/meta/recipes-support/vim/vim-xxd_9.2.bb
@@ -16,6 +16,10 @@ inherit update-alternatives
 
 PROVIDES += "xxd"
 
+# After unpacking, the files/dirs. outside of this list are removed
+# see prune_source_tree() in base.bbclass
+PRUNE_KEEP_PATHS = "src/xxd/Makefile src/xxd/xxd.c"
+
 do_compile() {
     cd  ${S}/src/xxd;
     oe_runmake xxd
-- 
2.43.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#237512): 
https://lists.openembedded.org/g/openembedded-core/message/237512
Mute This Topic: https://lists.openembedded.org/mt/119424112/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to