From: Bruce Ashfield <bruce.ashfield@windriver.com>
To: Richard Purdie <richard.purdie@linuxfoundation.org>,
openembedded-core <openembedded-core@lists.openembedded.org>
Cc: "Hart, Darren" <darren.hart@intel.com>
Subject: Re: [PATCH] kernel/image/depmodwrapper: Fixups for depmod
Date: Tue, 20 Jan 2015 09:16:26 -0500 [thread overview]
Message-ID: <54BE633A.1000306@windriver.com> (raw)
In-Reply-To: <1421760783.1798.42.camel@linuxfoundation.org>
On 15-01-20 08:33 AM, Richard Purdie wrote:
> With the rpm package backend enabled, running:
>
> bitbake <image>
> bitbake virtual/kernel -c clean
> bitbake <image> -c rootfs -f
>
> results in an image with incorrect kernel module dependency information.
> The problem is that the System.map and kernel-abiversion files are needed
> for depmod and after the recent kernel changes, these are no longer in
> sstate.
>
> Its reasonable to require the kernel to unpack/build if you're
> about to build a module against it. It is not reasonable to require this
> just to build a rootfs.
>
> Therefore stash the needed files specifically for depmod.
>
> Also fix some STAGING_KERNEL_DIR references which were incorrect, found
> whilst sorting through his change.
Now that I see the fix, the tweaks are clear (and obvious). I would have
preferred a straight up module loading error in all cases .. since that
would have showed in my workflows. The rootfs.py changes in particular
would have taken me much longer to get right.
>
> This patch also makes the depmod files being missing a fatal error rather than
> something the system just ignores silently.
Nice improvement.
Acked-by: Bruce Ashfield <bruce.ashfield@windriver.com>
>
> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
>
> diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
> index 07e7f99..22b6970 100644
> --- a/meta/classes/image.bbclass
> +++ b/meta/classes/image.bbclass
> @@ -95,7 +95,7 @@ def rootfs_variables(d):
> 'SDK_OUTPUT','SDKPATHNATIVE','SDKTARGETSYSROOT','SDK_DIR','SDK_VENDOR','SDKIMAGE_INSTALL_COMPLEMENTARY','SDK_PACKAGE_ARCHS','SDK_OUTPUT','SDKTARGETSYSROOT','MULTILIBRE_ALLOW_REP',
> 'MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS',
> 'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','BUILDNAME','USE_DEVFS',
> - 'STAGING_KERNEL_DIR','COMPRESSIONTYPES']
> + 'COMPRESSIONTYPES']
> variables.extend(command_variables(d))
> variables.extend(variable_depends(d))
> return " ".join(variables)
> diff --git a/meta/classes/kernel-module-split.bbclass b/meta/classes/kernel-module-split.bbclass
> index 2d43b51..32b8085 100644
> --- a/meta/classes/kernel-module-split.bbclass
> +++ b/meta/classes/kernel-module-split.bbclass
> @@ -75,7 +75,7 @@ python split_kernel_module_packages () {
> if not os.path.exists(system_map_file):
> system_map_file = "%s/System.map-%s" % (staging_kernel_dir, kernelver)
> if not os.path.exists(system_map_file):
> - bb.fatal("System.map-%s does not exist in '%s/boot' nor STAGING_KERNEL_DIR '%s'" % (kernelver, dvar, staging_kernel_dir))
> + bb.fatal("System.map-%s does not exist in '%s/boot' nor STAGING_KERNEL_BUILDDIR '%s'" % (kernelver, dvar, staging_kernel_dir))
>
> cmd = "depmod -n -a -b %s -F %s %s" % (dvar, system_map_file, kernelver_stripped)
> f = os.popen(cmd, 'r')
> diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
> index 805f799..2a16c71 100644
> --- a/meta/classes/kernel.bbclass
> +++ b/meta/classes/kernel.bbclass
> @@ -231,6 +231,11 @@ kernel_do_install() {
> [ -e Module.symvers ] && install -m 0644 Module.symvers ${D}/boot/Module.symvers-${KERNEL_VERSION}
> install -d ${D}${sysconfdir}/modules-load.d
> install -d ${D}${sysconfdir}/modprobe.d
> +
> + # Stash data for depmod
> + install -d ${D}${datadir}/kernel-depmod/
> + echo "${KERNEL_VERSION}" > ${D}${datadir}/kernel-depmod/kernel-abiversion
> + cp System.map ${D}${datadir}/kernel-depmod/System.map-${KERNEL_VERSION}
> }
> do_install[prefuncs] += "package_get_auto_pr"
>
> @@ -280,14 +285,21 @@ do_shared_workdir () {
> fi
> }
>
> -# We have an empty sysroot_stage_all to keep the default routine from
> -# package.bbclass from expanding the kernel source into the sysroot and
> -# colliding with linux-firmware files
> +# Only stage the files we need for depmod, not the modules/firmware
> sysroot_stage_all () {
> + sysroot_stage_dir ${D}${datadir}/kernel-depmod ${SYSROOT_DESTDIR}${datadir}/kernel-depmod
> }
>
> KERNEL_CONFIG_COMMAND ?= "oe_runmake_call -C ${S} O=${B} oldnoconfig || yes '' | oe_runmake -C ${S} O=${B} oldconfig"
>
> +PACKAGE_PREPROCESS_FUNCS += "kernel_package_preprocess"
> +
> +kernel_package_preprocess () {
> + rm -rf ${PKGD}${datadir}/kernel-depmod
> + rmdir ${PKGD}${datadir}
> + rmdir ${PKGD}${exec_prefix}
> +}
> +
> kernel_do_configure() {
> # fixes extra + in /lib/modules/2.6.37+
> # $ scripts/setlocalversion . => +
> diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
> index f2891a7..72d32f7 100644
> --- a/meta/lib/oe/rootfs.py
> +++ b/meta/lib/oe/rootfs.py
> @@ -209,16 +209,17 @@ class Rootfs(object):
> 'new', '-v'])
>
> def _generate_kernel_module_deps(self):
> - kernel_abi_ver_file = os.path.join(self.d.getVar('STAGING_KERNEL_BUILDDIR', True),
> + kernel_abi_ver_file = oe.path.join(self.d.getVar('STAGING_DIR_TARGET', True), self.d.getVar('datadir', True), "kernel-depmod",
> 'kernel-abiversion')
> - if os.path.exists(kernel_abi_ver_file):
> - kernel_ver = open(kernel_abi_ver_file).read().strip(' \n')
> - modules_dir = os.path.join(self.image_rootfs, 'lib', 'modules', kernel_ver)
> + if not os.path.exists(kernel_abi_ver_file):
> + bb.fatal("No kernel-abiversion file found (%s), cannot run depmod, aborting" % kernel_abi_ver_file)
>
> - bb.utils.mkdirhier(modules_dir)
> + kernel_ver = open(kernel_abi_ver_file).read().strip(' \n')
> + modules_dir = os.path.join(self.image_rootfs, 'lib', 'modules', kernel_ver)
>
> - self._exec_shell_cmd(['depmodwrapper', '-a', '-b', self.image_rootfs,
> - kernel_ver])
> + bb.utils.mkdirhier(modules_dir)
> +
> + self._exec_shell_cmd(['depmodwrapper', '-a', '-b', self.image_rootfs, kernel_ver])
>
> """
> Create devfs:
> diff --git a/meta/recipes-kernel/kmod/depmodwrapper-cross_1.0.bb b/meta/recipes-kernel/kmod/depmodwrapper-cross_1.0.bb
> index 7533809..83a382a 100644
> --- a/meta/recipes-kernel/kmod/depmodwrapper-cross_1.0.bb
> +++ b/meta/recipes-kernel/kmod/depmodwrapper-cross_1.0.bb
> @@ -19,21 +19,21 @@ if [ "\$1" != "-a" -o "\$2" != "-b" ]; then
> echo "Usage: depmodwrapper -a -b rootfs KERNEL_VERSION" >&2
> exit 1
> fi
> -if [ ! -r ${STAGING_KERNEL_BUILDDIR}/kernel-abiversion ]; then
> - echo "Unable to read: ${STAGING_KERNEL_BUILDDIR}/kernel-abiversion" >&2
> +if [ ! -r ${STAGING_DIR_TARGET}${datadir}/kernel-depmod/kernel-abiversion ]; then
> + echo "Unable to read: ${STAGING_DIR_TARGET}${datadir}/kernel-depmod/kernel-abiversion" >&2
> else
> - kernelabi=\$(cat ${STAGING_KERNEL_BUILDDIR}/kernel-abiversion)
> + kernelabi=\$(cat ${STAGING_DIR_TARGET}${datadir}/kernel-depmod/kernel-abiversion)
> if [ "\$kernelabi" != "\$4" ]; then
> echo "Error: Kernel version \$4 does not match kernel-abiversion (\$kernelabi)" >&2
> exit 1
> fi
> fi
>
> -if [ ! -r ${STAGING_KERNEL_BUILDDIR}/System.map-\$4 ]; then
> - echo "Unable to read: ${STAGING_KERNEL_BUILDDIR}/System.map-\$4" >&2
> +if [ ! -r ${STAGING_DIR_TARHET}${datadir}/kernel-depmod/System.map-\$4 ]; then
> + echo "Unable to read: ${STAGING_DIR_TARGET}${datadir}/kernel-depmod/System.map-\$4" >&2
> exec env depmod "\$1" "\$2" "\$3" "\$4"
> else
> - exec env depmod "\$1" "\$2" "\$3" -F "${STAGING_KERNEL_BUILDDIR}/System.map-\$4" "\$4"
> + exec env depmod "\$1" "\$2" "\$3" -F "${STAGING_DIR_TARGET}${datadir}/kernel-depmod/System.map-\$4" "\$4"
> fi
> EOF
> chmod +x ${D}${bindir_crossscripts}/depmodwrapper
> diff --git a/meta/recipes-kernel/systemtap/systemtap-uprobes_git.bb b/meta/recipes-kernel/systemtap/systemtap-uprobes_git.bb
> index 4d2bec4..758908b 100644
> --- a/meta/recipes-kernel/systemtap/systemtap-uprobes_git.bb
> +++ b/meta/recipes-kernel/systemtap/systemtap-uprobes_git.bb
> @@ -21,7 +21,7 @@ EXTRA_OEMAKE = ""
> # support. Note that staprun expects it in the systemtap/runtime directory,
> # not in /lib/modules.
> do_compile() {
> - if grep -q "CONFIG_UTRACE=y" ${STAGING_KERNEL_DIR}/.config
> + if grep -q "CONFIG_UTRACE=y" ${STAGING_KERNEL_BUILDDIR}/.config
> then
> unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS CC LD CPP
> oe_runmake CC="${KERNEL_CC}" LD="${KERNEL_LD}" \
>
>
next prev parent reply other threads:[~2015-01-20 14:16 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-20 13:33 [PATCH] kernel/image/depmodwrapper: Fixups for depmod Richard Purdie
2015-01-20 14:16 ` Bruce Ashfield [this message]
2015-01-20 16:04 ` Hart, Darren
2015-01-20 20:22 ` Dan McGregor
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54BE633A.1000306@windriver.com \
--to=bruce.ashfield@windriver.com \
--cc=darren.hart@intel.com \
--cc=openembedded-core@lists.openembedded.org \
--cc=richard.purdie@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.