[OE-core] [RFC][PATCH] kernel: Enable externalsrc on kernels which instantiate kernel.bbclass

Bruce Ashfield bruce.ashfield at windriver.com
Thu Feb 6 19:26:41 UTC 2014


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




More information about the Openembedded-core mailing list