[PATCH v3 08/16] use bitbake function to generate mounting scripts

'Felix Moessbauer' via isar-users
2026-04-07T14:33:51Z

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(-)

diff --git a/meta/classes-global/base.bbclass b/meta/classes-global/base.bbclass
index d4dbbc3a..90e4525e 100644
--- a/meta/classes-global/base.bbclass
+++ b/meta/classes-global/base.bbclass
@@ -379,6 +379,24 @@ def deb_list_beautify(d, varname):
# 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 60ea66ed..7352a87c 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'.format(d.getVar('REPO_BASE_DIR'))
+ d.setVar('ROOTFS_MOUNTS', '{} {}'.format(mounts, 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'
--
2.53.0

--
You received this message because you are subscribed to the Google Groups "isar-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to isar-users+unsubscribe@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/isar-users/20260407142310.2327696-9-felix.moessbauer%40siemens.com.