[RFC,v2,09/19] use bitbake function to generate mounting scripts

Message ID 20260220171601.3845113-10-felix.moessbauer@siemens.com
State New
Headers show
Series add support to build isar unprivileged | expand

Commit Message

Felix Moessbauer Feb. 20, 2026, 5:15 p.m. UTC
By introducing a bitbake python function (a code generator) to
generate the mount shell code, we make it reusable within here
documents where external shell functions cannot be called.

Signed-off-by: Felix Moessbauer <felix.moessbauer@siemens.com>
---
 meta/classes-global/base.bbclass   | 18 +++++++++++
 meta/classes-recipe/rootfs.bbclass | 49 ++++++++----------------------
 2 files changed, 30 insertions(+), 37 deletions(-)

Patch

diff --git a/meta/classes-global/base.bbclass b/meta/classes-global/base.bbclass
index ad3b616e..730fd0b4 100644
--- a/meta/classes-global/base.bbclass
+++ b/meta/classes-global/base.bbclass
@@ -388,6 +388,24 @@  do_unpack[prefuncs] += "deprecation_checking"
 # Helpers for privileged execution. Only the non-underscore functions
 # shall be used outside of this class.
 
+def insert_isar_mounts(d, rootfs, mounts):
+    lines = []
+    for m in mounts.split():
+        host, inner = m.split(':') if ':' in m else (m, m)
+        inner_full = os.path.join(rootfs, inner[1:])
+        lines.append('mkdir -p {}'.format(inner_full))
+        lines.append('mount -o bind,private {} {}'.format(host, inner_full))
+    return '\n'.join(lines)
+
+def insert_isar_umounts(d, rootfs, mounts):
+    lines = []
+    for m in mounts.split():
+        host, inner = m.split(':') if ':' in m else (m, m)
+        mp = '{}/{}'.format(rootfs, inner)
+        lines.append('mountpoint -q {} && umount {}'.format(mp, mp))
+        lines.append('[ -d {} ] && rmdir --ignore-fail-on-non-empty {}'.format(mp, mp))
+    return '\n'.join(lines)
+
 def run_privileged_cmd(d):
     cmd = 'sudo -E'
     bb.debug(1, "privileged cmd: %s" % cmd)
diff --git a/meta/classes-recipe/rootfs.bbclass b/meta/classes-recipe/rootfs.bbclass
index ac50156c..1cd492c6 100644
--- a/meta/classes-recipe/rootfs.bbclass
+++ b/meta/classes-recipe/rootfs.bbclass
@@ -49,6 +49,16 @@  ROOTFS_PACKAGE_SUFFIX ?= "${PN}-${DISTRO}-${DISTRO_ARCH}"
 # path to deploy stubbed versions of initrd update scripts during do_rootfs_install
 ROOTFS_STUBS_DIR = "/usr/local/isar-sbin"
 
+# list of <outer>:<inner> or <outer> mount entries
+ROOTFS_MOUNTS ??= "${REPO_ISAR_DIR}/${DISTRO}:/isar-apt ${WORKDIR}:/isar-work"
+
+python () {
+    mounts = d.getVar('ROOTFS_MOUNTS', False)
+    if d.getVar('ISAR_USE_CACHED_BASE_REPO') and not '/base-apt' in mounts:
+        base_apt = '{}/base-apt:/base-apt'.format(d.getVar('REPO_BASE_DIR'))
+        mounts.append(' {}'.format(base_apt))
+}
+
 # helper to compute the rootfs distro also under cross building
 def get_rootfs_distro(d):
     host_arch = d.getVar('HOST_ARCH')
@@ -154,50 +164,15 @@  rootfs_do_mounts() {
             mount -t tmpfs -o size=1m,nosuid,nodev none '${ROOTFSDIR}/sys/firmware'
         fi
 
-        # Mount isar-apt if the directory does not exist or if it is empty
-        # This prevents overwriting something that was copied there
-        if [ ! -e '${ROOTFSDIR}/isar-apt' ] || \
-           [ "$(find '${ROOTFSDIR}/isar-apt' -maxdepth 1 -mindepth 1 | wc -l)" = "0" ]
-        then
-            mkdir -p '${ROOTFSDIR}/isar-apt'
-            mountpoint -q '${ROOTFSDIR}/isar-apt' || \
-                mount -o bind,private '${REPO_ISAR_DIR}/${DISTRO}' '${ROOTFSDIR}/isar-apt'
-        fi
-
-        if [ ! -e '$ROOTFSDIR'/isar-work ]; then
-            mkdir -p '${ROOTFSDIR}/isar-work'
-            mountpoint -q '${ROOTFSDIR}/isar-work' || \
-                mount -o bind,private '${WORKDIR}' '${ROOTFSDIR}/isar-work'
-        fi
-
-        # Mount base-apt if 'ISAR_USE_CACHED_BASE_REPO' is set
-        if [ "${@repr(bb.utils.to_boolean(d.getVar('ISAR_USE_CACHED_BASE_REPO')))}" = 'True' ]
-        then
-            mkdir -p '${ROOTFSDIR}/base-apt'
-            mountpoint -q '${ROOTFSDIR}/base-apt' || \
-                mount -o bind,private '${REPO_BASE_DIR}' '${ROOTFSDIR}/base-apt'
-        fi
-
+        ${@insert_isar_mounts(d, d.getVar('ROOTFSDIR'), d.getVar('ROOTFS_MOUNTS'))}
 EOSUDO
 }
 
 rootfs_do_umounts() {
     run_privileged_heredoc <<'EOSUDO'
         set -e
-        if mountpoint -q '${ROOTFSDIR}/isar-apt'; then
-            umount '${ROOTFSDIR}/isar-apt'
-            rmdir --ignore-fail-on-non-empty ${ROOTFSDIR}/isar-apt
-        fi
 
-        if mountpoint -q '${ROOTFSDIR}/base-apt'; then
-            umount '${ROOTFSDIR}/base-apt'
-            rmdir --ignore-fail-on-non-empty ${ROOTFSDIR}/base-apt
-        fi
-
-        if mountpoint -q '${ROOTFSDIR}/isar-work'; then
-            umount '${ROOTFSDIR}/isar-work'
-            rmdir --ignore-fail-on-non-empty ${ROOTFSDIR}/isar-work
-        fi
+        ${@insert_isar_umounts(d, d.getVar('ROOTFSDIR'), d.getVar('ROOTFS_MOUNTS'))}
 
         if mountpoint -q '${ROOTFSDIR}/dev/pts'; then
             umount '${ROOTFSDIR}/dev/pts'