[OE-core] [PATCH] [RFC] kernel: rework kernel and module classes to allow for building out-of-tree modules
Darren Hart
dvhart at linux.intel.com
Tue Mar 15 17:07:14 UTC 2011
On 03/15/2011 01:31 AM, Koen Kooi wrote:
>
> Op 15 mrt 2011, om 08:25 heeft Darren Hart het volgende geschreven:
>
>> NOT FOR INCLUSION
>>
>> Before we include something like this, it needs review from folks
>> like Koen and Gary to confirm it works in their environment as
>> well.
>>
>> The existing infrastructure uses an external build tree which
>> references the kernel source in the work dir. If run with rm work,
>> building external modules will fail.
>>
>> This patch places a configured source tree in sysroots. Striking a
>> balance between minimal size and minimal maintenance is difficult.
>> This version leans on the side of caution and removes only the
>> obviously unecessary parts of the source tree to conserve space.
>>
>> Care is also taken to clean the hostprogs in scripts, and the
>> modules are responsible for building them as needed.
>
> I get this:
>
> | cp: cannot open
> `./.pc/0001-PSP-3.0.1.6-kernel-source-patched-with-OCF-Linux.patch/crypto/ocf/ixp4xx/ixp4xx.c'
> for reading: Permission denied
>
> After adding 'do_make_scripts' in my module do_compile and applying
> your patch. So it seems to be tripping on the quilt directory :(
What are the ownership and perms on those?
I suppose we could avoid the .pc directory - but it's going to require
something more than cp or some additional scripting. Something like
tar's exclude functionality might be needed - but I hate to add the
intermediate step as the kernel recipes are already so slow.
--
Darren
>
> regards,
>
> Koen
>
>
>>
>> Signed-off-by: Darren Hart<dvhart at linux.intel.com> CC: Koen
>> Kooi<koen at beagleboard.org> CC: Gary Thomas<gary at mlbassoc.com> ---
>> meta/classes/kernel.bbclass | 96
>> ++++++++++------------------ meta/classes/module.bbclass
>> | 9 ++- meta/recipes-kernel/linux/linux-yocto.inc | 4 + 3
>> files changed, 45 insertions(+), 64 deletions(-)
>>
>> diff --git a/meta/classes/kernel.bbclass
>> b/meta/classes/kernel.bbclass index 90a7d64..c714931 100644 ---
>> a/meta/classes/kernel.bbclass +++ b/meta/classes/kernel.bbclass @@
>> -110,78 +110,50 @@ kernel_do_install() { install -d
>> ${D}/etc/modprobe.d fi
>>
>> - + # + # Support for external module building - create a minimal
>> copy of the + # kernel source tree. + # +
>> kerneldir=${STAGING_KERNEL_DIR} + install -d $kerneldir
>>
>> # - # Support for external module building - create a minimal copy
>> of the kernel source tree + # Copy the entire source tree. In case
>> an external build directory is + # used, copy the build directory
>> over first, then copy over the source + # dir. This ensures the
>> original Makefiles are used and not the + # redirecting Makefiles
>> in the build directory. # - kerneldir=${D}/kernel/ - - # Take care
>> of arch specific headers - # Kernel 2.6.27 moved headers from
>> includes/asm-${ARCH} to arch/${ARCH}/include/asm - if [ -e
>> arch/${ARCH}/include/asm/ ] ; then - install -d
>> $kerneldir/arch/${ARCH}/ - cp -fR arch/${ARCH}/*
>> $kerneldir/arch/${ARCH}/ - - # Check for arch/x86 on i386 - elif [
>> -d arch/x86/include/asm/ ]; then - if [ -e include/asm ] ; then -
>> install -d $kerneldir/include/asm/ - cp -fR
>> arch/x86/include/asm/* $kerneldir/include/asm/ - fi - install -d
>> $kerneldir/arch/x86/include - cp -fR arch/x86/*
>> $kerneldir/arch/x86/ + # work and sysroots can be + # on different
>> partitions, so we can't rely on hardlinking, + # unfortunately. +
>> # + cp -fR ./ $kerneldir + if [ ! "${S}" == "${B}" ]; then + cp
>> -fR ${S}/* $kerneldir fi
>>
>> - # Take care of the rest of the main directories we need - for
>> entry in drivers/crypto drivers/media include scripts; do - if [
>> -d $entry ]; then - mkdir -p $kerneldir/$entry - cp -fR
>> $entry/* $kerneldir/$entry/ - fi - done - - install -m 0644
>> .config $kerneldir/config-${KERNEL_VERSION} - ln -sf
>> config-${KERNEL_VERSION} $kerneldir/.config - ln -sf
>> config-${KERNEL_VERSION} $kerneldir/kernel-config - echo
>> "${KERNEL_VERSION}">$kerneldir/kernel-abiversion - echo
>> "${S}">$kerneldir/kernel-source - echo
>> "${KERNEL_CCSUFFIX}">$kerneldir/kernel-ccsuffix - echo
>> "${KERNEL_LDSUFFIX}">$kerneldir/kernel-ldsuffix - [ -e vmlinux ]&&
>> install -m 0644 vmlinux $kerneldir/ - install -m 0644
>> ${KERNEL_OUTPUT} $kerneldir/${KERNEL_IMAGETYPE} - install -m 0644
>> System.map $kerneldir/System.map-${KERNEL_VERSION} - [ -e
>> Module.symvers ]&& install -m 0644 Module.symvers $kerneldir/ - -
>> # Copy over the main Makefiles - [ -e Rules.make ]&& install -m
>> 0644 Rules.make $kerneldir/ - [ -e Makefile ]&& install -m 0644
>> Makefile $kerneldir/ - # Check if arch/${ARCH}/Makefile exists and
>> install it - if [ -e arch/${ARCH}/Makefile ]; then - install -d
>> $kerneldir/arch/${ARCH} - install -m 0644 arch/${ARCH}/Makefile*
>> $kerneldir/arch/${ARCH} - # Otherwise check arch/x86/Makefile for
>> i386 and x86_64 on kernels>= 2.6.24 - elif [ -e arch/x86/Makefile
>> ]; then - install -d $kerneldir/arch/x86 - install -m 0644
>> arch/x86/Makefile* $kerneldir/arch/x86 - fi + # + # Clean and
>> remove files not needed for building modules. + # Some
>> distributions go through a lot more trouble to strip out + #
>> unecessary headers, for now, we just prune the obvious bits. + # +
>> # We don't want to leave host-arch binaries in /sysroots, so + # 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 _mrproper_scripts + find $kerneldir
>> -path $kerneldir/scripts -prune -o -name "*.[csS]" -exec rm '{}'
>> \; + find $kerneldir/Documentation -name "*.txt" -exec rm '{}' \;
>>
>> # Remove the following binaries which cause strip errors # during
>> do_package for cross-compiled platforms
>> bin_files="arch/powerpc/boot/addnote arch/powerpc/boot/hack-coff \
>> - arch/powerpc/boot/mktree scripts/bin2c scripts/conmakehash \ -
>> scripts/ihex2fw scripts/kallsyms scripts/pnmtologo
>> scripts/basic/docproc \ - scripts/basic/fixdep scripts/basic/hash
>> scripts/dtc/dtc \ - scripts/genksyms/genksyms scripts/kconfig/conf
>> scripts/mod/mk_elfconfig \ - scripts/mod/modpost
>> scripts/recordmcount" - rm -rf $kerneldir/scripts/*.o - rm -rf
>> $kerneldir/scripts/basic/*.o - rm -rf
>> $kerneldir/scripts/kconfig/*.o - rm -rf $kerneldir/scripts/mod/*.o
>> - rm -rf $kerneldir/scripts/dtc/*.o +
>> arch/powerpc/boot/mktree" for entry in $bin_files; do - rm -f
>> $kerneldir/$entry - done + rm -f $kerneldir/$entry + done
>> + }
>>
>> sysroot_stage_all_append() { diff --git
>> a/meta/classes/module.bbclass b/meta/classes/module.bbclass index
>> bbceaf7..572df0d 100644 --- a/meta/classes/module.bbclass +++
>> b/meta/classes/module.bbclass @@ -3,14 +3,19 @@ DEPENDS +=
>> "virtual/kernel"
>>
>> inherit module-base
>>
>> -# Ensure the hostprogs are available for module compilation
>> -module_do_compile_prepend() { +# +# Ensure the hostprogs are
>> available for module compilation. Modules that +# inherit this
>> recipe and override do_compile() should be sure to call +#
>> do_make_scripts() or ensure the scripts are built independently.
>> +# +do_make_scripts() { unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS
>> oe_runmake CC="${KERNEL_CC}" LD="${KERNEL_LD}" AR="${KERNEL_AR}" \
>> -C ${STAGING_KERNEL_DIR} scripts }
>>
>> module_do_compile() { + do_make_scripts unset CFLAGS CPPFLAGS
>> CXXFLAGS LDFLAGS oe_runmake KERNEL_PATH=${STAGING_KERNEL_DIR} \
>> KERNEL_SRC=${STAGING_KERNEL_DIR} \ diff --git
>> a/meta/recipes-kernel/linux/linux-yocto.inc
>> b/meta/recipes-kernel/linux/linux-yocto.inc index 0812144..582e386
>> 100644 --- a/meta/recipes-kernel/linux/linux-yocto.inc +++
>> b/meta/recipes-kernel/linux/linux-yocto.inc @@ -21,3 +21,7 @@
>> inherit kernel-yocto require linux-dtb.inc
>>
>> B = "${WORKDIR}/linux-${MACHINE}-${LINUX_KERNEL_TYPE}-build" +
>> +do_install_append(){ + rm -rf ${STAGING_KERNEL_DIR}/$KMETA +} --
>> 1.7.1
>>
>
--
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel
More information about the Openembedded-core
mailing list