From: Adrian Freihofer <adrian.freihofer@gmail.com>
To: openembedded-core@lists.openembedded.org
Cc: Adrian Freihofer <adrian.freihofer@siemens.com>
Subject: [PATCH 5/6] kernel: refactor fitimage
Date: Mon, 15 Jul 2024 16:10:42 +0200 [thread overview]
Message-ID: <20240715141448.2158477-6-adrian.freihofer@gmail.com> (raw)
In-Reply-To: <20240715141448.2158477-1-adrian.freihofer@gmail.com>
From: Adrian Freihofer <adrian.freihofer@siemens.com>
* do_bundle_initramfs only when needed
With INITRAMFS_IMAGE_BUNDLE = "1" the kernel Makefile is used to
bundle the kernel binary and the initramfs. This works only when the
build folder of the kernel is available. Building with sstate but with
an empty TMPDIR requires to rebuild the kernel from scratch whenever
something in the initramfs changes.
With INITRAMFS_IMAGE_BUNDLE = "" the fitImage generation is basically
independent from the kernel Makefile and could therefore work with
kernel binaries and tools provided by the sstate. But the dependency
on the do_bundle_initramfs tasks does not allow this. However, if the
INTIRAMFS_IMAGE is set but the INITRAMFS_IMAGE_BUNDLE is set to 0 the
do_bundle_initramfs does nothing. There is no real argument for
running this tasks.
As a first step towards getting the kernel from sstate when building
an unbundled fitImage, the task dependencies need to be simplified.
The do_bundle_initramfs task is now scheduled only when needed.
* If KERNEL_IMAGETYPES does not contain fitImage and INITRAMFS_IMAGE is
not set, the do_assemble_fitimage_initramfs ends up as an empty task.
Add the do_assemble_fitimage_initramfs only if a fitImage with
initramfs needs to be built.
* cd in bitbake task is easy to break e.g. by bbappend. Replace the cd
by defining the task's dirs variable flag.
* Add 3 comments which are helpful for the next commits.
* Since the tasks and task dependencies are anyway created by an
anonymous function, align and make the DEPENDS code more specific too.
This refactoring is not very valuable on its own. But it simplifies the
task dependencies which is helpful for the next commit.
Signed-off-by: Adrian Freihofer <adrian.freihofer@siemens.com>
---
meta/classes-recipe/kernel-fitimage.bbclass | 57 ++++++++++++---------
meta/classes-recipe/kernel.bbclass | 28 ++++++----
2 files changed, 50 insertions(+), 35 deletions(-)
diff --git a/meta/classes-recipe/kernel-fitimage.bbclass b/meta/classes-recipe/kernel-fitimage.bbclass
index 705b3ab657f..2dda5aec056 100644
--- a/meta/classes-recipe/kernel-fitimage.bbclass
+++ b/meta/classes-recipe/kernel-fitimage.bbclass
@@ -26,20 +26,8 @@ def get_fit_replacement_type(d):
return replacementtype
KERNEL_IMAGETYPE_REPLACEMENT ?= "${@get_fit_replacement_type(d)}"
-DEPENDS:append = " ${@'u-boot-tools-native dtc-native' if 'fitImage' in (d.getVar('KERNEL_IMAGETYPES') or '').split() else ''}"
python __anonymous () {
- # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal
- # to kernel.bbclass . We have to override it, since we pack zImage
- # (at least for now) into the fitImage .
- typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE") or ""
- if 'fitImage' in typeformake.split():
- d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', d.getVar('KERNEL_IMAGETYPE_REPLACEMENT')))
-
- image = d.getVar('INITRAMFS_IMAGE')
- if image:
- d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
-
ubootenv = d.getVar('UBOOT_ENV')
if ubootenv:
d.appendVarFlag('do_assemble_fitimage', 'depends', ' virtual/bootloader:do_populate_sysroot')
@@ -48,8 +36,31 @@ python __anonymous () {
providerdtb = d.getVar("PREFERRED_PROVIDER_virtual/dtb")
if providerdtb:
d.appendVarFlag('do_assemble_fitimage', 'depends', ' virtual/dtb:do_populate_sysroot')
- d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' virtual/dtb:do_populate_sysroot')
d.setVar('EXTERNAL_KERNEL_DEVICETREE', "${RECIPE_SYSROOT}/boot/devicetree")
+
+ typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE") or ""
+ if 'fitImage' in typeformake.split():
+ # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal
+ # to kernel.bbclass . We have to override it, since we pack zImage
+ # (at least for now) into the fitImage .
+ d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', d.getVar('KERNEL_IMAGETYPE_REPLACEMENT')))
+
+ # mkimage and dtc are required by the fitimage_assemble function
+ d.appendVarFlag('do_assemble_fitimage', 'depends',
+ ' u-boot-tools-native:do_populate_sysroot dtc-native:do_populate_sysroot')
+
+ initramfs_image = d.getVar('INITRAMFS_IMAGE')
+ bundled = bb.utils.to_boolean(d.getVar('INITRAMFS_IMAGE_BUNDLE'))
+ if initramfs_image:
+ if bundled:
+ bb.build.addtask('do_assemble_fitimage_initramfs', 'do_deploy', 'do_bundle_initramfs', d)
+ else:
+ bb.build.addtask('do_assemble_fitimage_initramfs', 'do_deploy', 'do_install', d)
+
+ d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends',
+ ' u-boot-tools-native:do_populate_sysroot dtc-native:do_populate_sysroot ${INITRAMFS_IMAGE}:do_image_complete')
+ if providerdtb:
+ d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' virtual/dtb:do_populate_sysroot')
}
@@ -797,19 +808,14 @@ do_install:append() {
}
do_assemble_fitimage_initramfs() {
- if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage" && \
- test -n "${INITRAMFS_IMAGE}" ; then
- cd ${B}
- if [ "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then
- fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-bundle ""
- ln -sf fitImage-bundle ${B}/${KERNEL_OUTPUT_DIR}/fitImage
- else
- fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-${INITRAMFS_IMAGE} 1
- fi
+ if [ "${INITRAMFS_IMAGE_BUNDLE}" = "1" ]; then
+ fitimage_assemble "fit-image-${INITRAMFS_IMAGE}.its" "${KERNEL_OUTPUT_DIR}/fitImage-bundle" ""
+ ln -sf fitImage-bundle "${B}/${KERNEL_OUTPUT_DIR}/fitImage"
+ else
+ fitimage_assemble "fit-image-${INITRAMFS_IMAGE}.its" "${KERNEL_OUTPUT_DIR}/fitImage-${INITRAMFS_IMAGE}" 1
fi
}
-
-addtask assemble_fitimage_initramfs before do_deploy after do_bundle_initramfs
+do_assemble_fitimage_initramfs[dirs] = "${B}"
do_kernel_generate_rsa_keys() {
if [ "${UBOOT_SIGN_ENABLE}" = "0" ] && [ "${FIT_GENERATE_KEYS}" = "1" ]; then
@@ -864,6 +870,7 @@ kernel_do_deploy:append() {
if echo ${KERNEL_IMAGETYPES} | grep -wq "fitImage"; then
if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
+ # deploy the artifacts of do_assemble_fitimage
bbnote "Copying fit-image.its source file..."
install -m 0644 ${B}/fit-image.its "$deployDir/fitImage-its-${KERNEL_FIT_NAME}.its"
if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then
@@ -878,12 +885,14 @@ kernel_do_deploy:append() {
fi
if [ -n "${INITRAMFS_IMAGE}" ]; then
+ # deploy the artifacts of do_assemble_fitimage_initramfs for bundled as well as un-bundled mode
bbnote "Copying fit-image-${INITRAMFS_IMAGE}.its source file..."
install -m 0644 ${B}/fit-image-${INITRAMFS_IMAGE}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its"
if [ -n "${KERNEL_FIT_LINK_NAME}" ] ; then
ln -snf fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}.its "$deployDir/fitImage-its-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_LINK_NAME}"
fi
+ # deploy the artifacts of do_assemble_fitimage_initramfs for bundled mode only
if [ "${INITRAMFS_IMAGE_BUNDLE}" != "1" ]; then
bbnote "Copying fitImage-${INITRAMFS_IMAGE} file..."
install -m 0644 ${B}/${KERNEL_OUTPUT_DIR}/fitImage-${INITRAMFS_IMAGE} "$deployDir/fitImage-${INITRAMFS_IMAGE_NAME}-${KERNEL_FIT_NAME}${KERNEL_FIT_BIN_EXT}"
diff --git a/meta/classes-recipe/kernel.bbclass b/meta/classes-recipe/kernel.bbclass
index 89badd90f18..6a8c3c25c07 100644
--- a/meta/classes-recipe/kernel.bbclass
+++ b/meta/classes-recipe/kernel.bbclass
@@ -136,18 +136,24 @@ fi
set -e
""" % (type, type, type))
-
image = d.getVar('INITRAMFS_IMAGE')
- # If the INTIRAMFS_IMAGE is set but the INITRAMFS_IMAGE_BUNDLE is set to 0,
- # the do_bundle_initramfs does nothing, but the INITRAMFS_IMAGE is built
- # standalone for use by wic and other tools.
if image:
- if d.getVar('INITRAMFS_MULTICONFIG'):
- d.appendVarFlag('do_bundle_initramfs', 'mcdepends', ' mc::${INITRAMFS_MULTICONFIG}:${INITRAMFS_IMAGE}:do_image_complete')
+ # If the INTIRAMFS_IMAGE is set but the INITRAMFS_IMAGE_BUNDLE is set to 0,
+ # the do_bundle_initramfs is not needed, but the INITRAMFS_IMAGE is built
+ # standalone for use by wic and other tools.
+ def add_initramfs_dep_task(initramfs_dep_task, d):
+ if d.getVar('INITRAMFS_MULTICONFIG'):
+ d.appendVarFlag(initramfs_dep_task, 'mcdepends', ' mc::${INITRAMFS_MULTICONFIG}:${INITRAMFS_IMAGE}:do_image_complete')
+ else:
+ d.appendVarFlag(initramfs_dep_task, 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
+
+ if bb.utils.to_boolean(d.getVar('INITRAMFS_IMAGE_BUNDLE')):
+ bb.build.addtask('do_bundle_initramfs', 'do_deploy', 'do_install', d)
+ add_initramfs_dep_task('do_bundle_initramfs', d)
+ bb.build.addtask('do_transform_bundled_initramfs', 'do_deploy', 'do_bundle_initramfs', d)
else:
- d.appendVarFlag('do_bundle_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
- if image and bb.utils.to_boolean(d.getVar('INITRAMFS_IMAGE_BUNDLE')):
- bb.build.addtask('do_transform_bundled_initramfs', 'do_deploy', 'do_bundle_initramfs', d)
+ add_initramfs_dep_task('do_deploy', d)
+ d.appendVarFlag('do_deploy', 'depends', ' ${PN}:do_install')
# NOTE: setting INITRAMFS_TASK is for backward compatibility
# The preferred method is to set INITRAMFS_IMAGE, because
@@ -327,6 +333,8 @@ do_bundle_initramfs () {
mv -f ${KERNEL_OUTPUT_DIR}/$imageType.bak ${KERNEL_OUTPUT_DIR}/$imageType
fi
done
+ else
+ bbwarn "Calling do_bundle_initramfs with INITRAMFS_IMAGE_BUNDLE=1 is deprecated"
fi
}
do_bundle_initramfs[dirs] = "${B}"
@@ -347,8 +355,6 @@ python do_devshell:prepend () {
os.environ["LDFLAGS"] = ''
}
-addtask bundle_initramfs after do_install before do_deploy
-
KERNEL_DEBUG_TIMESTAMPS ??= "0"
kernel_do_compile() {
--
2.45.2
next prev parent reply other threads:[~2024-07-15 14:15 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-15 14:10 [PATCH v2 0/6] Use the kernel from sstate when building fitImages Adrian Freihofer
2024-07-15 14:10 ` [PATCH 1/6] kernel-fitimage: fix intentation Adrian Freihofer
2024-07-15 14:10 ` [PATCH 2/6] kernel-fitimage: fix external dtb check Adrian Freihofer
2024-07-15 14:10 ` [PATCH 3/6] kernel: refactor linux compression Adrian Freihofer
2024-07-15 14:10 ` [PATCH 4/6] kernel-fitimage: refactor fitimage_assemble Adrian Freihofer
2024-07-15 14:10 ` Adrian Freihofer [this message]
2024-07-15 14:10 ` [PATCH 6/6] kernel-fitimage: run unbundled fitimage after deploy Adrian Freihofer
2024-07-15 14:22 ` [PATCH v2 0/6] Use the kernel from sstate when building fitImages Adrian Freihofer
2024-07-15 14:32 ` [OE-core] " Martin Jansa
2024-07-18 8:00 ` Adrian Freihofer
2024-07-18 8:39 ` Martin Jansa
2024-07-18 12:37 ` Adrian Freihofer
2024-07-18 13:29 ` Martin Jansa
2024-07-18 10:28 ` Jose Quaresma
2024-07-18 12:44 ` Adrian Freihofer
2024-07-24 15:54 ` Alexandre Belloni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240715141448.2158477-6-adrian.freihofer@gmail.com \
--to=adrian.freihofer@gmail.com \
--cc=adrian.freihofer@siemens.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox