--- a/openembedded/classes/kernel.bbclass	2010-03-09 09:45:05.000000000 -0800
+++ b/openembedded/classes/kernel.bbclass	2010-03-09 14:07:21.000000000 -0800
@@ -55,12 +55,18 @@
 KERNEL_LD = "${LD}${KERNEL_LDSUFFIX} ${HOST_LD_KERNEL_ARCH}"
 
 # Where built kernel lies in the kernel tree
-KERNEL_OUTPUT ?= "arch/${ARCH}/boot/${KERNEL_IMAGETYPE}"
+B = "${WORKDIR}/build-${MACHINE}"
+KERNEL_OUTPUT ?= "${B}/arch/${ARCH}/boot/${KERNEL_IMAGETYPE}"
 KERNEL_IMAGEDEST = "boot"
 
+#If we are using an output dir for kernel objs, then add the switch
+EXTRA_KERNELMAKE += "-C ${S} O=${B}"
+SCENEFUNCS += "kernel_setscene_func"
 #
 # configuration
 #
+KERNEL_CONFIGFILE = "${B}/.config"
+
 export CMDLINE_CONSOLE = "console=${@bb.data.getVar("KERNEL_CONSOLE",d,1) or "ttyS0"}"
 
 KERNEL_VERSION = "${@get_kernelversion('${S}')}"
@@ -78,16 +84,27 @@
 # For the kernel, we don't want the '-e MAKEFLAGS=' in EXTRA_OEMAKE.
 # We don't want to override kernel Makefile variables from the environment
 EXTRA_OEMAKE = ""
+# I use EXTRA_KERNELMAKE to make sure its not confused with EXTRA_OEMAKE
+EXTRA_KERNELMAKE ?= ""
+
+# should only be called when using 
+kernel_setscene_func() {
+	if [ "${S}" != "${B}" ]; then
+		install -d ${B}
+		rm -f ${S}/.config
+	fi
+}
 
 kernel_do_compile() {
+	cd ${B}
 	unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
-	oe_runmake include/linux/version.h CC="${KERNEL_CC}" LD="${KERNEL_LD}"
+	oe_runmake ${EXTRA_KERNELMAKE} include/linux/version.h CC="${KERNEL_CC}" LD="${KERNEL_LD}"
 	if [ "${KERNEL_MAJOR_VERSION}" != "2.6" ]; then
 		oe_runmake dep CC="${KERNEL_CC}" LD="${KERNEL_LD}"
 	fi
-	oe_runmake ${KERNEL_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}"
-	if (grep -q -i -e '^CONFIG_MODULES=y$' .config); then
-		oe_runmake modules  CC="${KERNEL_CC}" LD="${KERNEL_LD}"
+	oe_runmake ${EXTRA_KERNELMAKE} ${KERNEL_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}"
+	if (grep -q -i -e '^CONFIG_MODULES=y$' ${KERNEL_CONFIGFILE}); then
+		oe_runmake ${EXTRA_KERNELMAKE} modules  CC="${KERNEL_CC}" LD="${KERNEL_LD}"
 	else
 		oenote "no modules to compile"
 	fi
@@ -95,9 +112,9 @@
 kernel_do_compile[depends] = "${INITRAMFS_TASK}"
 
 kernel_do_stage() {
-	if [ -e include/asm ] ; then
+	if [ -e ${B}/include/asm ] ; then
 		# This link is generated only in kernel before 2.6.33-rc1, don't stage it for newer kernels
-		ASMDIR=`readlink include/asm`
+		ASMDIR=`readlink ${B}/include/asm`
 
 		mkdir -p ${STAGING_KERNEL_DIR}/include/$ASMDIR
 		cp -fR include/$ASMDIR/* ${STAGING_KERNEL_DIR}/include/$ASMDIR/
@@ -112,14 +129,14 @@
 
 	# Check for arch/x86 on i386
 	elif [ -d arch/x86/include/asm/ ]; then
-		if [ -e include/asm ] ; then
+		if [ -e ${B}/include/asm ] ; then
 			cp -fR arch/x86/include/asm/* ${STAGING_KERNEL_DIR}/include/asm-x86/
 		fi
 		install -d ${STAGING_KERNEL_DIR}/arch/x86/include
 		cp -fR arch/x86/* ${STAGING_KERNEL_DIR}/arch/x86/
 	fi
 
-	if [ -e include/asm ] ; then
+	if [ -e ${B}/include/asm ] ; then
 		rm -f ${STAGING_KERNEL_DIR}/include/asm
 		ln -sf $ASMDIR ${STAGING_KERNEL_DIR}/include/asm
 	fi
@@ -140,9 +157,9 @@
 		cp -fR drivers/sound/*.h ${STAGING_KERNEL_DIR}/include/drivers/sound/
 	fi
 
-	install -m 0644 .config ${STAGING_KERNEL_DIR}/config-${KERNEL_VERSION}
-	ln -sf config-${KERNEL_VERSION} ${STAGING_KERNEL_DIR}/.config
-	ln -sf config-${KERNEL_VERSION} ${STAGING_KERNEL_DIR}/kernel-config
+	install -m 0644 ${B}/.config ${STAGING_KERNEL_DIR}/config-${KERNEL_VERSION}
+	ln -sf ${B}/config-${KERNEL_VERSION} ${STAGING_KERNEL_DIR}/.config
+	ln -sf ${B}/config-${KERNEL_VERSION} ${STAGING_KERNEL_DIR}/kernel-config
 	echo "${KERNEL_VERSION}" >${STAGING_KERNEL_DIR}/kernel-abiversion
 	echo "${S}" >${STAGING_KERNEL_DIR}/kernel-source
 	echo "${KERNEL_CCSUFFIX}" >${STAGING_KERNEL_DIR}/kernel-ccsuffix
@@ -159,17 +176,33 @@
 		install -d ${STAGING_KERNEL_DIR}/arch/x86
 		install -m 0644 arch/x86/Makefile* ${STAGING_KERNEL_DIR}/arch/x86
 	fi
-	cp -fR include/config* ${STAGING_KERNEL_DIR}/include/	
+	cp -fR ${B}/include/config* ${STAGING_KERNEL_DIR}/include/	
 	# Install kernel images and system.map to staging
-	[ -e vmlinux ] && install -m 0644 vmlinux ${STAGING_KERNEL_DIR}/	
+	[ -e ${B}/vmlinux ] && install -m 0644 ${B}/vmlinux ${STAGING_KERNEL_DIR}/	
 	install -m 0644 ${KERNEL_OUTPUT} ${STAGING_KERNEL_DIR}/${KERNEL_IMAGETYPE}
-	install -m 0644 System.map ${STAGING_KERNEL_DIR}/System.map-${KERNEL_VERSION}
-	[ -e Module.symvers ] && install -m 0644 Module.symvers ${STAGING_KERNEL_DIR}/
+	install -m 0644 ${B}/System.map ${STAGING_KERNEL_DIR}/System.map-${KERNEL_VERSION}
+	[ -e Module.symvers ] && install -m 0644 ${B}/Module.symvers ${STAGING_KERNEL_DIR}/
+
+	cp -fR ${S}/scripts ${STAGING_KERNEL_DIR}/
+	cp -fR ${B}/scripts ${STAGING_KERNEL_DIR}/
+
+	if [ ! -e ${STAGING_KERNEL_DIR}/include/linux ]; then \
+		install -m 0755 -d ${STAGING_KERNEL_DIR}/include/linux; \
+	fi
+	install -m 0644 ${B}/include/linux/* \
+		${STAGING_KERNEL_DIR}/include/linux
+	if [ ! -e ${STAGING_KERNEL_DIR}/include/config ]; then \
+		install -m 0755 -d ${STAGING_KERNEL_DIR}/include/config; \
+	fi
+	install -m 0644 ${B}/include/config/auto.conf \
+		${STAGING_KERNEL_DIR}/include/config
 
-	cp -fR scripts ${STAGING_KERNEL_DIR}/
+	install -m 0644 ${B}/include/linux/version.h ${STAGING_KERNEL_DIR}/include/linux
 }
+do_stage[dirs] = "${S}"
 
 kernel_do_install() {
+	cd ${B}
 	unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
 	if (grep -q -i -e '^CONFIG_MODULES=y$' .config); then
 		oe_runmake DEPMOD=echo INSTALL_MOD_PATH="${D}" modules_install
@@ -199,7 +232,8 @@
 }
 
 kernel_do_configure() {
-	yes '' | oe_runmake oldconfig
+	cd ${B}
+	yes '' | oe_runmake ${EXTRA_KERNELMAKE} oldconfig
 	if [ ! -z "${INITRAMFS_IMAGE}" ]; then
 		for img in cpio.gz cpio.lzo cpio.lzma; do
 		if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img" ]; then
@@ -210,13 +244,16 @@
 }
 
 do_menuconfig() {
+	cd ${B}
+	export DISPLAY="${DISPLAY}"
 	export TERMWINDOWTITLE="${PN} Kernel Configuration"
-	export SHELLCMDS="make menuconfig"
+	export SHELLCMDS="make ${EXTRA_KERNELMAKE} menuconfig"
 	${TERMCMDRUN}
 	if [ $? -ne 0 ]; then
 		echo "Fatal: '${TERMCMD}' not found. Check TERMCMD variable."
 		exit 1
 	fi
+	yes '' | oe_runmake ${EXTRA_KERNELMAKE} oldconfig
 }
 do_menuconfig[nostamp] = "1"
 addtask menuconfig after do_configure
@@ -529,7 +566,7 @@
 do_deploy() {
 	install -d ${DEPLOY_DIR_IMAGE}
 	install -m 0644 ${KERNEL_OUTPUT} ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.bin
-	package_stagefile_shell ${S}/${KERNEL_OUTPUT}
+	package_stagefile_shell ${KERNEL_OUTPUT}
 	package_stagefile_shell ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.bin
 
 	if [ -d "${PKGD}/lib" ]; then
