Many applications check for available kernel features via:
* /proc/modules (loaded modules, present if CONFIG_MODULES=y)
* $(MODLIB)/modules.builtin (builtin modules)
They fail to detect features if the kernel was built with
CONFIG_MODULES=n
and modules.builtin isn't installed.
Therefore, allow the Makefile's modules_install target to be used
always.
Tested Makefile targets with different CONFIG_MODULES states:
* (CONFIG_MODULES=n) modules_install: install modules.builtin etc.
* (CONFIG_MODULES=y) modules_install: produce same result as before
* (CONFIG_MODULES=y) modules_install: still fail if no modules.order
* (CONFIG_MODULES=y) modules: build modules, as before
* (CONFIG_MODULES=n) modules: still fail and warn
Signed-off-by: Jonas Zeiger <jonas.zeiger@xxxxxxxxxxxx>
---
Makefile | 60
++++++++++++++++++++++++++++++++----------------------------
1 file changed, 32 insertions(+), 28 deletions(-)
diff -up linux/Makefile{.orig,}
--- linux/Makefile.orig 2020-05-28 04:27:34.341394622 +0200
+++ linux/Makefile 2020-05-28 05:18:00.540108227 +0200
@@ -1309,31 +1309,7 @@ dt_binding_check: scripts_dtc
#
---------------------------------------------------------------------------
# Modules
-ifdef CONFIG_MODULES
-
-# By default, build modules as well
-
-all: modules
-
-# Build modules
-#
-# A module can be listed more than once in obj-m resulting in
-# duplicate lines in modules.order files. Those are removed
-# using awk while concatenating to the final file.
-
-PHONY += modules
-modules: $(if $(KBUILD_BUILTIN),vmlinux) modules.order
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
- $(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh
-
-modules.order: descend
- $(Q)$(AWK) '!x[$$0]++' $(addsuffix /$@, $(build-dirs)) > $@
-
-# Target to prepare building external modules
-PHONY += modules_prepare
-modules_prepare: prepare
-
-# Target to install modules
+# Target to install modules and accompanying files
PHONY += modules_install
modules_install: _modinst_ _modinst_post
@@ -1347,10 +1323,14 @@ _modinst_:
rm -f $(MODLIB)/build ; \
ln -s $(CURDIR) $(MODLIB)/build ; \
fi
- @sed 's:^:kernel/:' modules.order > $(MODLIB)/modules.order
@cp -f modules.builtin $(MODLIB)/
@cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
+ifdef CONFIG_MODULES
+ @sed 's:^:kernel/:' modules.order > $(MODLIB)/modules.order
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
+else
+ @touch $(MODLIB)/modules.order
+endif
# This depmod is only for convenience to give the initial
# boot a modules.dep even before / is mounted read-write. However the
@@ -1359,6 +1339,30 @@ PHONY += _modinst_post
_modinst_post: _modinst_
$(call cmd,depmod)
+ifdef CONFIG_MODULES
+
+# By default, build modules as well
+
+all: modules
+
+# Build modules
+#
+# A module can be listed more than once in obj-m resulting in
+# duplicate lines in modules.order files. Those are removed
+# using awk while concatenating to the final file.
+
+PHONY += modules
+modules: $(if $(KBUILD_BUILTIN),vmlinux) modules.order
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+ $(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh
+
+modules.order: descend
+ $(Q)$(AWK) '!x[$$0]++' $(addsuffix /$@, $(build-dirs)) > $@
+
+# Target to prepare building external modules
+PHONY += modules_prepare
+modules_prepare: prepare
+
ifeq ($(CONFIG_MODULE_SIG), y)
PHONY += modules_sign
modules_sign:
@@ -1370,8 +1374,8 @@ else # CONFIG_MODULES
# Modules not configured
#
---------------------------------------------------------------------------
-PHONY += modules modules_install
-modules modules_install:
+PHONY += modules
+modules:
@echo >&2
@echo >&2 "The present kernel configuration has modules disabled."
@echo >&2 "Type 'make config' and enable loadable module support."