[PATCH v4 0/4] Deploy DTBs with separate recipe

10 views
Skip to first unread message

Anton Mikanovich

unread,
Jan 21, 2026, 10:30:38 AM (12 days ago) Jan 21
to isar-...@googlegroups.com, Anton Mikanovich
Image task "do_copy_boot_files" is used to deploy kernel, initrd and
devicetree binaries to deploy directory.

When different images for the same target are built (e.g., "-base" and
"-debug") in parallel, this causes issues with DTB deployment since
they have no any image_name-specific stuff in the path, unlike kernel
and initrd.

Here we make a separate recipe responsible for the DTB deployment.
DTBs are extracted from the kernel package (provided by distro or
self-built).

The recipe 'dtb-files' is MACHINE-dependent, so different DTB_FILES
may be deployed for different machines. At the same time, all these
'dtb-files-${MACHINE}' targets depend on the same kernel package, so
it is built only once.

The case when different distros (e.g., bullseye/bookworm) are using the
same name for DTB binaries is covered by the patch 1. It also covers
the case when image uses different kernel suffix (e.g., "realtime"
option for the kernel in some downstreams).

Related topics on maillist:

https://groups.google.com/g/isar-users/c/ht3YmKZcJlM
https://groups.google.com/g/isar-users/c/4BRDM02xC40
https://groups.google.com/g/isar-users/c/qAnjahjjfsw
https://groups.google.com/g/isar-users/c/ZMD4XY4dKWQ
https://groups.google.com/g/isar-users/c/PSGU_AcdPZ8
https://groups.google.com/g/isar-users/c/Va0Ue-ISYeA
https://groups.google.com/g/isar-users/c/ixzytHYnTmI

Changes since v3:
- Rebase on next.
- Fix target deploy dir path for installer.

Changes since v2:
- Patch 1: Consider also kernel suffix.
- Patch 2: Use separate testcase for possible dtb clashes.
- Minor cosmetic fixes.

Changes since v1:
- Separate `dtb-files` recipe used instead of linux one
- Included older "[PATCH] Fix do_copy_boot_files error" into the
series ( https://groups.google.com/g/isar-users/c/Va0Ue-ISYeA )

Anton Mikanovich (2):
testsuite: Add test to check dtb deployment
installer: Fix DEPLOY_DIR_IMAGE path for target image

Ilia Skochilov (1):
meta: Fix do_copy_boot_files error for different distros of same
machine

Uladzimir Bely (1):
meta: Move DTB deployment to a separate dtb-files recipe

RECIPE-API-CHANGELOG.md | 15 +++++++
.../installer-add-rootfs.bbclass | 4 +-
meta/classes-recipe/image.bbclass | 15 +++----
meta/conf/bitbake.conf | 2 +-
meta/recipes-kernel/dtb-files/dtb-files.bb | 41 +++++++++++++++++++
testsuite/citest.py | 23 +++++++++++
6 files changed, 88 insertions(+), 12 deletions(-)
create mode 100644 meta/recipes-kernel/dtb-files/dtb-files.bb

--
2.34.1

Anton Mikanovich

unread,
Jan 21, 2026, 10:30:39 AM (12 days ago) Jan 21
to isar-...@googlegroups.com, Ilia Skochilov, Uladzimir Bely, Anton Mikanovich
From: Ilia Skochilov <iskoc...@ilbers.de>

When building different distros with the same machine (e.g.,
phyboard-mira-bullseye and phyboard-mira-bookworm) it happens that
some files with the same name (e.g, DTB files) are deployed
to the same location and this causes build error.

Use DISTRO- and KERNEL- dependent deploy directory.

Signed-off-by: Ilia Skochilov <iskoc...@ilbers.de>
Signed-off-by: Uladzimir Bely <ub...@ilbers.de>
Signed-off-by: Anton Mikanovich <ami...@ilbers.de>
---
RECIPE-API-CHANGELOG.md | 15 +++++++++++++++
meta/conf/bitbake.conf | 2 +-
2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md
index 0bad8a44..6d7f12b2 100644
--- a/RECIPE-API-CHANGELOG.md
+++ b/RECIPE-API-CHANGELOG.md
@@ -962,3 +962,18 @@ INSTALLER_UNATTENDED_ABORT_ENABLE = "1"
# Optional: set countdown timeout in seconds (default 5)
INSTALLER_UNATTENDED_ABORT_TIMEOUT = "5"
```
+
+### Change DEPLOY_DIR_IMAGE path
+
+Change DEPLOY_DIR_IMAGE from ${DEPLOY_DIR}/images/${MACHINE} to
+${DEPLOY_DIR}/images/${MACHINE}-${DISTRO}-${KERNEL_NAME}. When building
+different distros with the same machine the following error occurs:
+
+do_copy_boot_files: The recipe isar-image-base is trying to install files
+into a shared area when those files already exists. It happens when some
+files have the same names (e.g., dtb files) for different distros.
+
+To prevent this new path is separated also by distro and kernel values.
+
+This change will influence on build artifacts location and should be taken
+into account by downstreams.
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
index 0f84e715..ad3d6b53 100644
--- a/meta/conf/bitbake.conf
+++ b/meta/conf/bitbake.conf
@@ -57,7 +57,7 @@ WORKDIR = "${TMPDIR}/work/${DISTRO}-${DISTRO_ARCH}/${PN}/${PV}-${PR}"
GIT_DL_LINK_DIR = "${TMPDIR}/work/${DISTRO}-${DISTRO_ARCH}"
DEPLOY_DIR_BOOTSTRAP = "${DEPLOY_DIR}/bootstrap"
DEPLOY_DIR_SDKCHROOT = "${DEPLOY_DIR}/sdkchroot"
-DEPLOY_DIR_IMAGE = "${DEPLOY_DIR}/images/${MACHINE}"
+DEPLOY_DIR_IMAGE = "${DEPLOY_DIR}/images/${MACHINE}-${DISTRO}${@ ('-'+d.getVar('KERNEL_NAME')) if d.getVar('KERNEL_NAME') else ''}"
DL_DIR ?= "${TOPDIR}/downloads"
SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
SSTATE_MANIFESTS = "${TMPDIR}/sstate-control/${DISTRO}-${DISTRO_ARCH}"
--
2.34.1

Anton Mikanovich

unread,
Jan 21, 2026, 10:30:41 AM (12 days ago) Jan 21
to isar-...@googlegroups.com, Anton Mikanovich
As it was changed for fixing DTB deployment conflicts.

Signed-off-by: Anton Mikanovich <ami...@ilbers.de>
---
meta-isar/classes-recipe/installer-add-rootfs.bbclass | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/meta-isar/classes-recipe/installer-add-rootfs.bbclass b/meta-isar/classes-recipe/installer-add-rootfs.bbclass
index 2fa551bd..b79c2357 100644
--- a/meta-isar/classes-recipe/installer-add-rootfs.bbclass
+++ b/meta-isar/classes-recipe/installer-add-rootfs.bbclass
@@ -13,7 +13,9 @@ INSTALLER_TARGET_IMAGES ??= "${INSTALLER_TARGET_IMAGE}"
INSTALLER_TARGET_MC ??= "installer-target"
INSTALLER_TARGET_DISTRO ??= "${DISTRO}"
INSTALLER_TARGET_MACHINE ??= "${MACHINE}"
-INSTALLER_TARGET_DEPLOY_DIR_IMAGE ??= "${DEPLOY_DIR}/images/${INSTALLER_TARGET_MACHINE}"
+INSTALLER_TARGET_KERNEL_NAME ??= "${KERNEL_NAME}"
+INSTALLER_TARGET_DEPLOY_DIR_POSTFIX ??= "${@ ('-'+d.getVar('INSTALLER_TARGET_KERNEL_NAME')) if d.getVar('INSTALLER_TARGET_KERNEL_NAME') else ''}"
+INSTALLER_TARGET_DEPLOY_DIR_IMAGE ??= "${DEPLOY_DIR}/images/${INSTALLER_TARGET_MACHINE}-${INSTALLER_TARGET_DISTRO}${INSTALLER_TARGET_DEPLOY_DIR_POSTFIX}"

IMAGE_DATA_FILE ??= "${INSTALLER_TARGET_IMAGE}-${INSTALLER_TARGET_DISTRO}-${INSTALLER_TARGET_MACHINE}"
IMAGE_DATA_POSTFIX ??= "wic.zst"
--
2.34.1

Anton Mikanovich

unread,
Jan 21, 2026, 10:30:42 AM (12 days ago) Jan 21
to isar-...@googlegroups.com, Uladzimir Bely, Anton Mikanovich
From: Uladzimir Bely <ub...@ilbers.de>

Task do_copy_boot_files was deploying DTB files into the same location
for different images (e.g. -base or -debug). This causes build issue.

Introduce `dtb-files` recipe responsible for the extraction of DTBs
from linux-image package (distro or self-built) and their deployment.

Different images for the same machine now depend on this recipe and
shouldn't cause parallel execution issues.

Signed-off-by: Uladzimir Bely <ub...@ilbers.de>
Signed-off-by: Anton Mikanovich <ami...@ilbers.de>
---
meta/classes-recipe/image.bbclass | 15 +++-----
meta/recipes-kernel/dtb-files/dtb-files.bb | 41 ++++++++++++++++++++++
2 files changed, 46 insertions(+), 10 deletions(-)
create mode 100644 meta/recipes-kernel/dtb-files/dtb-files.bb

diff --git a/meta/classes-recipe/image.bbclass b/meta/classes-recipe/image.bbclass
index e605bc80..dc599535 100644
--- a/meta/classes-recipe/image.bbclass
+++ b/meta/classes-recipe/image.bbclass
@@ -372,6 +372,11 @@ INITRD_IMG = "${PP_DEPLOY}/${INITRD_DEPLOY_FILE}"
# only one dtb file supported, pick the first
DTB_IMG = "${PP_DEPLOY}/${@(d.getVar('DTB_FILES').split() or [''])[0]}"

+python() {
+ if d.getVar('DTB_FILES'):
+ d.appendVarFlag("do_copy_boot_files", "depends", "dtb-files-${MACHINE}:do_deploy")
+}
+
do_copy_boot_files[cleandirs] += "${DEPLOYDIR}"
do_copy_boot_files[sstate-inputdirs] = "${DEPLOYDIR}"
do_copy_boot_files[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}"
@@ -385,16 +390,6 @@ do_copy_boot_files() {
sudo cat "$kernel" > "${DEPLOYDIR}/${KERNEL_IMAGE}"
fi

- for file in ${DTB_FILES}; do
- dtb="$(find '${IMAGE_ROOTFS}/usr/lib' -type f \
- -iwholename '*linux-image-*/'${file} | head -1)"
-
- if [ -z "$dtb" -o ! -e "$dtb" ]; then
- die "${file} not found"
- fi
-
- cp -f "$dtb" "${DEPLOYDIR}/"
- done
}
addtask copy_boot_files before do_rootfs_postprocess after do_rootfs_install

diff --git a/meta/recipes-kernel/dtb-files/dtb-files.bb b/meta/recipes-kernel/dtb-files/dtb-files.bb
new file mode 100644
index 00000000..f64b4845
--- /dev/null
+++ b/meta/recipes-kernel/dtb-files/dtb-files.bb
@@ -0,0 +1,41 @@
+# This software is a part of Isar.
+# Copyright (C) ilbers GmbH, 2025
+#
+# SPDX-License-Identifier: MIT
+
+inherit dpkg-raw
+
+PN:append = "-${MACHINE}"
+
+KERNEL_IMAGE_PKG ??= "${@ ("linux-image-" + d.getVar("KERNEL_NAME")) if d.getVar("KERNEL_NAME") else ""}"
+
+DEPENDS = "${KERNEL_IMAGE_PKG}"
+DEBIAN_BUILD_DEPENDS = "${KERNEL_IMAGE_PKG}"
+
+DPKG_ARCH = "${PACKAGE_ARCH}"
+
+do_prepare_build:append() {
+ for dtb in ${DTB_FILES}; do
+ dir=debian/${PN}/usr/lib/${PN}/$(dirname ${dtb})
+ cat <<EOF >> ${S}/debian/rules
+ mkdir -p ${dir}
+ find /usr/lib/linux-image* -path "*${dtb}" -print -exec cp {} ${dir} \;
+EOF
+ done
+}
+
+DTB_PACKAGE ??= "${PN}_${CHANGELOG_V}_${DISTRO_ARCH}.deb"
+
+do_deploy[dirs] = "${DEPLOY_DIR_IMAGE}"
+do_deploy[cleandirs] = "${WORKDIR}/deploy"
+do_deploy() {
+ dpkg --fsys-tarfile ${WORKDIR}/${DTB_PACKAGE} | \
+ tar --wildcards --extract --directory ${WORKDIR}/deploy ./usr/lib/${PN}
+ for dtb in ${DTB_FILES}; do
+ mkdir -p ${DEPLOY_DIR_IMAGE}/$(dirname ${dtb})
+ find ${WORKDIR}/deploy/usr/lib/${PN} -path "*${dtb}" -print \
+ -exec cp {} ${DEPLOY_DIR_IMAGE}/${dtb} \;
+ done
+}
+
+addtask deploy before do_deploy_deb after do_dpkg_build
--
2.34.1

Anton Mikanovich

unread,
Jan 21, 2026, 10:30:42 AM (12 days ago) Jan 21
to isar-...@googlegroups.com, Anton Mikanovich
Build several images in parallel to catch all possible conflicts
between deployed DTB files:
- Same distro/machine, different images.
- Same machine, different distros.

Signed-off-by: Anton Mikanovich <ami...@ilbers.de>
---
testsuite/citest.py | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)

diff --git a/testsuite/citest.py b/testsuite/citest.py
index 76a3df69..6f744c8c 100755
--- a/testsuite/citest.py
+++ b/testsuite/citest.py
@@ -484,6 +484,29 @@ class WicTest(CIBaseTest):
)


+class DtbDeployTest(CIBaseTest):
+
+ """
+ Build some targets potentially causing DTB deploy issues.
+ Cover cases:
+ - Same machine, different distros
+ - Same machine/distro, different images
+
+ :avocado: tags=dtbdeploy,full
+ """
+
+ def test_dtb_deploy(self):
+ targets = [
+ 'mc:phyboard-mira-bullseye:isar-image-base',
+ 'mc:phyboard-mira-bullseye:isar-image-ci',
+ 'mc:phyboard-mira-bookworm:isar-image-base',
+ 'mc:phyboard-mira-bookworm:isar-image-ci',
+ ]
+
+ self.init()
+ self.perform_build_test(targets)
+
+
class NoCrossTest(CIBaseTest):

"""
--
2.34.1

Jan Kiszka

unread,
Jan 21, 2026, 1:28:08 PM (12 days ago) Jan 21
to Anton Mikanovich, isar-...@googlegroups.com, Uladzimir Bely
Why does this need another package? We are repacking here already
packaged artifacts, and that only for the purpose of pushing them into
the deploy folder. This sounds strange, at best.

Jan
Siemens AG, Foundational Technologies
Linux Expert Center

Jan Kiszka

unread,
Jan 21, 2026, 1:29:21 PM (12 days ago) Jan 21
to Anton Mikanovich, isar-...@googlegroups.com
On 21.01.26 16:30, Anton Mikanovich wrote:
> As it was changed for fixing DTB deployment conflicts.
>

Than fix the patch that is changing it, or you are creating a friction
point for bisection.

Jan

Zhihang Wei

unread,
Jan 22, 2026, 11:53:42 AM (11 days ago) Jan 22
to Anton Mikanovich, isar-...@googlegroups.com
Hi,

The patchset is causing all 3 tests in InitRdTest test suite to fail, all
because of "initrd image not found". I think it's because of the change of
DEPLOY_DIR_IMAGE. Need to check that in detail.

Also it causes |NoCrossTest.test_nocross| to fail.
Failed job:
|isar-image-ci-qemuamd64-iso/1.0-r0/temp/log.do_image_wic.3271529|
|Log follows:|
|||INFO: Creating image(s)...
ERROR: _exec_cmd: cd
/tmp/isar-image-ci-debian-bookworm-qemuamd64-iso.wic/tmp.wic.2cow9dtb/INITRD
&& find . | cpio -o -H newc -R root:root
>/tmp/isar-image-ci-debian-bookworm-qemuamd64-iso.wic/tmp.wic.2cow9dtb/initrd.cpio
returned '127' instead of 0
output: /bin/sh: 1: cpio: not found.|

Zhihang

Anton Mikanovich

unread,
Jan 23, 2026, 7:40:18 AM (10 days ago) Jan 23
to Jan Kiszka, isar-...@googlegroups.com, Uladzimir Bely
21/01/2026 20:27, Jan Kiszka wrote:
>> diff --git a/meta/recipes-kernel/dtb-files/dtb-files.bb b/meta/recipes-kernel/dtb-files/dtb-files.bb
>> new file mode 100644
>> index 00000000..f64b4845
>> --- /dev/null
>> +++ b/meta/recipes-kernel/dtb-files/dtb-files.bb
>> @@ -0,0 +1,41 @@
>> +# This software is a part of Isar.
>> +# Copyright (C) ilbers GmbH, 2025
>> +#
>> +# SPDX-License-Identifier: MIT
>> +
>> +inherit dpkg-raw
>> +
> Why does this need another package? We are repacking here already
> packaged artifacts, and that only for the purpose of pushing them into
> the deploy folder. This sounds strange, at best.
>
> Jan
Hello Jan,

The idea was to avoid parallel execution issues by moving it from multiple
image recipes to one recipe which will cover all the images and any type of
kernel (prebuilt or self-built).

Anton Mikanovich

unread,
Jan 23, 2026, 7:44:31 AM (10 days ago) Jan 23
to Jan Kiszka, isar-...@googlegroups.com
21/01/2026 20:29, Jan Kiszka wrote:
> Than fix the patch that is changing it, or you are creating a friction
> point for bisection.
>
> Jan
Hello Jan,

This patch is related only to installer which was never changed in the
patchset
before. I don't think squashing all the changes to one commit will be a good
idea.

Jan Kiszka

unread,
Jan 23, 2026, 9:24:23 AM (10 days ago) Jan 23
to Anton Mikanovich, isar-...@googlegroups.com, Uladzimir Bely
Still makes no sense to me: One image, one kernel, one dtb deployment -
isn't that what patch 1 ensures?

Jan

Jan Kiszka

unread,
Jan 23, 2026, 9:26:57 AM (10 days ago) Jan 23
to Anton Mikanovich, isar-...@googlegroups.com
Patch 1 changes the deployment path without updating the installer. This
is what you "fix" here. That is at least how I read the description and
the changes. Or does the installer still work after applying patch 1?

Jan
Reply all
Reply to author
Forward
0 new messages