Hello Bruce, Thanks for the feedback, I agree that this is more suitable for developers that want to integrate a quick driver or a driver that has no Makefile, but I think adding the class for now and then improvements or other ideas can come.
I will remove the example as I included some examples in the class comment itself. Kind Regards Talel On Sat, Oct 28, 2023 at 1:35 PM Bruce Ashfield <[email protected]> wrote: > On Fri, Oct 27, 2023 at 8:07 PM BELHADJ SALEM Talel <[email protected]> > wrote: > > > > The module class provides what is needed to compile a Linux Kernel module > > but since the Makefile is always the same for simple modules that have > > their sources in one directory level, I thought of creating new class > wrapper > > to automatically prepare the Makefile. > > Also, using variable flag feature, a recipe can provide multiple modules > > and can be handled the same way as PACKAGECONFIG is used to > enabled/disable > > features. > > I find this method of preparing a kernel module much harder to follow > (and debug). > > So Richard is ok with the class, I have no objections, it may serve a > class of > developers, but it isn't something I'd support as a first option. > > But please, create a separate example for it, not modifying hello-world, > we want > that simple and explicit example to persist. > > Bruce > > > > > Signed-off-by: Talel BELHAJSALEM <[email protected]> > > --- > > .../recipes-kernel/hello-mod/hello-mod_0.1.bb | 11 +- > > meta/classes-recipe/simple-module.bbclass | 116 ++++++++++++++++++ > > 2 files changed, 120 insertions(+), 7 deletions(-) > > create mode 100644 meta/classes-recipe/simple-module.bbclass > > > > diff --git a/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb > b/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb > > index a2fb212a68..f191b08be5 100644 > > --- a/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb > > +++ b/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb > > @@ -3,16 +3,13 @@ DESCRIPTION = "${SUMMARY}" > > LICENSE = "GPL-2.0-only" > > LIC_FILES_CHKSUM = "file://COPYING;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e" > > > > -inherit module > > +inherit simple-module > > > > -SRC_URI = "file://Makefile \ > > - file://hello.c \ > > +SRC_URI = "file://hello.c \ > > file://COPYING \ > > " > > > > S = "${WORKDIR}" > > > > -# The inherit of module.bbclass will automatically name module packages > with > > -# "kernel-module-" prefix as required by the oe-core build environment. > > - > > -RPROVIDES:${PN} += "kernel-module-hello" > > +MODULE_SRC = "hello" > > +MODULE_SRC[hello] = "" > > \ No newline at end of file > > diff --git a/meta/classes-recipe/simple-module.bbclass > b/meta/classes-recipe/simple-module.bbclass > > new file mode 100644 > > index 0000000000..a837dec848 > > --- /dev/null > > +++ b/meta/classes-recipe/simple-module.bbclass > > @@ -0,0 +1,116 @@ > > +# > > +# Copyright OpenEmbedded Contributors > > +# > > +# SPDX-License-Identifier: MIT > > +# > > + > > +# Class to generate Makefile for Linux Kernel modules > > +# > > +# The aim of this class is to provide a way to gain time > > +# when creating recipes for Linux Kernel modules > > +# > > +# Required variable: > > +# MODULE_SRC > > +# > > +# This variable itself counts on flags to know what files > > +# to use for .ko generation and their .o dependencies > > +# > > +# Usage: > > +# If you have the following module structure: > > +# |-- module.c > > +# |-- dep1.c > > +# `-- dep2.c > > +# then you set: > > +# MODULE_SRC[module] = "dep1 dep2" > > +# > > +# This will generate: > > +# obj-m += module.o > > +# module-objs += dep1.o dep2.o > > +# > > +# This class supports multiple modules as well > > +# each module will be added to obj-m and if it has dependencies > > +# an -objs variable will be created. > > +# > > +# A module can be enabled or disabled by adding or removing > > +# the module name from MODULE_SRC > > +# > > +# Limitations: > > +# - All modules source files should exist in the same folder level > > + > > +inherit module > > + > > +python do_prepare_makefile() { > > + > > + if not (d.getVar('MODULE_SRC') or "").split(): > > + bb.warn("You inherited easy-module but did not set drivers in > MODULE_SRC") > > + > > + kernel_modules = (d.getVar('MODULE_SRC') or "").split() > > + > > + if kernel_modules: > > + kernel_modules_flags = d.getVarFlags('MODULE_SRC') or [] > > + > > + objs_data = {} > > + for k_module in kernel_modules: > > + > > + # Check if all enabled drivers have corresponding flag > > + if not k_module in kernel_modules_flags: > > + bb.fatal(f"Driver {k_module} is enabled but does not > have a flag entry") > > + > > + k_module_file = f"{k_module}.c" > > + if not os.path.isfile(k_module_file): > > + bb.fatal(f"Source file {k_module_file} is not found") > > + > > + k_module_o = f"{k_module}.o" > > + objs_data[k_module] = [] > > + > > + k_module_deps = (d.getVarFlag('MODULE_SRC', k_module) or > "").split() > > + for dep in k_module_deps: > > + dep_file = f"{dep}.c" > > + dep_o = f"{dep}.o" > > + > > + if not os.path.isfile(dep_file): > > + bb.fatal(f"Dependency file {dep_file} for the > {k_module_file} is not found") > > + > > + objs_data[k_module].append(dep_o) > > + > > + with open('Makefile', 'w') as mf: > > + # Main modules > > + mf.write( > > + f""" > > +# This Makefile is generated automatically by easy-module class > > +obj-m += {' '.join([objm + '.o' for objm in objs_data.keys()])} > > +""") > > + > > + # Modules dependencies > > + for k_module, deps in objs_data.items(): > > + if deps: > > + mf.write( > > + f""" > > +{k_module}-objs += {' '.join([dep for dep in deps])} > > +""") > > + > > + # Rest of Makefile > > + mf.write( > > + """ > > +SRC := $(shell pwd) > > + > > +all: > > +\t$(MAKE) -C $(KERNEL_SRC) M=$(SRC) > > + > > +modules_install: > > +\t$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install > > + > > +clean: > > +\trm -f *.o *~ core .depend .*.cmd *.ko *.mod.c > > +\trm -f Module.markers Module.symvers modules.order > > +\trm -rf .tmp_versions Modules.symvers > > +""") > > +} > > + > > +RPROVIDES:${PN} += "kernel-module-${PN}" > > + > > +export SRC = "${B}" > > + > > +do_prepare_makefile[docs] = "Automate Makefile preparation for simple > Kernel modules" > > +do_prepare_makefile[dirs] = "${B}" > > +addtask do_prepare_makefile before do_configure after do_patch > > \ No newline at end of file > > -- > > 2.25.1 > > > > > > > > > > > -- > - Thou shalt not follow the NULL pointer, for chaos and madness await > thee at its end > - "Use the force Harry" - Gandalf, Star Trek II >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#189764): https://lists.openembedded.org/g/openembedded-core/message/189764 Mute This Topic: https://lists.openembedded.org/mt/102233042/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
