On Wed, Nov 7, 2018 at 1:16 PM Nathan Rossi <nat...@nathanrossi.com> wrote: > > This change moves the initramfs bundling functions and tasks into a > separate class called 'kernel-initramfs'. The change also converts the > copy_initramfs into a task that itself depends on the do_image_complete > of the initramfs image. Making this change allows for the do_initramfs_* > tasks to be conditionally added instead of relying on the task checking > the variables, with the exception of do_deploy(_append). > > The 'use_alternate_initrd' of kernel_do_compile is replaced with a > general use 'extra_make' variable. And the INITRAMFS_TASK functionality > of kernel_do_compile is removed. > > The 'KERNEL_CLASSES' inherit is moved to after the EXPORT_FUNCTIONS > do_deploy in order to allow these classes to append to the do_deploy > task without breaking the do_deploy task itself. > > The functionality for INITRAMFS_TASK remained for backwards > compatibility when the bundle changes were introduced. The bundle > functionality has been available for a number of releases since, as such > this change does not carry forward the functionality of INITRAMFS_TASK. > The information regarding INITRAMFS_TASK issues for is kept along with > the generation of a bb.fatal when a user attempts to use it. > > Signed-off-by: Nathan Rossi <nat...@nathanrossi.com>
Hi Nathan, thanks for your efforts, clearly cleaning is needed wrt the bunling. As for the results of this work, I fear it will break the existent (10 yrs) infrastructure. A brief recap: we want to build a non-yocto kernel bundled with our initramfs image, this in a single kernel recipe. http://cgit.openembedded.org/meta-handheld/tree/recipes-kernel/linux/linux-kexecboot_4.4.bb In the years I have adjusted the recipe which is today needing both INITRAMFS_IMAGE = "initramfs-kexecboot-klibc-image" INITRAMFS_TASK = "${INITRAMFS_IMAGE}:do_image_complete" I will test your patch and include the new kernel-initramfs.bbclass. The point is that I don't want/need the NITRAMFS_IMAGE_BUNDLE for th emain kernel, just for thi ssecond kernel provided by the a.m. recipe. I have to check again but this var has to be set upper in local.conf, not in the recipe afaik. Let me pls check this before (n)acking it... Cheers Andrea > --- > meta/classes/kernel-initramfs.bbclass | 114 +++++++++++++++++++++++++ > meta/classes/kernel.bbclass | 155 > +++++----------------------------- > 2 files changed, 133 insertions(+), 136 deletions(-) > create mode 100644 meta/classes/kernel-initramfs.bbclass > > diff --git a/meta/classes/kernel-initramfs.bbclass > b/meta/classes/kernel-initramfs.bbclass > new file mode 100644 > index 0000000000..b23fb51495 > --- /dev/null > +++ b/meta/classes/kernel-initramfs.bbclass > @@ -0,0 +1,114 @@ > + > +INITRAMFS_IMAGE ?= "" > +INITRAMFS_IMAGE_NAME ?= "${@'${INITRAMFS_IMAGE}-${MACHINE}' if > d.getVar('INITRAMFS_IMAGE') else ''}" > +INITRAMFS_IMAGE_BUNDLE ?= "" > + > +python __anonymous () { > + # NOTE: setting INITRAMFS_TASK was for backward compatibility > + # The preferred method is to set INITRAMFS_IMAGE, because > + # this INITRAMFS_TASK has circular dependency problems > + # if the initramfs requires kernel modules > + if d.getVar('INITRAMFS_TASK'): > + bb.fatal("The INITRAMFS_TASK variable is no longer supported. Use > INITRAMFS_IMAGE and INITRAMFS_IMAGE_BUNDLE.") > + > + image = d.getVar("INITRAMFS_IMAGE") > + bundle = oe.types.boolean(d.getVar("INITRAMFS_IMAGE_BUNDLE") or "0") > + if image and bundle: > + # add all the tasks > + bb.build.addtask('do_initramfs_copy', 'do_initramfs_bundle', > 'do_install', d) > + bb.build.addtask('do_initramfs_bundle', 'do_deploy', > 'do_initramfs_copy', d) > + > + # make the do_initramfs_copy task depend on the image > do_image_complete task > + d.appendVarFlag('do_initramfs_copy', 'depends', ' > ${INITRAMFS_IMAGE}:do_image_complete') > +} > + > +do_initramfs_copy[dirs] = "${B}" > +do_initramfs_copy () { > + echo "Copying initramfs into ./usr ..." > + # In case the directory is not created yet from the first pass compile: > + mkdir -p ${B}/usr > + # Find and use the first initramfs image archive type we find > + rm -f ${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio > + for img in cpio cpio.gz cpio.lz4 cpio.lzo cpio.lzma cpio.xz; do > + if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img" ]; then > + cp ${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img ${B}/usr/. > + case $img in > + *gz) > + echo "gzip decompressing image" > + gunzip -f ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > + break > + ;; > + *lz4) > + echo "lz4 decompressing image" > + lz4 -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > + break > + ;; > + *lzo) > + echo "lzo decompressing image" > + lzop -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > + break > + ;; > + *lzma) > + echo "lzma decompressing image" > + lzma -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > + break > + ;; > + *xz) > + echo "xz decompressing image" > + xz -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > + break > + ;; > + esac > + fi > + done > + if [ ! -e ${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio ]; then > + bbfatal "Failed to copy initramfs cpio for image > ${INITRAMFS_IMAGE_NAME}" > + fi > + echo "Finished copy of initramfs into ./usr" > +} > + > +do_initramfs_bundle[dirs] = "${B}" > +do_initramfs_bundle () { > + echo "Creating a kernel image with a bundled initramfs..." > + # Backing up kernel image relies on its type(regular file or symbolic > link) > + tmp_path="" > + for imageType in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do > + if [ -h ${KERNEL_OUTPUT_DIR}/$imageType ] ; then > + linkpath=`readlink -n ${KERNEL_OUTPUT_DIR}/$imageType` > + realpath=`readlink -fn ${KERNEL_OUTPUT_DIR}/$imageType` > + mv -f $realpath $realpath.bak > + tmp_path=$tmp_path" "$imageType"#"$linkpath"#"$realpath > + elif [ -f ${KERNEL_OUTPUT_DIR}/$imageType ]; then > + mv -f ${KERNEL_OUTPUT_DIR}/$imageType > ${KERNEL_OUTPUT_DIR}/$imageType.bak > + tmp_path=$tmp_path" "$imageType"##" > + fi > + done > + extra_make=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio > + kernel_do_compile > + # Restoring kernel image > + for tp in $tmp_path ; do > + imageType=`echo $tp|cut -d "#" -f 1` > + linkpath=`echo $tp|cut -d "#" -f 2` > + realpath=`echo $tp|cut -d "#" -f 3` > + if [ -n "$realpath" ]; then > + mv -f $realpath $realpath.initramfs > + mv -f $realpath.bak $realpath > + ln -sf $linkpath.initramfs > ${B}/${KERNEL_OUTPUT_DIR}/$imageType.initramfs > + else > + mv -f ${KERNEL_OUTPUT_DIR}/$imageType > ${KERNEL_OUTPUT_DIR}/$imageType.initramfs > + mv -f ${KERNEL_OUTPUT_DIR}/$imageType.bak > ${KERNEL_OUTPUT_DIR}/$imageType > + fi > + done > +} > + > +do_deploy_append () { > + if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; > then > + for imageType in ${KERNEL_IMAGETYPES} ; do > + initramfs_base_name=${imageType}-${INITRAMFS_NAME} > + initramfs_symlink_name=${imageType}-${INITRAMFS_LINK_NAME} > + install -m 0644 ${KERNEL_OUTPUT_DIR}/${imageType}.initramfs > $deployDir/${initramfs_base_name}.bin > + ln -sf ${initramfs_base_name}.bin > $deployDir/${initramfs_symlink_name}.bin > + done > + fi > +} > + > diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass > index e04d2fe004..c0e9452ca6 100644 > --- a/meta/classes/kernel.bbclass > +++ b/meta/classes/kernel.bbclass > @@ -20,10 +20,6 @@ OE_TERMINAL_EXPORTS += "KBUILD_OUTPUT" > INHIBIT_DEFAULT_DEPS = "1" > > KERNEL_IMAGETYPE ?= "zImage" > -INITRAMFS_IMAGE ?= "" > -INITRAMFS_IMAGE_NAME ?= "${@['${INITRAMFS_IMAGE}-${MACHINE}', > ''][d.getVar('INITRAMFS_IMAGE') == '']}" > -INITRAMFS_TASK ?= "" > -INITRAMFS_IMAGE_BUNDLE ?= "" > > # KERNEL_VERSION is extracted from source code. It is evaluated as > # None for the first parsing, since the code has not been fetched. > @@ -93,37 +89,8 @@ python __anonymous () { > d.appendVar('RDEPENDS_%s-image' % kname, ' %s-image-%s' % (kname, > typelower)) > d.setVar('PKG_%s-image-%s' % (kname,typelower), > '%s-image-%s-${KERNEL_VERSION_PKG_NAME}' % (kname, typelower)) > d.setVar('ALLOW_EMPTY_%s-image-%s' % (kname, typelower), '1') > - > - image = d.getVar('INITRAMFS_IMAGE') > - if image: > - d.appendVarFlag('do_bundle_initramfs', 'depends', ' > ${INITRAMFS_IMAGE}:do_image_complete') > - > - # NOTE: setting INITRAMFS_TASK is for backward compatibility > - # The preferred method is to set INITRAMFS_IMAGE, because > - # this INITRAMFS_TASK has circular dependency problems > - # if the initramfs requires kernel modules > - image_task = d.getVar('INITRAMFS_TASK') > - if image_task: > - d.appendVarFlag('do_configure', 'depends', ' ${INITRAMFS_TASK}') > } > > -# Here we pull in all various kernel image types which we support. > -# > -# In case you're wondering why kernel.bbclass inherits the other image > -# types instead of the other way around, the reason for that is to > -# maintain compatibility with various currently existing meta-layers. > -# By pulling in the various kernel image types here, we retain the > -# original behavior of kernel.bbclass, so no meta-layers should get > -# broken. > -# > -# KERNEL_CLASSES by default pulls in kernel-uimage.bbclass, since this > -# used to be the default behavior when only uImage was supported. This > -# variable can be appended by users who implement support for new kernel > -# image types. > - > -KERNEL_CLASSES ?= " kernel-uimage " > -inherit ${KERNEL_CLASSES} > - > # Old style kernels may set ${S} = ${WORKDIR}/git for example > # We need to move these over to STAGING_KERNEL_DIR. We can't just > # create the symlink in advance as the git fetcher can't cope with > @@ -188,90 +155,10 @@ KERNEL_EXTRA_ARGS ?= "" > EXTRA_OEMAKE = " HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}" > HOSTCPP="${BUILD_CPP}"" > KERNEL_ALT_IMAGETYPE ??= "" > > -copy_initramfs() { > - echo "Copying initramfs into ./usr ..." > - # In case the directory is not created yet from the first pass > compile: > - mkdir -p ${B}/usr > - # Find and use the first initramfs image archive type we find > - rm -f ${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio > - for img in cpio cpio.gz cpio.lz4 cpio.lzo cpio.lzma cpio.xz; do > - if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img" ]; > then > - cp ${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img > ${B}/usr/. > - case $img in > - *gz) > - echo "gzip decompressing image" > - gunzip -f > ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > - break > - ;; > - *lz4) > - echo "lz4 decompressing image" > - lz4 -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > - break > - ;; > - *lzo) > - echo "lzo decompressing image" > - lzop -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > - break > - ;; > - *lzma) > - echo "lzma decompressing image" > - lzma -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > - break > - ;; > - *xz) > - echo "xz decompressing image" > - xz -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img > - break > - ;; > - esac > - fi > - done > - echo "Finished copy of initramfs into ./usr" > -} > - > -do_bundle_initramfs () { > - if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 > ]; then > - echo "Creating a kernel image with a bundled initramfs..." > - copy_initramfs > - # Backing up kernel image relies on its type(regular file or > symbolic link) > - tmp_path="" > - for imageType in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do > - if [ -h ${KERNEL_OUTPUT_DIR}/$imageType ] ; then > - linkpath=`readlink -n > ${KERNEL_OUTPUT_DIR}/$imageType` > - realpath=`readlink -fn > ${KERNEL_OUTPUT_DIR}/$imageType` > - mv -f $realpath $realpath.bak > - tmp_path=$tmp_path" > "$imageType"#"$linkpath"#"$realpath > - elif [ -f ${KERNEL_OUTPUT_DIR}/$imageType ]; then > - mv -f ${KERNEL_OUTPUT_DIR}/$imageType > ${KERNEL_OUTPUT_DIR}/$imageType.bak > - tmp_path=$tmp_path" "$imageType"##" > - fi > - done > - > use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio > - kernel_do_compile > - # Restoring kernel image > - for tp in $tmp_path ; do > - imageType=`echo $tp|cut -d "#" -f 1` > - linkpath=`echo $tp|cut -d "#" -f 2` > - realpath=`echo $tp|cut -d "#" -f 3` > - if [ -n "$realpath" ]; then > - mv -f $realpath $realpath.initramfs > - mv -f $realpath.bak $realpath > - ln -sf $linkpath.initramfs > ${B}/${KERNEL_OUTPUT_DIR}/$imageType.initramfs > - else > - mv -f ${KERNEL_OUTPUT_DIR}/$imageType > ${KERNEL_OUTPUT_DIR}/$imageType.initramfs > - mv -f ${KERNEL_OUTPUT_DIR}/$imageType.bak > ${KERNEL_OUTPUT_DIR}/$imageType > - fi > - done > - fi > -} > -do_bundle_initramfs[dirs] = "${B}" > - > python do_devshell_prepend () { > os.environ["LDFLAGS"] = '' > } > > -addtask bundle_initramfs after do_install before do_deploy > - > get_cc_option () { > # Check if KERNEL_CC supports the option "file-prefix-map". > # This option allows us to build images with __FILE__ values > that do not > @@ -302,22 +189,10 @@ kernel_do_compile() { > export KCONFIG_NOTIMESTAMP=1 > bbnote "KBUILD_BUILD_TIMESTAMP: $ts" > fi > - # The $use_alternate_initrd is only set from > - # do_bundle_initramfs() This variable is specifically for the > - # case where we are making a second pass at the kernel > - # compilation and we want to force the kernel build to use a > - # different initramfs image. The way to do that in the kernel > - # is to specify: > - # make ...args... CONFIG_INITRAMFS_SOURCE=some_other_initramfs.cpio > - if [ "$use_alternate_initrd" = "" ] && [ "${INITRAMFS_TASK}" != "" ] > ; then > - # The old style way of copying an prebuilt image and building > it > - # is turned on via INTIRAMFS_TASK != "" > - copy_initramfs > - > use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio > - fi > cc_extra=$(get_cc_option) > + # extra_make is set via users of kernel_do_compile like > do_initramfs_bundle > for typeformake in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do > - oe_runmake ${typeformake} CC="${KERNEL_CC} $cc_extra " > LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd > + oe_runmake ${typeformake} CC="${KERNEL_CC} $cc_extra " > LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $extra_make > done > # vmlinux.gz is not built by kernel > if (echo "${KERNEL_IMAGETYPES}" | grep -wq "vmlinux\.gz"); then > @@ -679,15 +554,6 @@ kernel_do_deploy() { > tar -cvzf $deployDir/modules-${MODULE_TARBALL_NAME}.tgz -C > ${D}${root_prefix} lib > ln -sf modules-${MODULE_TARBALL_NAME}.tgz > $deployDir/modules-${MODULE_TARBALL_LINK_NAME}.tgz > fi > - > - if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 > ]; then > - for imageType in ${KERNEL_IMAGETYPES} ; do > - initramfs_base_name=${imageType}-${INITRAMFS_NAME} > - > initramfs_symlink_name=${imageType}-${INITRAMFS_LINK_NAME} > - install -m 0644 > ${KERNEL_OUTPUT_DIR}/${imageType}.initramfs > $deployDir/${initramfs_base_name}.bin > - ln -sf ${initramfs_base_name}.bin > $deployDir/${initramfs_symlink_name}.bin > - done > - fi > } > do_deploy[cleandirs] = "${DEPLOYDIR}" > do_deploy[dirs] = "${DEPLOYDIR} ${B}" > @@ -697,5 +563,22 @@ addtask deploy after do_populate_sysroot do_packagedata > > EXPORT_FUNCTIONS do_deploy > > +# Here we pull in all various kernel image types which we support. > +# > +# In case you're wondering why kernel.bbclass inherits the other image > +# types instead of the other way around, the reason for that is to > +# maintain compatibility with various currently existing meta-layers. > +# By pulling in the various kernel image types here, we retain the > +# original behavior of kernel.bbclass, so no meta-layers should get > +# broken. > +# > +# KERNEL_CLASSES by default pulls in kernel-uimage.bbclass, since this > +# used to be the default behavior when only uImage was supported. This > +# variable can be appended by users who implement support for new kernel > +# image types. > + > +KERNEL_CLASSES ?= " kernel-uimage kernel-initramfs " > +inherit ${KERNEL_CLASSES} > + > # Add using Device Tree support > inherit kernel-devicetree > --- > 2.19.1 > -- > _______________________________________________ > Openembedded-core mailing list > Openembedded-core@lists.openembedded.org > http://lists.openembedded.org/mailman/listinfo/openembedded-core -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core