kbuild: generate modules.builtin
PATCH 1/1 kbuild: generate modules.builtin
To make it easier for tools like mkinitrd to detect whether a needed module is missing or whether it is compiled into the kernel, install a modules.builtin file listing all modules built into the kernel. This is done by generating an alternate config file with all tristate =y options set to =Y and reading the makefiles with this config included. The built in modules then appear in obj-Y.
Known issues (found when comparing results with allyesconfig and allmodconfig):
* ALSA makefiles do some substitutions on the CONFIG_* variables sometimes, which breaks the logic if the alsa modules are built-in. Patch sent to alsa-devel.
* samples/kobject/*.o could be compiled built-in, but doesn't show up in modules.builtin (and not even in vmlinux.o). Patch sent to Greg to make it module-only.
* net/{8021q/vlan_core,ethernet/pe2,ipv6/inet6_hashtables}.o are always built-in, even though the corresponding config option is tristate:
obj-$(subst m,y,$(CONFIG_IPX)) += pe2.o
The result is that modules.builtin can contain three built-in "modules" that can't possibly exist as modules. No fix for this so far, as it is not a big issue IMO.
--- .gitignore | 1 + Makefile | 12 ++++++++-- scripts/Kbuild.include | 6 +++++ scripts/Makefile.lib | 5 +++- scripts/Makefile.modbuiltin | 48 +++++++++++++++++++++++++++++++++++++++++++ scripts/kconfig/confdata.c | 48 ++++++++++++++++++++++++++++++++++++------ 6 files changed, 109 insertions(+), 11 deletions(-) create mode 100644 scripts/Makefile.modbuiltin
.gitignore +1 -0
@@ -22,6 +22,7 @@ *.lst *.symtypes *.order +modules.builtin *.elf *.bin *.gz
Makefile +9 -3
@@ -878,6 +878,9 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; PHONY += $(vmlinux-dirs) $(vmlinux-dirs): prepare scripts $(Q)$(MAKE) $(build)=$@ +ifdef CONFIG_MODULES + $(Q)$(MAKE) $(modbuiltin)=$@ +endif # Build the kernel release string #
@@ -1133,6 +1136,7 @@ all: modules PHONY += modules modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order + $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin @$(kecho) ' Building modules, stage 2.'; $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
@@ -1161,7 +1165,7 @@ _modinst_: rm -f $(MODLIB)/build ; \ ln -s $(objtree) $(MODLIB)/build ; \ fi - @cp -f $(objtree)/modules.order $(MODLIB)/ + @cp -f $(objtree)/modules.{order,builtin} $(MODLIB)/ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst # This depmod is only for convenience to give the initial
@@ -1224,7 +1228,8 @@ clean: archclean $(clean-dirs) \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ -o -name '*.symtypes' -o -name 'modules.order' \ - -o -name 'Module.markers' -o -name '.tmp_*.o.*' \) \ + -o -name 'modules.builtin' -o -name 'Module.markers' \ + -o -name '.tmp_*.o.*' \) \ -type f -print | xargs rm -f # mrproper - Delete all generated files, including .config
@@ -1423,7 +1428,8 @@ $(clean-dirs): clean: rm-dirs := $(MODVERDIR) clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \ $(KBUILD_EXTMOD)/Module.markers \ - $(KBUILD_EXTMOD)/modules.order + $(KBUILD_EXTMOD)/modules.order \ + $(KBUILD_EXTMOD)/modules.builtin clean: $(clean-dirs) $(call cmd,rmdirs) $(call cmd,rmfiles)
scripts/Kbuild.include +6 -0
@@ -143,6 +143,12 @@ ld-option = $(call try-run,\ # $(Q)$(MAKE) $(build)=dir build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= +# Usage: +# $(Q)$(MAKE) $(modbuiltin)=dir +modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj + # Prefix -I with $(srctree) if it is not an absolute path. # skip if -I has no parameter addtree = $(if $(patsubst -I%,%,$(1)), \
scripts/Makefile.lib +4 -1
@@ -37,6 +37,8 @@ modorder := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m:.o=.ko __subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) subdir-y += $(__subdir-y) +__subdir-Y := $(patsubst %/,%,$(filter %/, $(obj-Y))) +subdir-Y += $(__subdir-Y) __subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) subdir-m += $(__subdir-m) obj-y := $(patsubst %/, %/built-in.o, $(obj-y))
@@ -44,7 +46,7 @@ obj-m := $(filter-out %/, $(obj-m)) # Subdirectories we need to descend into -subdir-ym := $(sort $(subdir-y) $(subdir-m)) +subdir-ym := $(sort $(subdir-y) $(subdir-Y) $(subdir-m)) # if $(foo-objs) exists, foo.o is a composite object multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))
@@ -76,6 +78,7 @@ always := $(addprefix $(obj)/,$(always)) targets := $(addprefix $(obj)/,$(targets)) modorder := $(addprefix $(obj)/,$(modorder)) obj-y := $(addprefix $(obj)/,$(obj-y)) +obj-Y := $(addprefix $(obj)/,$(obj-Y)) obj-m := $(addprefix $(obj)/,$(obj-m)) lib-y := $(addprefix $(obj)/,$(lib-y)) subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y))
scripts/Makefile.modbuiltin new file +48 -0
48 lines not on this page · raw message
scripts/kconfig/confdata.c +41 -7
126 lines not on this page · raw message
Signature · 1 line
1.6.3
Quoted 6 lines · Michal Marek
To make it easier for tools like mkinitrd to detect whether a needed module is missing or whether it is compiled into the kernel, install a modules.builtin file listing all modules built into the kernel. This is done by generating an alternate config file with all tristate =y options set to =Y and reading the makefiles with this config included. The built in modules then appear in obj-Y.
That looks very useful.
We like to have that for modprobe not to throw an error if a "module" is already in the kernel, because it is compiled in. Only modules with parameters show up in /sys/modules/ and they are already handled fine.
Thanks,
Kay
Quoted 8 lines · Kay Sievers
Quoted 6 lines · Michal Marek
To make it easier for tools like mkinitrd to detect whether a needed module is missing or whether it is compiled into the kernel, install a modules.builtin file listing all modules built into the kernel. This is done by generating an alternate config file with all tristate =y options set to =Y and reading the makefiles with this config included. The built in modules then appear in obj-Y.
Quoted 6 lines
That looks very useful.
We like to have that for modprobe not to throw an error if a "module" is already in the kernel, because it is compiled in. Only modules with parameters show up in
/sys/modules/and they are already handled fine.
Agree, this helps us support both distro kernels with some built-ins and modular kernels.
Scott
Signature · 2 lines
Scott James Remnant [email protected]
Quoted 8 lines · Michal Marek
Known issues (found when comparing results with allyesconfig and allmodconfig):
* ALSA makefiles do some substitutions on the CONFIG_* variables sometimes, which breaks the logic if the alsa modules are built-in. Patch sent to alsa-devel.
*samples/kobject/*.ocould be compiled built-in, but doesn't show up in modules.builtin (and not even in vmlinux.o). Patch sent to Greg to make it module-only.
These two are merged already.
Quoted 6 lines
*
net/{8021q/vlan_core,ethernet/pe2,ipv6/inet6_hashtables}.oare always built-in, even though the corresponding config option is tristate:
obj-$(subst m,y,$(CONFIG_IPX)) += pe2.o
The result is that modules.builtin can contain three built-in "modules" that can't possibly exist as modules. No fix for this so far, as it is not a big issue IMO.
I hope this one is not a problem.
I rebased the patch on top of current kbuild-next.git. What do you think about it? Do you agree on the modules.builtin file name and format? I'd like to add support for this to module-init-tools.
Subject: [PATCH] kbuild: generate modules.builtin
To make it easier for tools like mkinitrd to detect whether a needed module is missing or whether it is compiled into the kernel, install a modules.builtin file listing all modules built into the kernel. This is done by generating an alternate config file with all tristate =y options set to =Y and reading the makefiles with this config included. The built in modules then appear in obj-Y.
--- .gitignore | 1 + Makefile | 14 +++++++++--- scripts/Kbuild.include | 6 +++++ scripts/Makefile.lib | 5 +++- scripts/Makefile.modbuiltin | 48 +++++++++++++++++++++++++++++++++++++++++++ scripts/kconfig/confdata.c | 48 ++++++++++++++++++++++++++++++++++++------ 6 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 scripts/Makefile.modbuiltin
.gitignore +1 -0
@@ -22,6 +22,7 @@ *.lst *.symtypes *.order +modules.builtin *.elf *.bin *.gz
Makefile +10 -4
@@ -871,6 +871,9 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; PHONY += $(vmlinux-dirs) $(vmlinux-dirs): prepare scripts $(Q)$(MAKE) $(build)=$@ +ifdef CONFIG_MODULES + $(Q)$(MAKE) $(modbuiltin)=$@ +endif # Build the kernel release string #
@@ -1126,6 +1129,7 @@ all: modules PHONY += modules modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order + $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin @$(kecho) ' Building modules, stage 2.'; $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
@@ -1154,7 +1158,7 @@ _modinst_: rm -f $(MODLIB)/build ; \ ln -s $(objtree) $(MODLIB)/build ; \ fi - @cp -f $(objtree)/modules.order $(MODLIB)/ + @cp -f $(objtree)/modules.{order,builtin} $(MODLIB)/ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst # This depmod is only for convenience to give the initial
@@ -1217,8 +1221,9 @@ clean: archclean $(clean-dirs) \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ -o -name '*.symtypes' -o -name 'modules.order' \ - -o -name 'Module.markers' -o -name '.tmp_*.o.*' \ - -o -name '*.gcno' \) -type f -print | xargs rm -f + -o -name 'modules.builtin' -o -name 'Module.markers' \ + -o -name '.tmp_*.o.*' -o -name '*.gcno' \) \ + -type f -print | xargs rm -f # mrproper - Delete all generated files, including .config #
@@ -1416,7 +1421,8 @@ $(clean-dirs): clean: rm-dirs := $(MODVERDIR) clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \ $(KBUILD_EXTMOD)/Module.markers \ - $(KBUILD_EXTMOD)/modules.order + $(KBUILD_EXTMOD)/modules.order \ + $(KBUILD_EXTMOD)/modules.builtin clean: $(clean-dirs) $(call cmd,rmdirs) $(call cmd,rmfiles)
scripts/Kbuild.include +6 -0
@@ -143,6 +143,12 @@ ld-option = $(call try-run,\ # $(Q)$(MAKE) $(build)=dir build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= +# Usage: +# $(Q)$(MAKE) $(modbuiltin)=dir +modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj + # Prefix -I with $(srctree) if it is not an absolute path. # skip if -I has no parameter addtree = $(if $(patsubst -I%,%,$(1)), \
scripts/Makefile.lib +4 -1
@@ -37,6 +37,8 @@ modorder := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m:.o=.ko __subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) subdir-y += $(__subdir-y) +__subdir-Y := $(patsubst %/,%,$(filter %/, $(obj-Y))) +subdir-Y += $(__subdir-Y) __subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) subdir-m += $(__subdir-m) obj-y := $(patsubst %/, %/built-in.o, $(obj-y))
@@ -44,7 +46,7 @@ obj-m := $(filter-out %/, $(obj-m)) # Subdirectories we need to descend into -subdir-ym := $(sort $(subdir-y) $(subdir-m)) +subdir-ym := $(sort $(subdir-y) $(subdir-Y) $(subdir-m)) # if $(foo-objs) exists, foo.o is a composite object multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))
@@ -76,6 +78,7 @@ always := $(addprefix $(obj)/,$(always)) targets := $(addprefix $(obj)/,$(targets)) modorder := $(addprefix $(obj)/,$(modorder)) obj-y := $(addprefix $(obj)/,$(obj-y)) +obj-Y := $(addprefix $(obj)/,$(obj-Y)) obj-m := $(addprefix $(obj)/,$(obj-m)) lib-y := $(addprefix $(obj)/,$(lib-y)) subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y))
scripts/Makefile.modbuiltin new file +48 -0
48 lines not on this page · raw message
scripts/kconfig/confdata.c +41 -7
126 lines not on this page · raw message
Signature · 1 line
1.6.3.2
Still would definitely like - adding linux-modules to the Cc
Quoted 348 lines · Michal Marek
Quoted 8 lines · Michal Marek
Known issues (found when comparing results with allyesconfig and allmodconfig):
* ALSA makefiles do some substitutions on the CONFIG_* variables sometimes, which breaks the logic if the alsa modules are built-in. Patch sent to alsa-devel.
*samples/kobject/*.ocould be compiled built-in, but doesn't show up in modules.builtin (and not even in vmlinux.o). Patch sent to Greg to make it module-only.These two are merged already.
Quoted 6 lines
*
net/{8021q/vlan_core,ethernet/pe2,ipv6/inet6_hashtables}.oare always built-in, even though the corresponding config option is tristate:
obj-$(subst m,y,$(CONFIG_IPX)) += pe2.o
The result is that modules.builtin can contain three built-in "modules" that can't possibly exist as modules. No fix for this so far, as it is not a big issue IMO.I hope this one is not a problem.
I rebased the patch on top of current kbuild-next.git. What do you think about it? Do you agree on the modules.builtin file name and format? I'd like to add support for this to module-init-tools.
Subject: [PATCH] kbuild: generate modules.builtin
To make it easier for tools like mkinitrd to detect whether a needed module is missing or whether it is compiled into the kernel, install a modules.builtin file listing all modules built into the kernel. This is done by generating an alternate config file with all tristate =y options set to =Y and reading the makefiles with this config included. The built in modules then appear in obj-Y.
Signed-off-by Michal Marek <[email protected]>--- .gitignore | 1 + Makefile | 14 +++++++++--- scripts/Kbuild.include | 6 +++++ scripts/Makefile.lib | 5 +++- scripts/Makefile.modbuiltin | 48 +++++++++++++++++++++++++++++++++++++++++++ scripts/kconfig/confdata.c | 48 ++++++++++++++++++++++++++++++++++++------ 6 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 scripts/Makefile.modbuiltin.gitignore +1
-0@@ -22,6 +22,7 @@ *.lst *.symtypes *.order +modules.builtin *.elf *.bin *.gzMakefile +10
-4@@ -871,6 +871,9 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; PHONY += $(vmlinux-dirs) $(vmlinux-dirs): prepare scripts $(Q)$(MAKE) $(build)=$@ +ifdef CONFIG_MODULES + $(Q)$(MAKE) $(modbuiltin)=$@ +endif # Build the kernel release string #@@ -1126,6 +1129,7 @@ all: modules PHONY += modules modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order + $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin @$(kecho) ' Building modules, stage 2.'; $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild@@ -1154,7 +1158,7 @@ _modinst_: rm -f $(MODLIB)/build ; \ ln -s $(objtree) $(MODLIB)/build ; \ fi - @cp -f $(objtree)/modules.order $(MODLIB)/ + @cp -f $(objtree)/modules.{order,builtin} $(MODLIB)/ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst # This depmod is only for convenience to give the initial@@ -1217,8 +1221,9 @@ clean: archclean $(clean-dirs) \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ -o -name '*.symtypes' -o -name 'modules.order' \ - -o -name 'Module.markers' -o -name '.tmp_*.o.*' \ - -o -name '*.gcno' \) -type f -print | xargs rm -f + -o -name 'modules.builtin' -o -name 'Module.markers' \ + -o -name '.tmp_*.o.*' -o -name '*.gcno' \) \ + -type f -print | xargs rm -f # mrproper - Delete all generated files, including .config #@@ -1416,7 +1421,8 @@ $(clean-dirs): clean: rm-dirs := $(MODVERDIR) clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \ $(KBUILD_EXTMOD)/Module.markers \ - $(KBUILD_EXTMOD)/modules.order + $(KBUILD_EXTMOD)/modules.order \ + $(KBUILD_EXTMOD)/modules.builtin clean: $(clean-dirs) $(call cmd,rmdirs) $(call cmd,rmfiles)scripts/Kbuild.include +6
-0@@ -143,6 +143,12 @@ ld-option = $(call try-run,\ # $(Q)$(MAKE) $(build)=dir build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj +### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= +# Usage: +# $(Q)$(MAKE) $(modbuiltin)=dir +modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj + # Prefix -I with $(srctree) if it is not an absolute path. # skip if -I has no parameter addtree = $(if $(patsubst -I%,%,$(1)), \scripts/Makefile.lib +4
-1@@ -37,6 +37,8 @@ modorder := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m:.o=.ko __subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) subdir-y += $(__subdir-y) +__subdir-Y := $(patsubst %/,%,$(filter %/, $(obj-Y))) +subdir-Y += $(__subdir-Y) __subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) subdir-m += $(__subdir-m) obj-y := $(patsubst %/, %/built-in.o, $(obj-y))@@ -44,7 +46,7 @@ obj-m := $(filter-out %/, $(obj-m)) # Subdirectories we need to descend into -subdir-ym := $(sort $(subdir-y) $(subdir-m)) +subdir-ym := $(sort $(subdir-y) $(subdir-Y) $(subdir-m)) # if $(foo-objs) exists, foo.o is a composite object multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))@@ -76,6 +78,7 @@ always := $(addprefix $(obj)/,$(always)) targets := $(addprefix $(obj)/,$(targets)) modorder := $(addprefix $(obj)/,$(modorder)) obj-y := $(addprefix $(obj)/,$(obj-y)) +obj-Y := $(addprefix $(obj)/,$(obj-Y)) obj-m := $(addprefix $(obj)/,$(obj-m)) lib-y := $(addprefix $(obj)/,$(lib-y)) subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y))scripts/Makefile.modbuiltin new file +48
-0@@ -0,0 +1,48 @@ +# ========================================================================== +# Generating modules.builtin +# ========================================================================== + +src := $(obj) + +PHONY := __modbuiltin +__modbuiltin: + +# Read auto2.conf which sets tristate variables to 'Y' instead of 'y' +# That way, we get the list of built-in modules in obj-Y +-include include/config/auto2.conf + +include scripts/Kbuild.include + +# The filename Kbuild has precedence over Makefile +kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) +kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) +include $(kbuild-file) + +include scripts/Makefile.lib + +modbuiltin-subdirs := $(patsubst %,%/modules.builtin, $(subdir-ym)) +modbuiltin-mods := $(filter %.ko, $(obj-Y:.o=.ko)) +modbuiltin-target := $(obj)/modules.builtin + +__modbuiltin: $(modbuiltin-target) $(subdir-ym) + @: + +modbuiltin-cmds = \ + for m in $(modbuiltin-mods); do echo kernel/$$m; done; \ + cat /dev/null $(modbuiltin-subdirs); + +$(modbuiltin-target): $(subdir-ym) + $(Q)($(modbuiltin-cmds)) > $@ + +# Descending +# --------------------------------------------------------------------------- + +PHONY += $(subdir-ym) +$(subdir-ym): + $(Q)$(MAKE) $(modbuiltin)=$@ + + +# Declare the contents of the .PHONY variable as phony. We keep that +# information in a variable se we can use it in if_changed and friends. + +.PHONY: $(PHONY)scripts/kconfig/confdata.c +41
-7@@ -672,12 +672,27 @@ out:return res; } +int fprintf2 (FILE *f1,FILE *f2,const char *fmt, ...) +{ +va_list ap; +int res; + +va_start (ap, fmt); +vfprintf (f1, fmt, ap); +va_end (ap); +va_start (ap, fmt); + res =vfprintf (f2, fmt, ap); +va_end (ap); + +return res; +} +int conf_write_autoconf (void ) {struct symbol *sym;const char *str;const char *name; -FILE *out, *out_h; +FILE *out, *out2, *out_h;time_t now;int i, l;@@ -692,16 +707,23 @@ int conf_write_autoconf(void)if (!out)return 1 ; + out2 =fopen (".tmpconfig2" ,"w" ); +if (!out2) { +fclose (out); +return 1 ; + } + out_h =fopen (".tmpconfig.h" ,"w" );if (!out_h) {fclose (out); +fclose (out2);return 1 ; } sym =sym_lookup ("KERNELVERSION" ,0 );sym_calc_value (sym);time (&now); -fprintf (out,"#\n" +fprintf2 (out, out2,"#\n" "# Automatically generated make config: don't edit\n" "# Linux kernel version: %s\n" "# %s"@@ -726,45 +748,51 @@ int conf_write_autoconf(void)case no:break ;case mod: -fprintf (out,"CONFIG_%s=m\n" , sym->name); +fprintf2 (out, out2,"CONFIG_%s=m\n" , + sym->name);fprintf (out_h,"#define CONFIG_%s_MODULE 1\n" , sym->name);break ;case yes:fprintf (out,"CONFIG_%s=y\n" , sym->name); +fprintf (out2,"CONFIG_%s=%c\n" , sym->name, + sym->type ==S_BOOLEAN ?'y' :'Y' );fprintf (out_h,"#define CONFIG_%s 1\n" , sym->name);break ; }break ;case S_STRING : str =sym_get_string_value (sym); -fprintf (out,"CONFIG_%s=\"" , sym->name); +fprintf2 (out, out2,"CONFIG_%s=\"" , sym->name);fprintf (out_h,"#define CONFIG_%s \"" , sym->name);while (1 ) { l =strcspn (str,"\"\\" );if (l) {fwrite (str, l,1 , out); +fwrite (str, l,1 , out2);fwrite (str, l,1 , out_h); str += l; }if (!*str)break ; -fprintf (out,"\\%c" , *str); +fprintf2 (out, out2,"\\%c" , *str);fprintf (out_h,"\\%c" , *str); str++; }fputs ("\"\n" , out); +fputs ("\"\n" , out2);fputs ("\"\n" , out_h);break ;case S_HEX : str =sym_get_string_value (sym);if (str[0 ] !='0' || (str[1 ] !='x' && str[1 ] !='X' )) { -fprintf (out,"CONFIG_%s=%s\n" , sym->name, str); +fprintf2 (out, out2,"CONFIG_%s=%s\n" , + sym->name, str);fprintf (out_h,"#define CONFIG_%s 0x%s\n" , sym->name, str);break ; }case S_INT : str =sym_get_string_value (sym); -fprintf (out,"CONFIG_%s=%s\n" , sym->name, str); +fprintf2 (out, out2,"CONFIG_%s=%s\n" , sym->name, str);fprintf (out_h,"#define CONFIG_%s %s\n" , sym->name, str);break ;default :@@ -772,6 +800,7 @@ int conf_write_autoconf(void) } }fclose (out); +fclose (out2);fclose (out_h); name =getenv ("KCONFIG_AUTOHEADER" );@@ -779,6 +808,11 @@ int conf_write_autoconf(void) name ="include/linux/autoconf.h" ;if (rename (".tmpconfig.h" , name))return 1 ; + name =getenv ("KCONFIG_AUTOCONFIG2" ); +if (!name) + name ="include/config/auto2.conf" ; +if (rename (".tmpconfig2" , name)) +return 1 ; name =conf_get_autoconfig_name ();/* * This must be the last step, kbuild has a dependency on auto.conf
Signature · 2 lines
Scott James Remnant [email protected]
Sam, any objections, or a chance to take this through your tree? It solves an old problem with module-init-tools and we would like to teach m-i-t about it, which means it should be in -next at least.
Thanks,
Kay
Quoted 356 lines · Scott James Remnant
Still would definitely like - adding linux-modules to the Cc
Quoted 338 lines · Michal Marek
Quoted 8 lines · Michal Marek
Known issues (found when comparing results with allyesconfig and allmodconfig):
* ALSA makefiles do some substitutions on the CONFIG_* variables sometimes, which breaks the logic if the alsa modules are built-in. Patch sent to alsa-devel.
*samples/kobject/*.ocould be compiled built-in, but doesn't show up in modules.builtin (and not even in vmlinux.o). Patch sent to Greg to make it module-only.These two are merged already.
Quoted 6 lines
*
net/{8021q/vlan_core,ethernet/pe2,ipv6/inet6_hashtables}.oare always built-in, even though the corresponding config option is tristate:
obj-$(subst m,y,$(CONFIG_IPX)) += pe2.o
The result is that modules.builtin can contain three built-in "modules" that can't possibly exist as modules. No fix for this so far, as it is not a big issue IMO.I hope this one is not a problem.
I rebased the patch on top of current kbuild-next.git. What do you think about it? Do you agree on the modules.builtin file name and format? I'd like to add support for this to module-init-tools.
Subject: [PATCH] kbuild: generate modules.builtin
To make it easier for tools like mkinitrd to detect whether a needed module is missing or whether it is compiled into the kernel, install a modules.builtin file listing all modules built into the kernel. This is done by generating an alternate config file with all tristate =y options set to =Y and reading the makefiles with this config included. The built in modules then appear in obj-Y.
Signed-off-by Michal Marek <[email protected]>---
.gitignore | 1 +
Makefile | 14 +++++++++---scripts/Kbuild.include| 6 +++++
scripts/Makefile.lib | 5 +++-scripts/Makefile.modbuiltin| 48 +++++++++++++++++++++++++++++++++++++++++++scripts/kconfig/confdata.c| 48 ++++++++++++++++++++++++++++++++++++------6 files changed, 110 insertions(+), 12 deletions(-)create mode 100644
scripts/Makefile.modbuiltin.gitignore +1
-0@@ -22,6 +22,7 @@ *.lst *.symtypes *.order +modules.builtin *.elf *.bin *.gzMakefile +0
-0@@ -871,6 +871,9 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ; PHONY += $(vmlinux-dirs)$(vmlinux-dirs): prepare scripts
$(Q)$(MAKE) $(build)=$@Makefile +3
-0+ifdef CONFIG_MODULES + $(Q)$(MAKE) $(modbuiltin)=$@ +endif# Build the kernel release string
#Makefile +0
-0@@ -1126,6 +1129,7 @@ all: modulesPHONY += modules
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
+ $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin @$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware__fw_modbuildMakefile +0
-0@@ -1154,7 +1158,7 @@ _modinst_: rm -f $(MODLIB)/build ; \ ln -s $(objtree) $(MODLIB)/build ; \fi
- @cp -f $(objtree)/modules.order $(MODLIB)/
+ @cp -f $(objtree)/modules.{order,builtin} $(MODLIB)/ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst# This depmod is only for convenience to give the initial
Makefile +5
-3@@ -1217,8 +1221,9 @@ clean: archclean $(clean-dirs) \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ -o -name '*.symtypes' -o -name 'modules.order' \ - -o -name 'Module.markers' -o -name '.tmp_*.o.*' \ - -o -name '*.gcno' \) -type f -print | xargs rm -f + -o -name 'modules.builtin' -o -name 'Module.markers' \ + -o -name '.tmp_*.o.*' -o -name '*.gcno' \) \ + -type f -print | xargs rm -f # mrproper - Delete all generated files, including .config #@@ -1416,7 +1421,8 @@ $(clean-dirs): clean: rm-dirs := $(MODVERDIR) clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \ $(KBUILD_EXTMOD)/Module.markers \ - $(KBUILD_EXTMOD)/modules.order + $(KBUILD_EXTMOD)/modules.order \ + $(KBUILD_EXTMOD)/modules.builtin clean: $(clean-dirs) $(call cmd,rmdirs) $(call cmd,rmfiles)scripts/Kbuild.include +0
-0@@ -143,6 +143,12 @@ ld-option = $(call try-run,\ # $(Q)$(MAKE) $(build)=dirbuild := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
scripts/Kbuild.include +6
-0+### +# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.modbuiltin obj= +# Usage: +# $(Q)$(MAKE) $(modbuiltin)=dir +modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj +# Prefix -I with $(srctree) if it is not an absolute path.
# skip if -I has no parameter addtree = $(if $(patsubst -I%,%,$(1)), \scripts/Makefile.lib +4
-1@@ -37,6 +37,8 @@ modorder := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m:.o=.ko __subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) subdir-y += $(__subdir-y) +__subdir-Y := $(patsubst %/,%,$(filter %/, $(obj-Y))) +subdir-Y += $(__subdir-Y) __subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m))) subdir-m += $(__subdir-m) obj-y := $(patsubst %/, %/built-in.o, $(obj-y))@@ -44,7 +46,7 @@ obj-m := $(filter-out %/, $(obj-m)) # Subdirectories we need to descend into -subdir-ym := $(sort $(subdir-y) $(subdir-m)) +subdir-ym := $(sort $(subdir-y) $(subdir-Y) $(subdir-m)) # if $(foo-objs) exists, foo.o is a composite object multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))@@ -76,6 +78,7 @@ always := $(addprefix $(obj)/,$(always)) targets := $(addprefix $(obj)/,$(targets)) modorder := $(addprefix $(obj)/,$(modorder)) obj-y := $(addprefix $(obj)/,$(obj-y)) +obj-Y := $(addprefix $(obj)/,$(obj-Y)) obj-m := $(addprefix $(obj)/,$(obj-m)) lib-y := $(addprefix $(obj)/,$(lib-y)) subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y))scripts/Makefile.modbuiltin new file +48
-0@@ -0,0 +1,48 @@ +# ========================================================================== +# Generating modules.builtin +# ========================================================================== + +src := $(obj) + +PHONY := __modbuiltin +__modbuiltin: + +# Read auto2.conf which sets tristate variables to 'Y' instead of 'y' +# That way, we get the list of built-in modules in obj-Y +-include include/config/auto2.conf + +include scripts/Kbuild.include + +# The filename Kbuild has precedence over Makefile +kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) +kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) +include $(kbuild-file) + +include scripts/Makefile.lib + +modbuiltin-subdirs := $(patsubst %,%/modules.builtin, $(subdir-ym)) +modbuiltin-mods := $(filter %.ko, $(obj-Y:.o=.ko)) +modbuiltin-target := $(obj)/modules.builtin + +__modbuiltin: $(modbuiltin-target) $(subdir-ym) + @: + +modbuiltin-cmds = \ + for m in $(modbuiltin-mods); do echo kernel/$$m; done; \ + cat /dev/null $(modbuiltin-subdirs); + +$(modbuiltin-target): $(subdir-ym) + $(Q)($(modbuiltin-cmds)) > $@ + +# Descending +# --------------------------------------------------------------------------- + +PHONY += $(subdir-ym) +$(subdir-ym): + $(Q)$(MAKE) $(modbuiltin)=$@ + + +# Declare the contents of the .PHONY variable as phony. We keep that +# information in a variable se we can use it in if_changed and friends. + +.PHONY: $(PHONY)scripts/kconfig/confdata.c +24
-2@@ -672,12 +672,27 @@ out: return res; } +int fprintf2 (FILE *f1,FILE *f2,const char *fmt, ...) +{ + va_list ap; + int res; + + va_start(ap, fmt); + vfprintf(f1, fmt, ap); + va_end(ap); + va_start(ap, fmt); + res = vfprintf(f2, fmt, ap); + va_end(ap); + + return res; +} + int conf_write_autoconf(void) { struct symbol *sym; const char *str; const char *name; - FILE *out, *out_h; + FILE *out, *out2, *out_h; time_t now; int i, l;@@ -692,16 +707,23 @@ int conf_write_autoconf(void) if (!out) return 1; + out2 = fopen(".tmpconfig2", "w"); + if (!out2) { + fclose(out); + return 1; + } + out_h = fopen(".tmpconfig.h", "w"); if (!out_h) { fclose(out); + fclose(out2); return 1; } sym = sym_lookup("KERNELVERSION", 0); sym_calc_value(sym); time(&now); - fprintf(out, "#\n" + fprintf2(out, out2, "#\n""# Automatically generated make config: don't edit\n" "# Linux kernel version: %s\n"
"# %s"scripts/kconfig/confdata.c +0
-0@@ -726,45 +748,51 @@ int conf_write_autoconf(void)case no:
break;
case mod:
-fprintf(out, "CONFIG_%s=m\n", sym->name);
+ fprintf2(out, out2, "CONFIG_%s=m\n",
+sym->name);
fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); break;
case yes:
fprintf(out, "CONFIG_%s=y\n", sym->name);
+ fprintf(out2, "CONFIG_%s=%c\n",sym->name,
+sym->type==S_BOOLEAN? 'y' : 'Y');fprintf(out_h, "#define CONFIG_%s 1\n", sym->name); break;
}
break;
caseS_STRING:
str =sym_get_string_value(sym);
-fprintf(out, "CONFIG_%s=\"", sym->name);
+fprintf2(out, out2, "CONFIG_%s=\"", sym->name);fprintf(out_h, "#define CONFIG_%s \"", sym->name); while (1) {
l =strcspn(str, "\"\\");
if (l) {
fwrite(str, l, 1, out);
+fwrite(str, l, 1, out2);
fwrite(str, l, 1, out_h);
str += l;
}
if (!*str)
break;
-fprintf(out, "\\%c", *str);
+fprintf2(out, out2, "\\%c", *str);fprintf(out_h, "\\%c", *str);
str++;
}
fputs("\"\n", out);
+fputs("\"\n", out2);
fputs("\"\n", out_h);
break;
caseS_HEX:
str =sym_get_string_value(sym);
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
-fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
+ fprintf2(out, out2, "CONFIG_%s=%s\n",
+sym->name, str);fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); break;
}
caseS_INT:
str =sym_get_string_value(sym);
-fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
+fprintf2(out, out2, "CONFIG_%s=%s\n", sym->name, str);fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); break;
default:scripts/kconfig/confdata.c +1
-0@@ -772,6 +800,7 @@ int conf_write_autoconf(void) } } fclose(out); + fclose(out2); fclose(out_h); name = getenv("KCONFIG_AUTOHEADER");@@ -779,6 +808,11 @@ int conf_write_autoconf(void) name = "include/linux/autoconf.h";scripts/kconfig/confdata.c int conf_write_autoconf(void) · line 818
Quoted 10 lines
scripts/kconfig/confdata.c +5
-0if (rename(".tmpconfig.h", name)) return 1; + name = getenv("KCONFIG_AUTOCONFIG2"); + if (!name) + name = "include/config/auto2.conf"; + if (rename(".tmpconfig2", name)) + return 1; name = conf_get_autoconfig_name(); /** This must be the last step, kbuild has a dependency on auto.conf --
Scott James Remnant
[email protected]
Guys,
is this patch what you need on the m-i-t end?
(Sorry for sending it as an attachment. I'm restricted to webmail at the moment and can't prevent gmail from adding line breaks.)
Cheers,
Andreas
From d60a4a56f5d484a6076c606a111510ce40a4ccd8 Mon Sep 17 00:00:00 2001
From: Andreas Robinson <[email protected]>
Date: Wed, 15 Jul 2009 19:48:59 +0200
Subject: [PATCH] modprobe: warn when trying to insert a built-in module
The previous behaviour was to fail with "module foo not found".
--- modprobe.c | 34 ++++++++++++++++++++++++++++++++-- 1 files changed, 32 insertions(+), 2 deletions(-)
modprobe.c +32 -2
@@ -1049,6 +1049,29 @@ static char *gather_options(char *argv[])return optstring; } +/* Check whether a module is built into the kernel */ +static int is_builtin (const char *modname,const char *dirname) +{ +char *filename; +FILE *file; +char *line; +int found =0 ; + +nofail_asprintf (&filename,"%s/modules.builtin" , dirname); + file =fopen (filename,"r" ); +if (file) { +while ((line =getline_wrapped (file,NULL )) !=NULL && !found) { +char *p = line; +char *builtin =underscores (strsep_skipspace (&p,"\t " )); + found =streq (modname, builtin); +free (line); + } +fclose (file); + } +free (filename); +return found; +} +/* Do an install/remove command: replace $CMDLINE_OPTS if it's specified. */ static void do_command(const char *modname, const char *command,
@@ -1256,6 +1279,7 @@ static int handle_module(const char *modname,struct module_options *modoptions, struct module_command *commands, const char *cmdline_opts, + const char *dirname, errfn_t error, modprobe_flags_t flags) {
@@ -1271,6 +1295,11 @@ static int handle_module(const char *modname,return 0 ; } +if (is_builtin (modname, dirname)) { +warn ("Module %s is built into the kernel.\n" , modname); +return 0 ; + } +if (!quiet)error ("Module %s not found.\n" , modname);return 1 ;
@@ -1350,7 +1379,7 @@ int do_modprobe(char *modname,read_depends (dirname, aliases->module, &list); failed |=handle_module (aliases->module, &list, newname, opts, modoptions, - commands, cmdline_opts, err, flags); + commands, cmdline_opts, dirname, err, flags); aliases = aliases->next;INIT_LIST_HEAD (&list);
@@ -1361,7 +1390,8 @@ int do_modprobe(char *modname,return failed; failed |=handle_module (modname, &list, newname, cmdline_opts, - modoptions, commands, cmdline_opts, error, flags); + modoptions, commands, cmdline_opts, dirname, error, + flags); }return failed; }
Signature · 1 line
1.6.0.4
Andreas Robinson napsal(a):
Quoted 3 lines
Guys,
is this patch what you need on the m-i-t end?
I already have patches here (it's not against Jon's master, but it should apply):
http://repo.or.cz/w/mit.git?a=commit;h=45c29de1b54478a63352a3f13c570a964903f54f
http://repo.or.cz/w/mit.git?a=commit;h=0e72912a1e0b486225f7052c8d40e28b07ff4495
The idea is that modprobe should just do nothing and exit successfully, so that scripts don't break nor start printing warnings if the kernel config changes. I meant to send it to linux-modules once there is agreement about the modules.builtin file format.
Michal
Quoted 9 lines · Michal Marek
Andreas Robinson napsal(a):
Quoted 3 lines
Guys,
is this patch what you need on the m-i-t end?
I already have patches here (it's not against Jon's master, but it should apply):
http://repo.or.cz/w/mit.git?a=commit;h=45c29de1b54478a63352a3f13c570a964903f54f
http://repo.or.cz/w/mit.git?a=commit;h=0e72912a1e0b486225f7052c8d40e28b07ff4495
Ah, of course!
Quoted 4 lines
The idea is that modprobe should just do nothing and exit successfully, so that scripts don't break nor start printing warnings if the kernel config changes. I meant to send it to linux-modules once there is agreement about the modules.builtin file format.
Ok, that makes sense.
I think there's a small chance of confusion though, when a user tries to insert a module and it doesn't show up with lsmod. Perhaps you can add an info() message? Then the user can figure out what is happening with the --verbose option.
Andreas
Andreas Robinson napsal(a):
Quoted 6 lines · Michal Marek
Quoted 4 lines
The idea is that modprobe should just do nothing and exit successfully, so that scripts don't break nor start printing warnings if the kernel config changes. I meant to send it to linux-modules once there is agreement about the modules.builtin file format.
Quoted 6 lines
Ok, that makes sense.
I think there's a small chance of confusion though, when a user tries to insert a module and it doesn't show up with lsmod. Perhaps you can add an
info()message? Then the user can figure out what is happening with the --verbose option.
Good idea, will do that.
Michal