[v5,3/3] meta: Move DTB deployment to a separate dtb-files recipe

Message ID 20260206122910.248334-4-amikan@ilbers.de
State Under Review
Headers show
Series Deploy DTBs with separate recipe | expand

Commit Message

Anton Mikanovich Feb. 6, 2026, 12:27 p.m. UTC
From: Uladzimir Bely <ubely@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 <ubely@ilbers.de>
Signed-off-by: Anton Mikanovich <amikan@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

Comments

Jan Kiszka Feb. 6, 2026, 1:39 p.m. UTC | #1
On 06.02.26 13:27, Anton Mikanovich wrote:
> From: Uladzimir Bely <ubely@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.
> 

But this still doesn't justify this redundant extraction. Adjust the
deployment paths and be done.

Jan

> 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 <ubely@ilbers.de>
> Signed-off-by: Anton Mikanovich <amikan@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

Patch

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