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.

Also, we need move bundle_initramfs after kernel_link_vmlinux.

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

diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
index a4db9f5..2ec09ae 100644
--- a/meta/classes/kernel.bbclass
+++ b/meta/classes/kernel.bbclass
@@ -123,13 +123,29 @@ 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 [ ! -z $realpath ]; then
+                       mv -f $realpath $realpath.initramfs
+                       mv -f $realpath.bak $realpath
+                       cd ${B}/$(dirname ${KERNEL_OUTPUT})
+                       ln -sf $linkpath
+                       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
@@ -152,7 +168,7 @@ python do_devshell_prepend () {
     os.environ["LDFLAGS"] = ''
 }
 
-addtask bundle_initramfs after do_compile before do_build
+addtask bundle_initramfs after do_kernel_link_vmlinux before do_build
 
 kernel_do_compile() {
        unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
-- 
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