In many cases, KERNEL_OUTPUT is a symbolic link to the real bootable image,
but in bundle_initramfs task, it's not considered so that the KERNEL_OUTPUT
is being renamed/restored as a regular file, this leads it finally point to
a incorrect target, or even worse, break the bundle_initramfs task for
KERNEL_OUTPUT is not going to be regenerated in case it is a symbolic link
to vmlinux.

Signed-off-by: Ming Liu <ming....@windriver.com>
---
 meta/classes/kernel.bbclass | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
index 966066f..ce987a5 100644
--- a/meta/classes/kernel.bbclass
+++ b/meta/classes/kernel.bbclass
@@ -123,13 +123,28 @@ 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
-               if [ -e ${KERNEL_OUTPUT} ] ; then
+               # Backuping kernel image relies on its type(regular file or 
symbolic link)
+               linkpath=""
+               realpath=""
+               if [ -h ${KERNEL_OUTPUT} ] ; then
+                       linkpath=`readlink -n ${KERNEL_OUTPUT}`
+                       realpath=`readlink -fn ${KERNEL_OUTPUT}`
+                       mv -f $realpath $realpath.bak
+               elif [ -f ${KERNEL_OUTPUT} ]; then
                        mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.bak
                fi
                
use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
                kernel_do_compile
-               mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.initramfs
-               mv -f ${KERNEL_OUTPUT}.bak ${KERNEL_OUTPUT}
+               # Restoring kernel image
+               if [ -n $realpath ]; then
+                       mv -f $realpath $realpath.initramfs
+                       mv -f $realpath.bak $realpath
+                       cd ${B}/$(dirname ${KERNEL_OUTPUT})
+                       ln -sf $linkpath.initramfs
+               else
+                       mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.initramfs
+                       mv -f ${KERNEL_OUTPUT}.bak ${KERNEL_OUTPUT}
+               fi
                # Update install area
                echo "There is kernel image bundled with initramfs: 
${B}/${KERNEL_OUTPUT}.initramfs"
                install -m 0644 ${B}/${KERNEL_OUTPUT}.initramfs 
${D}/boot/${KERNEL_IMAGETYPE}-initramfs-${MACHINE}.bin
-- 
1.8.4.1

_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to