On Mon, 2024-08-19 at 17:17 +0200, Adrian Freihofer wrote:
> From: Adrian Freihofer <[email protected]>
> 
> * 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.
> 
>   Removing the do_bundle_initramfs also removes these task
> dependencies
>   do_deploy --> do_bundle_initramfs --> do_install. But the
> dependency
>   do_deploy --> do_install must be kept because the do_deploy task
> needs
>   the build folder when deploying the kernel artifacts. Therefore the
>   do_install depedency is added.
>   There is also a dependendency like do_deploy -->
> do_populate_sysroot
>   --> do_install. However since the do_populate_sysroot task is
> sstate
>   cached, the build folder is not available for the do_deploy task if
>   the do_populate_sysroot setscene tasks runs.
> 
> * 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 <[email protected]>
> ---
>  meta/classes-recipe/kernel-fitimage.bbclass | 57 ++++++++++++-------
> --
>  meta/classes-recipe/kernel.bbclass          | 29 ++++++-----
>  2 files changed, 50 insertions(+), 36 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 4464155b730..217f42b4f4f 100644
> --- a/meta/classes-recipe/kernel.bbclass
> +++ b/meta/classes-recipe/kernel.bbclass
> @@ -139,18 +139,23 @@ 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)

This line is still not ideal. I'm working on a v5 without it. Maybe
also with less changes in the kernel.bbclass.

Regards,
Adrian

>  
>      # NOTE: setting INITRAMFS_TASK is for backward compatibility
>      #       The preferred method is to set INITRAMFS_IMAGE, because
> @@ -330,6 +335,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}"
> @@ -350,8 +357,6 @@ python do_devshell:prepend () {
>      os.environ["LDFLAGS"] = ''
>  }
>  
> -addtask bundle_initramfs after do_install before do_deploy
> -
>  KERNEL_DEBUG_TIMESTAMPS ??= "0"
>  
>  kernel_do_compile() {
> @@ -873,7 +878,7 @@ kernel_do_deploy() {
>  # ensure we get the right values for both
>  do_deploy[prefuncs] += "read_subpackage_metadata"
>  
> -addtask deploy after do_populate_sysroot do_packagedata
> +addtask deploy after do_install do_populate_sysroot do_packagedata
>  
>  EXPORT_FUNCTIONS do_deploy
>  

-- 
Adrian Freihofer
Siemens AG
Mobile: +41 796819596
www.siemens.com

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#203681): 
https://lists.openembedded.org/g/openembedded-core/message/203681
Mute This Topic: https://lists.openembedded.org/mt/107982758/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to