Patchwork [RFC] kernel: Enable externalsrc on kernels which instantiate kernel.bbclass

login
register
mail settings
Submitter Khem Raj
Date Feb. 6, 2014, 10:05 a.m.
Message ID <1391681105-8896-1-git-send-email-raj.khem@gmail.com>
Download mbox | patch
Permalink /patch/66361/
State New
Headers show

Comments

Khem Raj - Feb. 6, 2014, 10:05 a.m.
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

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 meta/classes/kernel-yocto.bbclass |  3 +-
 meta/classes/kernel.bbclass       | 71 ++++++++++++++++++++++-----------------
 2 files changed, 41 insertions(+), 33 deletions(-)
Bruce Ashfield - Feb. 6, 2014, 1:38 p.m.
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
>
> Signed-off-by: Khem Raj <raj.khem@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"

We shouldn't be enforcing "${WORKDIR}/build" here, the name needs to be
variable .. for instance all my kernel recipes already set it to
something else.

As for the rest, I don't get it. I've been doing split source and
kernel builds for 4 years no, with no issues, so we shouldn't need
all the directory shuffling and changing that is happening in this
patch.

Let me do some test builds and see what I can find.

Bruce

>
>   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}"
> +
>
Bruce Ashfield - Feb. 6, 2014, 7:26 p.m.
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.khem@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}"
> +
>
Khem Raj - Feb. 6, 2014, 7:36 p.m.
On Thu, Feb 6, 2014 at 11:26 AM, Bruce Ashfield
<bruce.ashfield@windriver.com> wrote:
> 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.
>

OK sure.

> 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.
>

soak it no problems.

> Cheers,
>
> Bryce
>
>
>>
>> Signed-off-by: Khem Raj <raj.khem@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}"
>> +
>>
>
Paul Eggleton - Sept. 22, 2014, 3:24 p.m.
On Thursday 06 February 2014 02:05:05 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
> 
> Signed-off-by: Khem Raj <raj.khem@gmail.com>

So discussion on this patch seems to have stalled - did you guys make any 
progress offline?

Looking over the patch I'd guess we'd want to try to avoid cd'ing and instead 
be explicit about the path where needed.

Cheers,
Paul
Bruce Ashfield - Sept. 22, 2014, 3:27 p.m.
On 14-09-22 11:24 AM, Paul Eggleton wrote:
> On Thursday 06 February 2014 02:05:05 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
>>
>> Signed-off-by: Khem Raj <raj.khem@gmail.com>
>
> So discussion on this patch seems to have stalled - did you guys make any
> progress offline?

I have an updated patch that I've been carrying in my tree ever
since.

>
> Looking over the patch I'd guess we'd want to try to avoid cd'ing and instead
> be explicit about the path where needed.

I have some more cleanups to this effect, and will send them post
1.7.

But the reports we've been getting have been that externalsrc
builds are working for kernels, and linux-yocto without the change
in place, so I'm looking to reduce the patch footprint and re-submit.

Bruce

>
> Cheers,
> Paul
>
Khem Raj - Sept. 22, 2014, 5:03 p.m.
On Mon, Sep 22, 2014 at 8:27 AM, Bruce Ashfield
<bruce.ashfield@windriver.com> wrote:
> But the reports we've been getting have been that externalsrc
> builds are working for kernels, and linux-yocto without the change
> in place, so I'm looking to reduce the patch footprint and re-submit.

no, it cant work if folks were trying the usecase I have mentioned.
The fix is infact for
non linux-yocto kernels.
Bruce Ashfield - Sept. 22, 2014, 5:04 p.m.
On 14-09-22 01:03 PM, Khem Raj wrote:
> On Mon, Sep 22, 2014 at 8:27 AM, Bruce Ashfield
> <bruce.ashfield@windriver.com> wrote:
>> But the reports we've been getting have been that externalsrc
>> builds are working for kernels, and linux-yocto without the change
>> in place, so I'm looking to reduce the patch footprint and re-submit.
>
> no, it cant work if folks were trying the usecase I have mentioned.
> The fix is infact for
> non linux-yocto kernels.

I'll send out my updated patch shortly, it should fix both cases.

Bruce

>

Patch

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}"
+