[OE-core] [PATCH 3/3] kernel-devsrc: restructure for out of tree (and on target) module builds

Bruce Ashfield bruce.ashfield at windriver.com
Wed Feb 28 16:51:05 UTC 2018


Unfortunately, I can't reproduce that here.

This has been built and tested on all arches by myself and others, but
I can try again .. just no promises when I'll get back to it.

Bruce

On 02/28/2018 11:38 AM, Burton, Ross wrote:
> Sorry, but this breaks on ARM:
> 
> ERROR: kernel-devsrc-1.0-r0 do_install: Function failed: do_install (log 
> file is located at 
> /home/pokybuild/yocto-autobuilder/yocto-worker/nightly-arm/build/build/tmp/work/qemuarm-poky-linux-gnueabi/kernel-devsrc/1.0-r0/temp/log.do_install.25822)
> ERROR: Logfile of failure stored in: 
> /home/pokybuild/yocto-autobuilder/yocto-worker/nightly-arm/build/build/tmp/work/qemuarm-poky-linux-gnueabi/kernel-devsrc/1.0-r0/temp/log.do_install.25822
> Log data follows:
> | DEBUG: Executing shell function do_install
> | cp: with --parents, the destination must be a directory
> | Try 'cp --help' for more information.
> | WARNING: 
> /home/pokybuild/yocto-autobuilder/yocto-worker/nightly-arm/build/build/tmp/work/qemuarm-poky-linux-gnueabi/kernel-devsrc/1.0-r0/temp/run.do_install.25822:1 
> exit 1 from 'rm -rf $kerneldir/build/include'
> | ERROR: Function failed: do_install (log file is located at 
> /home/pokybuild/yocto-autobuilder/yocto-worker/nightly-arm/build/build/tmp/work/qemuarm-poky-linux-gnueabi/kernel-devsrc/1.0-r0/temp/log.do_install.25822)
> 
> Ross
> 
> On 28 February 2018 at 02:06, Bruce Ashfield 
> <bruce.ashfield at windriver.com <mailto:bruce.ashfield at windriver.com>> wrote:
> 
>     The existing kernel-devsrc package starts with a full copy of the kernel
>     source and then starts to strip out elements that are not required.
> 
>     This results in extra time (I/O) and extra space being taken up in the
>     final package. The main purpose of the kernel-devsrc package has been to
>     build modules against the running kernel, not to include a full copy of
>     the source code for re-building the kernel. The end result was a
>     600M kernel-devsrc package.
> 
>     This restructuring of the package uses an approach similar to other
>     distros, where the kernel-devsrc package is for building against the
>     running kernel and uses a curated set of copied infrastructure, versus
>     a mass copy of the entire kernel.
> 
>     The differences in this approach versus other is largely due to the
>     architecture support and the split build/source directory of the
>     kernel.
> 
>     The result is a kernel-devsrc package of about 10M, which is capable
>     of running "make scripts" and compiling kernel modules against the
>     running kernel.
> 
>     Along with the changes to the copying of the infrascture, we also
>     have the following changes:
> 
>       - a better/more explicit listing of dependencies for on-target
>         builds of "make scripts" or "make modules_prepare"
> 
>       - The kernel source is installed into /lib/modules/<version>/build
>         and a symlink created from /usr/src/kernel to the new location.
>         This aligns with the standard location for module support
>         code
> 
>       - There is also a symlink from /lib/modules/<version>/source -> build
>         to reserve a spot for a new package that is simply the kernel
>         source. That package is not part of this update.
> 
>     [YOCTO #12535]
> 
>     Signed-off-by: Bruce Ashfield <bruce.ashfield at windriver.com
>     <mailto:bruce.ashfield at windriver.com>>
>     ---
>       meta/recipes-kernel/linux/kernel-devsrc.bb
>     <http://kernel-devsrc.bb> | 178 ++++++++++++++++++++++-------
>       1 file changed, 138 insertions(+), 40 deletions(-)
> 
>     diff --git a/meta/recipes-kernel/linux/kernel-devsrc.bb
>     <http://kernel-devsrc.bb>
>     b/meta/recipes-kernel/linux/kernel-devsrc.bb <http://kernel-devsrc.bb>
>     index c1b5b7786d7c..f55b115e0936 100644
>     --- a/meta/recipes-kernel/linux/kernel-devsrc.bb
>     <http://kernel-devsrc.bb>
>     +++ b/meta/recipes-kernel/linux/kernel-devsrc.bb
>     <http://kernel-devsrc.bb>
>     @@ -30,50 +30,148 @@ do_populate_sysroot[noexec] = "1"
>       S = "${STAGING_KERNEL_DIR}"
>       B = "${STAGING_KERNEL_BUILDDIR}"
> 
>     -KERNEL_VERSION = "${@get_kernelversion_headers('${S}')}"
>     -
>       PACKAGE_ARCH = "${MACHINE_ARCH}"
> 
>     +KERNEL_BUILD_ROOT="/lib/modules/"
>     +
>       do_install() {
>     -        kerneldir=${D}${KERNEL_SRC_PATH}
>     -        install -d $kerneldir
>     -
>     -        #
>     -        # Copy the staging dir source (and module build support)
>     into the devsrc structure.
>     -        # We can keep this copy simple and take everything, since a
>     we'll clean up any build
>     -        # artifacts afterwards, and the extra i/o is not significant
>     -        #
>     -        cd ${B}
>     -        find . -type d -name '.git*' -prune -o -path '.debug'
>     -prune -o -type f -print0 | cpio --null -pdlu $kerneldir
>     -        cd ${S}
>     -       find . -type d -name '.git*' -prune -o -type d -name
>     '.kernel-meta' -prune -o -type f -print0 | cpio --null -pdlu $kerneldir
>     -
>     -        # Explicitly set KBUILD_OUTPUT to ensure that the image
>     directory is cleaned and not
>     -        # The main build artifacts. We clean the directory to avoid
>     QA errors on mismatched
>     -        # architecture (since scripts and helpers are native format).
>     -        KBUILD_OUTPUT="$kerneldir"
>     -        oe_runmake -C $kerneldir CC="${KERNEL_CC}"
>     LD="${KERNEL_LD}" clean _mrproper_scripts
>     -        # make clean generates an absolute path symlink called "source"
>     -        # in $kerneldir points to $kerneldir, which doesn't make any
>     -        # sense, so remove it.
>     -        if [ -L $kerneldir/source ]; then
>     -            bbnote "Removing $kerneldir/source symlink"
>     -            rm -f $kerneldir/source
>     -        fi
>     -
>     -        # 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
>     -                mkdir -p $kerneldir/arch/powerpc/lib/
>     -                cp ${B}/arch/powerpc/lib/crtsavres.o
>     $kerneldir/arch/powerpc/lib/crtsavres.o
>     -        fi
>     -
>     -        chown -R root:root ${D}
>     +    kerneldir=${D}${KERNEL_BUILD_ROOT}${KERNEL_VERSION}
>     +    install -d $kerneldir
>     +
>     +    # create the directory structure
>     +    rm -f $kerneldir/build
>     +    rm -f $kerneldir/source
>     +    mkdir -p $kerneldir/build
>     +
>     +    # for compatibility with some older variants of this package, we
>     +    # create  a /usr/src/kernel symlink to
>     /lib/modules/<version>/source
>     +    mkdir -p ${D}/usr/src
>     +    (
>     +       cd ${D}/usr/src
>     +       ln -s ${KERNEL_BUILD_ROOT}${KERNEL_VERSION}/source kernel
>     +    )
>     +
>     +    # for on target purposes, we unify build and source
>     +    (
>     +       cd $kerneldir
>     +       ln -s build source
>     +    )
>     +
>     +    # first copy everything
>     +    (
>     +       cd ${S}
>     +       cp --parents $(find  -type f -name "Makefile*" -o -name
>     "Kconfig*") $kerneldir/build
>     +    )
>     +
>     +    # then drop all but the needed Makefiles/Kconfig files
>     +    rm -rf $kerneldir/build/Documentation
>     +    rm -rf $kerneldir/build/scripts
>     +    rm -rf $kerneldir/build/include
>     +
>     +    # now copy in parts from the build that we'll need later
>     +    (
>     +       cd ${B}
>     +
>     +       cp Module.symvers $kerneldir/build
>     +       cp System.map* $kerneldir/build
>     +       if [ -s Module.markers ]; then
>     +           cp Module.markers $kerneldir/build
>     +       fi
>     +
>     +       cp .config $kerneldir/build
>     +
>     +       # TODO: this scripts copy will likely blow up QA, so for now, we
>     +       #       require a more complex 'make scripts' to restore
>     these, versus
>     +       #       copying them here. Left as a reference to indicate
>     that we
>     +       #       know the scripts must be dealt with.
>     +       # cp -a scripts $kerneldir/build
>     +
>     +       if [ -f tools/objtool/objtool ]; then
>     +           cp -a tools/objtool/objtool $kerneldir/build/tools/objtool/
>     +       fi
>     +       if [ -d arch/${ARCH}/scripts ]; then
>     +           cp -a arch/${ARCH}/scripts $kerneldir/build/arch/${ARCH}
>     +       fi
>     +       if [ -f arch/${ARCH}/*lds ]; then
>     +           cp -a arch/${ARCH}/*lds $kerneldir/build/arch/${ARCH}
>     +       fi
>     +
>     +       rm -f $kerneldir/build/scripts/*.o
>     +       rm -f $kerneldir/build/scripts/*/*.o
>     +
>     +       if [ "${ARCH}" = "powerpc" ]; then
>     +           cp -a --parents arch/powerpc/lib/crtsavres.[So]
>     $kerneldir/build/
>     +       fi
>     +
>     +       cp -a include $kerneldir/build/include
>     +    )
>     +
>     +    # now grab the chunks from the source tree that we need
>     +    (
>     +       cd ${S}
>     +
>     +       cp -a scripts $kerneldir/build
>     +       if [ "${ARCH}" = "arm64" ]; then
>     +           # arch/arm64/include/asm/xen references arch/arm
>     +           cp -a --parents arch/arm/include/asm/xen $kerneldir/build/
>     +           # arch/arm64/include/asm/opcodes.h references arch/arm
>     +           cp -a --parents arch/arm/include/asm/opcodes.h
>     $kerneldir/build/
>     +       fi
>     +
>     +       # include the machine specific headers for ARM variants, if
>     available.
>     +       if [ "${ARCH}" = "arm" ]; then
>     +           cp -a --parents arch/${ARCH}/mach-*/include
>     $kerneldir/build/
>     +
>     +           # include a few files for 'make prepare'
>     +           cp -a --parents arch/arm/tools/gen-mach-types
>     $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/
>     +           cp -a --parents arch/arm/tools/mach-types
>     $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/
>     +       fi
>     +
>     +       if [ -d arch/${ARCH}/include ]; then
>     +           cp -a --parents arch/${ARCH}/include $kerneldir/build/
>     +       fi
>     +
>     +       cp -a include $kerneldir/build
>     +
>     +       if [ "${ARCH}" = "x86" ]; then
>     +           # files for 'make prepare' to succeed with kernel-devel
>     +           cp -a --parents arch/x86/entry/syscalls/syscall_32.tbl
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/entry/syscalls/syscalltbl.sh
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/entry/syscalls/syscallhdr.sh
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/entry/syscalls/syscall_64.tbl
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/tools/relocs_32.c $kerneldir/build/
>     +           cp -a --parents arch/x86/tools/relocs_64.c $kerneldir/build/
>     +           cp -a --parents arch/x86/tools/relocs.c $kerneldir/build/
>     +           cp -a --parents arch/x86/tools/relocs_common.c
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/tools/relocs.h $kerneldir/build/
>     +           cp -a --parents tools/include/tools/le_byteshift.h
>     $kerneldir/build/
>     +           cp -a --parents tools/include/tools/be_byteshift.h
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/purgatory/purgatory.c
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/purgatory/sha256.h
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/purgatory/sha256.c
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/purgatory/stack.S $kerneldir/build/
>     +           cp -a --parents arch/x86/purgatory/string.c
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/purgatory/setup-x86_64.S
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/purgatory/entry64.S
>     $kerneldir/build/
>     +           cp -a --parents arch/x86/boot/string.h $kerneldir/build/
>     +           cp -a --parents arch/x86/boot/string.c $kerneldir/build/
>     +           cp -a --parents arch/x86/boot/ctype.h $kerneldir/build/
>     +       fi
>     +    )
>     +
>     +    # Make sure the Makefile and version.h have a matching
>     timestamp so that
>     +    # external modules can be built
>     +    touch -r $kerneldir/build/Makefile
>     $kerneldir/build/include/generated/uapi/linux/version.h
>     +
>     +    # Copy .config to include/config/auto.conf so "make prepare" is
>     unnecessary.
>     +    cp $kerneldir/build/.config
>     $kerneldir/build/include/config/auto.conf
>     +
>     +    chown -R root:root ${D}
>       }
>     +
>       # Ensure we don't race against "make scripts" during cpio
>       do_install[lockfiles] = "${TMPDIR}/kernel-scripts.lock"
> 
>     -PACKAGES = "kernel-devsrc"
>     -FILES_${PN} = "${KERNEL_SRC_PATH}"
>     -RDEPENDS_${PN} = "bc"
>     +FILES_${PN} = "${KERNEL_BUILD_ROOT} ${KERNEL_SRC_PATH}"
>     +FILES_${PN}-dbg += "${KERNEL_BUILD_ROOT}*/build/scripts/*/.debug/*"
>     +RDEPENDS_${PN} = "bc glibc-utils"
>     --
>     2.5.0
> 
> 




More information about the Openembedded-core mailing list