From: Scott James Remnant <scott@ubuntu.com>
To: Michal Marek <mmarek@suse.cz>, linux-modules@vger.kernel.org
Cc: Sam Ravnborg <sam@ravnborg.org>,
linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] kbuild: generate modules.builtin
Date: Wed, 15 Jul 2009 17:39:14 +0100 [thread overview]
Message-ID: <1247675954.3968.140.camel@quest> (raw)
In-Reply-To: <20090703144547.GA20980@sepie.suse.cz>
[-- Attachment #1: Type: text/plain, Size: 12479 bytes --]
Still would definitely like - adding linux-modules to the Cc
On Fri, 2009-07-03 at 16:45 +0200, Michal Marek wrote:
> On Tue, May 26, 2009 at 05:25:40PM +0200, Michal Marek wrote:
> > 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.
>
> These two are merged already.
>
>
> > * 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.
>
> 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 <mmarek@suse.cz>
> ---
> .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
>
> diff --git a/.gitignore b/.gitignore
> index cecb3b0..d8c1e79 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -22,6 +22,7 @@
> *.lst
> *.symtypes
> *.order
> +modules.builtin
> *.elf
> *.bin
> *.gz
> diff --git a/Makefile b/Makefile
> index 46e1c9d..c59e167 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -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)
> diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
> index c29be8f..1cded3b 100644
> --- a/scripts/Kbuild.include
> +++ b/scripts/Kbuild.include
> @@ -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)), \
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index 7a77787..3525b29 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -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))
> diff --git a/scripts/Makefile.modbuiltin b/scripts/Makefile.modbuiltin
> new file mode 100644
> index 0000000..55e1885
> --- /dev/null
> +++ b/scripts/Makefile.modbuiltin
> @@ -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)
> diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
> index a04da34..8e2c166 100644
> --- a/scripts/kconfig/confdata.c
> +++ b/scripts/kconfig/confdata.c
> @@ -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
--
Scott James Remnant
scott@ubuntu.com
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 197 bytes --]
next prev parent reply other threads:[~2009-07-15 16:39 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-26 15:25 [PATCH] kbuild: generate modules.builtin Michal Marek
2009-05-27 21:26 ` Kay Sievers
2009-05-27 21:38 ` Scott James Remnant
2009-07-03 14:45 ` Michal Marek
2009-07-15 16:39 ` Scott James Remnant [this message]
2009-07-15 16:46 ` Kay Sievers
2009-07-15 18:04 ` Andreas Robinson
2009-07-15 19:08 ` Michal Marek
2009-07-15 20:12 ` Andreas Robinson
2009-07-15 20:16 ` Michal Marek
-- strict thread matches above, loose matches on Subject: below --
2009-09-25 15:13 Michal Marek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1247675954.3968.140.camel@quest \
--to=scott@ubuntu.com \
--cc=linux-kbuild@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-modules@vger.kernel.org \
--cc=mmarek@suse.cz \
--cc=sam@ravnborg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.