On 14-02-06 05:05 AM, Khem Raj wrote:
This also make a change where for kernel
S != B, this is done because when S = B
and we use O= option or set KBUILD_OUTPUT
to point to objectdir, kernel build system
ends up denoting itself dirty and asking for
running mrproper during later build steps
after do_configure but works perfectly
for when S != B

Additional fixes make sure that we do not
assume directory paths when accessing files

Move exporting KBUILD_OUTPUT from kernel-yocto
into kernel class

I worked through an external SRC build with B == S and B != S
and came up with a smaller, but similar set of changes.

I'd prefer to split the patch into a few smaller chunks, just
in case something goes wrong, or there are other missed use cases.

If you want to continue with the patch, it looks like it is going in
the right direction. Also, if you want, I can do some splits here
and soak it for a bit .. completely up to you.

Cheers,

Bryce


Signed-off-by: Khem Raj <raj.k...@gmail.com>
---
  meta/classes/kernel-yocto.bbclass |  3 +-
  meta/classes/kernel.bbclass       | 71 ++++++++++++++++++++++-----------------
  2 files changed, 41 insertions(+), 33 deletions(-)

diff --git a/meta/classes/kernel-yocto.bbclass 
b/meta/classes/kernel-yocto.bbclass
index 8f79932..73257e1 100644
--- a/meta/classes/kernel-yocto.bbclass
+++ b/meta/classes/kernel-yocto.bbclass
@@ -408,6 +408,5 @@ do_kernel_link_vmlinux() {
        ln -sf ../../../vmlinux
  }

-OE_TERMINAL_EXPORTS += "GUILT_BASE KBUILD_OUTPUT"
+OE_TERMINAL_EXPORTS += "GUILT_BASE"
  GUILT_BASE = "meta"
-KBUILD_OUTPUT = "${B}"
diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
index 51626b0..b000147 100644
--- a/meta/classes/kernel.bbclass
+++ b/meta/classes/kernel.bbclass
@@ -10,6 +10,7 @@ KERNEL_IMAGETYPE ?= "zImage"
  INITRAMFS_IMAGE ?= ""
  INITRAMFS_TASK ?= ""
  INITRAMFS_IMAGE_BUNDLE ?= ""
+B = "${WORKDIR}/build"

  python __anonymous () {
      kerneltype = d.getVar('KERNEL_IMAGETYPE', True) or ''
@@ -157,6 +158,7 @@ kernel_do_compile() {
        # different initramfs image.  The way to do that in the kernel
        # is to specify:
        # make ...args... CONFIG_INITRAMFS_SOURCE=some_other_initramfs.cpio
+       cd ${S}
        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 != ""
@@ -165,13 +167,14 @@ kernel_do_compile() {
        fi
        oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" 
LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd
        if test "${KERNEL_IMAGETYPE_FOR_MAKE}.gz" = "${KERNEL_IMAGETYPE}"; then
-               gzip -9c < "${KERNEL_IMAGETYPE_FOR_MAKE}" > "${KERNEL_OUTPUT}"
+               gzip -9c < "${B}/${KERNEL_IMAGETYPE_FOR_MAKE}" > 
"${KERNEL_OUTPUT}"
        fi
  }

  do_compile_kernelmodules() {
        unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
-       if (grep -q -i -e '^CONFIG_MODULES=y$' .config); then
+       cd ${S}
+       if (grep -q -i -e '^CONFIG_MODULES=y$' ${B}/.config); then
                oe_runmake ${PARALLEL_MAKE} modules CC="${KERNEL_CC}" 
LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS}
        else
                bbnote "no modules to compile"
@@ -184,7 +187,8 @@ kernel_do_install() {
        # First install the modules
        #
        unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
-       if (grep -q -i -e '^CONFIG_MODULES=y$' .config); then
+       cd ${S}
+       if (grep -q -i -e '^CONFIG_MODULES=y$' ${B}/.config); then
                oe_runmake DEPMOD=echo INSTALL_MOD_PATH="${D}" modules_install
                rm "${D}/lib/modules/${KERNEL_VERSION}/build"
                rm "${D}/lib/modules/${KERNEL_VERSION}/source"
@@ -200,10 +204,10 @@ kernel_do_install() {
        install -d ${D}/${KERNEL_IMAGEDEST}
        install -d ${D}/boot
        install -m 0644 ${KERNEL_OUTPUT} 
${D}/${KERNEL_IMAGEDEST}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}
-       install -m 0644 System.map ${D}/boot/System.map-${KERNEL_VERSION}
-       install -m 0644 .config ${D}/boot/config-${KERNEL_VERSION}
-       install -m 0644 vmlinux ${D}/boot/vmlinux-${KERNEL_VERSION}
-       [ -e Module.symvers ] && install -m 0644 Module.symvers 
${D}/boot/Module.symvers-${KERNEL_VERSION}
+       install -m 0644 ${B}/System.map ${D}/boot/System.map-${KERNEL_VERSION}
+       install -m 0644 ${B}/.config ${D}/boot/config-${KERNEL_VERSION}
+       install -m 0644 ${B}/vmlinux ${D}/boot/vmlinux-${KERNEL_VERSION}
+       [ -e ${B}/Module.symvers ] && install -m 0644 ${B}/Module.symvers 
${D}/boot/Module.symvers-${KERNEL_VERSION}
        install -d ${D}${sysconfdir}/modules-load.d
        install -d ${D}${sysconfdir}/modprobe.d

@@ -232,20 +236,21 @@ kernel_do_install() {
        # dir. This ensures the original Makefiles are used and not the
        # redirecting Makefiles in the build directory.
        #
+       pwd="$PWD"
+       cd "${B}"
        find . -depth -not -name "*.cmd" -not -name "*.o" -not -path "./Documentation*" 
-not -path "./.*" -print0 | cpio --null -pdlu $kerneldir
-       cp .config $kerneldir
+       cp ${B}/.config $kerneldir
        if [ "${S}" != "${B}" ]; then
-               pwd="$PWD"
                cd "${S}"
                find . -depth -not -path "./Documentation*" -not -path "./.*" 
-print0 | cpio --null -pdlu $kerneldir
-               cd "$pwd"
        fi
+       cd "$pwd"

        # Test to ensure that the output file and image type are not actually
        # the same file. If hardlinking is used, they will be the same, and 
there's
        # no need to install.
        ! [ ${KERNEL_OUTPUT} -ef $kerneldir/${KERNEL_IMAGETYPE} ] && install -m 
0644 ${KERNEL_OUTPUT} $kerneldir/${KERNEL_IMAGETYPE}
-       install -m 0644 System.map $kerneldir/System.map-${KERNEL_VERSION}
+       install -m 0644 ${B}/System.map $kerneldir/System.map-${KERNEL_VERSION}

        # Dummy Makefile so the clean below works
          mkdir $kerneldir/Documentation
@@ -260,24 +265,24 @@ kernel_do_install() {
        # we clean the scripts dir while leaving the generated config
        # and include files.
        #
-       oe_runmake -C $kerneldir CC="${KERNEL_CC}" LD="${KERNEL_LD}" clean
-       make -C $kerneldir _mrproper_scripts
+       oe_runmake KBUILD_OUTPUT= -C $kerneldir CC="${KERNEL_CC}" 
LD="${KERNEL_LD}" clean
+       make KBUILD_OUTPUT= -C $kerneldir _mrproper_scripts
        find $kerneldir -path $kerneldir/lib -prune -o -path $kerneldir/tools -prune -o 
-path $kerneldir/scripts -prune -o -name "*.[csS]" -exec rm '{}' \;

        # As of Linux kernel version 3.0.1, the clean target removes
        # arch/powerpc/lib/crtsavres.o which is present in
        # KBUILD_LDFLAGS_MODULE, making it required to build external modules.
        if [ ${ARCH} = "powerpc" ]; then
-               cp -l arch/powerpc/lib/crtsavres.o 
$kerneldir/arch/powerpc/lib/crtsavres.o
+               cp -l ${B}/arch/powerpc/lib/crtsavres.o 
$kerneldir/arch/powerpc/lib/crtsavres.o
        fi

        # Necessary for building modules like compat-wireless.
-       if [ -f include/generated/bounds.h ]; then
-               cp -l include/generated/bounds.h 
$kerneldir/include/generated/bounds.h
+       if [ -f ${B}/include/generated/bounds.h ]; then
+               cp -l ${B}/include/generated/bounds.h 
$kerneldir/include/generated/bounds.h
        fi
-       if [ -d arch/${ARCH}/include/generated ]; then
+       if [ -d ${B}/arch/${ARCH}/include/generated ]; then
                mkdir -p $kerneldir/arch/${ARCH}/include/generated/
-               cp -flR arch/${ARCH}/include/generated/* 
$kerneldir/arch/${ARCH}/include/generated/
+               cp -flR ${B}/arch/${ARCH}/include/generated/* 
$kerneldir/arch/${ARCH}/include/generated/
        fi

        # Remove the following binaries which cause strip or arch QA errors
@@ -302,6 +307,7 @@ python sysroot_stage_all () {
  }

  kernel_do_configure() {
+       cd ${S}
        # fixes extra + in /lib/modules/2.6.37+
        # $ scripts/setlocalversion . => +
        # $ make kernelversion => 2.6.37
@@ -313,7 +319,7 @@ kernel_do_configure() {
        if [ -f "${WORKDIR}/defconfig" ] && [ ! -f "${B}/.config" ]; then
                cp "${WORKDIR}/defconfig" "${B}/.config"
        fi
-       yes '' | oe_runmake oldconfig
+       oe_runmake olddefconfig
  }

  do_savedefconfig() {
@@ -432,19 +438,19 @@ do_uboot_mkimage() {
                if test "x${KEEPUIMAGE}" != "xyes" ; then
                        ENTRYPOINT=${UBOOT_ENTRYPOINT}
                        if test -n "${UBOOT_ENTRYSYMBOL}"; then
-                               ENTRYPOINT=`${HOST_PREFIX}nm ${S}/vmlinux | \
+                               ENTRYPOINT=`${HOST_PREFIX}nm ${B}/vmlinux | \
                                        awk '$3=="${UBOOT_ENTRYSYMBOL}" {print 
$1}'`
                        fi
-                       if test -e arch/${ARCH}/boot/compressed/vmlinux ; then
-                               ${OBJCOPY} -O binary -R .note -R .comment -S 
arch/${ARCH}/boot/compressed/vmlinux linux.bin
-                               uboot-mkimage -A ${UBOOT_ARCH} -O linux -T kernel -C none 
-a ${UBOOT_LOADADDRESS} -e $ENTRYPOINT -n "${DISTRO_NAME}/${PV}/${MACHINE}" -d 
linux.bin arch/${ARCH}/boot/uImage
-                               rm -f linux.bin
+                       if test -e ${B}/arch/${ARCH}/boot/compressed/vmlinux ; 
then
+                               ${OBJCOPY} -O binary -R .note -R .comment -S 
${B}/arch/${ARCH}/boot/compressed/vmlinux ${B}/linux.bin
+                               uboot-mkimage -A ${UBOOT_ARCH} -O linux -T kernel -C none 
-a ${UBOOT_LOADADDRESS} -e $ENTRYPOINT -n "${DISTRO_NAME}/${PV}/${MACHINE}" -d 
${B}/linux.bin ${B}/arch/${ARCH}/boot/uImage
+                               rm -f ${B}/linux.bin
                        else
-                               ${OBJCOPY} -O binary -R .note -R .comment -S 
vmlinux linux.bin
-                               rm -f linux.bin.gz
-                               gzip -9 linux.bin
-                               uboot-mkimage -A ${UBOOT_ARCH} -O linux -T kernel -C gzip 
-a ${UBOOT_LOADADDRESS} -e $ENTRYPOINT -n "${DISTRO_NAME}/${PV}/${MACHINE}" -d 
linux.bin.gz arch/${ARCH}/boot/uImage
-                               rm -f linux.bin.gz
+                               ${OBJCOPY} -O binary -R .note -R .comment -S 
${B}/vmlinux ${B}/linux.bin
+                               rm -f ${B}/linux.bin.gz
+                               gzip -9 ${B}/linux.bin > ${B}/linux.bin.gz
+                               uboot-mkimage -A ${UBOOT_ARCH} -O linux -T kernel -C gzip 
-a ${UBOOT_LOADADDRESS} -e $ENTRYPOINT -n "${DISTRO_NAME}/${PV}/${MACHINE}" -d 
${B}/linux.bin.gz ${B}/arch/${ARCH}/boot/uImage
+                               rm -f ${B}/linux.bin.gz
                        fi
                fi
        fi
@@ -453,8 +459,8 @@ do_uboot_mkimage() {
  addtask uboot_mkimage before do_install after do_compile

  kernel_do_deploy() {
-       install -m 0644 ${KERNEL_OUTPUT} 
${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}.bin
-       if [ ${MODULE_TARBALL_DEPLOY} = "1" ] && (grep -q -i -e 
'^CONFIG_MODULES=y$' .config); then
+       install -m 0644 
${D}/${KERNEL_IMAGEDEST}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} 
${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}.bin
+       if [ ${MODULE_TARBALL_DEPLOY} = "1" ] && (grep -q -i -e 
'^CONFIG_MODULES=y$' ${B}/.config); then
                mkdir -p ${D}/lib
                tar -cvzf ${DEPLOYDIR}/${MODULE_TARBALL_BASE_NAME} -C ${D} lib
                ln -sf ${MODULE_TARBALL_BASE_NAME} 
${DEPLOYDIR}/${MODULE_TARBALL_SYMLINK_NAME}
@@ -483,3 +489,6 @@ addtask deploy before do_build after do_install

  EXPORT_FUNCTIONS do_deploy

+OE_TERMINAL_EXPORTS += "KBUILD_OUTPUT"
+export KBUILD_OUTPUT = "${B}"
+


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

Reply via email to