[OE-core] [PATCH v2 1/3] module.bbclass: use Module.symvers for dependants
Denys Dmytriyenko
denis at denix.org
Wed Nov 16 20:18:36 UTC 2016
On Thu, Aug 18, 2016 at 08:56:24AM +0100, André Draszik wrote:
> When compiling multiple external kernel modules, where one
> depends on the other, there are two problems at the
> moment:
> 1) we get compile time warnings from the kernel build
> system due to missing symbols (from modpost).
> 2) Any modules generated are missing dependency
> information (in the .modinfo elf section) for any
> dependencies outside the current source tree and
> outside the kernel itself.
>
> This is expected, but the kernel build system has a way to
> deal with this - the dependent module is expected to
> specify KBUILD_EXTRA_SYMBOLS (as a space-separated list)
> to point to any and all Module.symvers of kernel modules
> that are dependencies.
>
> While 1) by itself is not really a big issue, 2) prevents
> the packaging process from generating cross-source tree
> package dependencies.
>
> As a first step to solve the missing dependencies in
> packages created, we:
> 1) install Module.symvers of all external kernel module
> builds (into a location that is automatically packaged
> into the -dev package)
> 2) make use of KBUILD_EXTRA_SYMBOLS and pass the location
> of all Module.symvers of all kernel-module-* packages
> we depend on
>
> This solves both problems mentioned above.
>
> Signed-off-by: André Draszik <git at andred.net>
> ---
> meta/classes/module.bbclass | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/meta/classes/module.bbclass b/meta/classes/module.bbclass
> index 01c9309..68e3d34 100644
> --- a/meta/classes/module.bbclass
> +++ b/meta/classes/module.bbclass
> @@ -8,6 +8,15 @@ EXTRA_OEMAKE += "KERNEL_SRC=${STAGING_KERNEL_DIR}"
>
> MODULES_INSTALL_TARGET ?= "modules_install"
>
> +python __anonymous () {
> + depends = d.getVar('DEPENDS', True)
> + extra_symbols = []
> + for dep in depends.split():
> + if dep.startswith("kernel-module-"):
> + extra_symbols.append("${STAGING_INCDIR}/" + dep + "/Module.symvers")
> + d.setVar('KBUILD_EXTRA_SYMBOLS', " ".join(extra_symbols))
> +}
> +
> module_do_compile() {
> unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS
> oe_runmake KERNEL_PATH=${STAGING_KERNEL_DIR} \
> @@ -15,6 +24,7 @@ module_do_compile() {
> CC="${KERNEL_CC}" LD="${KERNEL_LD}" \
> AR="${KERNEL_AR}" \
> O=${STAGING_KERNEL_BUILDDIR} \
> + KBUILD_EXTRA_SYMBOLS="${KBUILD_EXTRA_SYMBOLS}" \
> ${MAKE_TARGETS}
> }
>
> @@ -24,6 +34,11 @@ module_do_install() {
> CC="${KERNEL_CC}" LD="${KERNEL_LD}" \
> O=${STAGING_KERNEL_BUILDDIR} \
> ${MODULES_INSTALL_TARGET}
> +
> + install -d -m0755 ${D}${includedir}/${BPN}
> + cp -a --no-preserve=ownership ${B}/Module.symvers ${D}${includedir}/${BPN}
Hmm, why is Module.symvers expected to be in the root of ${B}? This seems like
a very artificial assumption/requirement!
I have some out-of-tree modules with complicated hierarchies and it worked
fine so far until this change, because there were only 2 well defined
interfaces - make ${MAKE_TARGETS} and make ${MODULES_INSTALL_TARGET} - and
both of them know where the resulting module .ko resides deep inside ${B}
hierarchy.
I wonder if this should have been rolled into ${MODULES_INSTALL_TARGET}
step...
--
Denys
> + # it doesn't actually seem to matter which path is specified here
> + sed -e 's:${B}/::g' -i ${D}${includedir}/${BPN}/Module.symvers
> }
>
> EXPORT_FUNCTIONS do_compile do_install
> --
> 2.9.3
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
More information about the Openembedded-core
mailing list