################################################################################ # 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)") @if ! grep -Fqx 'CONFIG_MODULES=y' $(LINUX_DIR)/.config; then \ echo "ERROR: Kernel does not support loadable modules"; \ exit 1; \ fi $$(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)))