On Wed, Apr 6, 2022 at 8:31 AM Masahiro Yamada <masahiroy@xxxxxxxxxx> wrote: > > It is allowed to add the same objects multiple times to obj-y / obj-m: > > obj-y += foo.o foo.o foo.o > obj-m += bar.o bar.o bar.o > > It is also allowed to add the same objects multiple times to a composite > module: > > obj-m += foo.o > foo-objs := foo1.o foo2.o foo2.o foo1.o > > This flexibility is useful because the same object might be selected by > different CONFIG options, like this: > > obj-m += foo.o > foo-y := foo1.o > foo-$(CONFIG_FOO_X) += foo2.o > foo-$(CONFIG_FOO_Y) += foo2.o > > The duplicated objects are omitted at link time. It works naturally in > Makefiles because GNU Make removes duplication in $^ without changing > the order. > > It is working well, almost... > > A small flaw I notice is, *.mod contains duplication in such a case. > > This is probably not a big deal. As far as I know, the only small > problem is scripts/mod/sumversion.c parses the same file multiple > times. > > I am fixing this because I plan to reuse *.mod for other purposes, > where the duplication can be problematic. > > The code change is quite simple. We already use awk to drop duplicated > lines in modules.order (see cmd_modules_order in the same file). Why does the top level Makefile reassign cmd_modules_order rather than use the original value in scripts/Makefile.build? > I copied the code, but changed RS to use spaces as record separators. > > I also changed the file format to list one object per line. > > Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> > --- > > scripts/Makefile.build | 3 ++- > scripts/mod/sumversion.c | 2 +- > 2 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/scripts/Makefile.build b/scripts/Makefile.build > index 6ae92d119dfa..f7a30f378e20 100644 > --- a/scripts/Makefile.build > +++ b/scripts/Makefile.build > @@ -303,7 +303,8 @@ $(obj)/%.prelink.o: $(obj)/%.o FORCE > $(call if_changed,cc_prelink_modules) > endif > > -cmd_mod = echo $(addprefix $(obj)/, $(call real-search, $*.o, .o, -objs -y -m)) > $@ > +cmd_mod = echo $(addprefix $(obj)/, $(call real-search, $*.o, .o, -objs -y -m)) | \ > + $(AWK) -v RS='( |\n)' '!x[$$0]++' > $@ God AWK is unreadable. Any reason we can't use GNU make's sort builtin? https://www.gnu.org/software/make/manual/html_node/Text-Functions.html > > $(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o FORCE > $(call if_changed,mod) > diff --git a/scripts/mod/sumversion.c b/scripts/mod/sumversion.c > index 0125698f2037..79bb9eaa65ac 100644 > --- a/scripts/mod/sumversion.c > +++ b/scripts/mod/sumversion.c > @@ -398,7 +398,7 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen) > buf = read_text_file(filelist); > > md4_init(&md); > - while ((fname = strsep(&buf, " \n"))) { > + while ((fname = strsep(&buf, "\n"))) { > if (!*fname) > continue; > if (!(is_static_library(fname)) && > -- > 2.32.0 > -- Thanks, ~Nick Desaulniers