--- /dev/null
+################################################################################
+# kernel module infrastructure for building Linux kernel modules
+#
+# This file implements an infrastructure that eases development of package
+# .mk files for out-of-tree Linux kernel modules. It should be used for all
+# packages that build a Linux kernel module using the kernel's out-of-tree
+# buildsystem, unless they use a complex custom buildsystem.
+#
+# The kernel-module infrastructure requires the packages that use it to also
+# use another package infrastructure. kernel-module only defines post-build
+# and post-install hooks. This allows the package to build both kernel
+# modules and/or user-space components (with any of the other *-package
+# infra).
+#
+# As such, it is to be used in conjunction with another *-package infra,
+# like so:
+#
+# $(eval $(kernel-module))
+# $(eval $(generic-package))
+#
+# Note: if the caller needs access to the kernel modules (either after they
+# are built or after they are installed), it will have to define its own
+# post-build/install hooks *after* calling kernel-module, but *before*
+# calling the other *-package infra, like so:
+#
+# $(eval $(kernel-module))
+# define FOO_MOD_TWEAK
+# # do something
+# endef
+# FOO_POST_BUILD_HOOKS += FOO_MOD_TWEAK
+# $(eval $(generic-package))
+#
+# Note: this infra does not check that the kernel is enabled; it is expected
+# to be enforced at the Kconfig level with proper 'depends on'.
+################################################################################
+
+################################################################################
+# inner-kernel-module -- generates the make targets needed to support building
+# a kernel module
+#
+# argument 1 is the lowercase package name
+# argument 2 is the uppercase package name
+################################################################################
+
+define inner-kernel-module
+
+# The kernel must be built first.
+$(2)_DEPENDENCIES += linux
+
+# This is only defined in some infrastructures (e.g. autotools, cmake),
+# but not in others (e.g. generic). So define it here as well.
+$(2)_MAKE ?= $$(MAKE)
+
+# If not specified, consider the source of the kernel module to be at
+# the root of the package.
+$(2)_MODULE_SUBDIRS ?= .
+
+# Build the kernel module(s)
+# Force PWD for those packages that want to use it to find their
+# includes and other support files (Booo!)
+define $(2)_KERNEL_MODULES_BUILD
+ @$$(call MESSAGE,"Building kernel module(s)")
+ $$(foreach d,$$($(2)_MODULE_SUBDIRS), \
+ $$(LINUX_MAKE_ENV) $$($$(PKG)_MAKE) \
+ -C $$(LINUX_DIR) \
+ $$(LINUX_MAKE_FLAGS) \
+ $$($(2)_MODULE_MAKE_OPTS) \
+ PWD=$$(@D)/$$(d) \
+ M=$$(@D)/$$(d) \
+ modules$$(sep))
+endef
+$(2)_POST_BUILD_HOOKS += $(2)_KERNEL_MODULES_BUILD
+
+# Install the kernel module(s)
+# Force PWD for those packages that want to use it to find their
+# includes and other support files (Booo!)
+define $(2)_KERNEL_MODULES_INSTALL
+ @$$(call MESSAGE,"Installing kernel module(s)")
+ $$(foreach d,$$($(2)_MODULE_SUBDIRS), \
+ $$(LINUX_MAKE_ENV) $$($$(PKG)_MAKE) \
+ -C $$(LINUX_DIR) \
+ $$(LINUX_MAKE_FLAGS) \
+ $$($(2)_MODULE_MAKE_OPTS) \
+ PWD=$$(@D)/$$(d) \
+ M=$$(@D)/$$(d) \
+ modules_install$$(sep))
+endef
+$(2)_POST_INSTALL_TARGET_HOOKS += $(2)_KERNEL_MODULES_INSTALL
+
+endef
+
+################################################################################
+# kernel-module -- the target generator macro for kernel module packages
+################################################################################
+
+kernel-module = $(call inner-kernel-module,$(pkgname),$(call UPPERCASE,$(pkgname)))