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

Khem Raj raj.khem at gmail.com
Thu Feb 6 19:36:20 UTC 2014


On Thu, Feb 6, 2014 at 11:26 AM, Bruce Ashfield
<bruce.ashfield at 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 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