On Sat, Sep 19, 2020 at 6:50 AM Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx> wrote: > > From: Filipe Brandenburger <filbranden@xxxxxxxxxx> > > Set KBUILD_MODPOST_FAIL_ON_WARNINGS to a non-empty value to make the > kbuild fail when modpost generates any warnings. This will avoid > misses such as [1] where the SOF CI did not catch a missing module > license. > > This was initially contributed in 2016 [2], rebase/clean-ups and tests > by Pierre Bossart. > > Test example: > $ KBUILD_MODPOST_FAIL_ON_WARNINGS=1 make > GEN Makefile > DESCEND objtool > CALL sof-dev/scripts/atomic/check-atomics.sh > CALL sof-dev/scripts/checksyscalls.sh > CHK include/generated/compile.h > MODPOST Module.symvers > Kernel: arch/x86/boot/bzImage is ready (#13) > WARNING: modpost: missing MODULE_LICENSE() in sound/soc/intel/boards/snd-soc-sof-sdw.o > make[2]: *** [sof-dev/scripts/Makefile.modpost:114: Module.symvers] Error 2 I think [1] should be an error instead of a warning by default. > [1] https://lkml.org/lkml/2020/9/17/2343 > [2] https://patchwork.kernel.org/patch/8343431/ > > Signed-off-by: Filipe Brandenburger <filbranden@xxxxxxxxxx> > Cc: Greg Thelen <gthelen@xxxxxxxxxx> > Cc: Michael Davidson <md@xxxxxxxxxx> > Cc: Eugene Surovegin <surovegin@xxxxxxxxxx> > Cc: Stephen Rothwell <sfr@xxxxxxxxxxxxxxxx> > Co-developed-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx> > --- > Documentation/kbuild/kbuild.rst | 5 +++++ > scripts/Makefile.modpost | 5 ++++- > scripts/mod/modpost.c | 12 +++++++++++- > 3 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/Documentation/kbuild/kbuild.rst b/Documentation/kbuild/kbuild.rst > index 2d1fc03d346e..cc102aad8619 100644 > --- a/Documentation/kbuild/kbuild.rst > +++ b/Documentation/kbuild/kbuild.rst > @@ -229,6 +229,11 @@ KBUILD_MODPOST_WARN can be set to avoid errors in case of undefined > symbols in the final module linking stage. It changes such errors > into warnings. > > +KBUILD_MODPOST_FAIL_ON_WARNINGS > +------------------------------- > +KBUILD_MODPOST_FAIL_ON_WARNINGS can be set to turn all warnings into > +errors in the final module linking stage. > + > KBUILD_MODPOST_NOFINAL > ---------------------- > KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules. > diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost > index f54b6ac37ac2..69297cd6f8ce 100644 > --- a/scripts/Makefile.modpost > +++ b/scripts/Makefile.modpost > @@ -34,6 +34,8 @@ > > # KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined > # symbols in the final module linking stage > +# KBUILD_MODPOST_FAIL_ON_WARNINGS can be set to fail whenever modpost > +# generates warnings > # KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules. > # This is solely useful to speed up test compiles > > @@ -47,7 +49,8 @@ MODPOST = scripts/mod/modpost \ > $(if $(CONFIG_MODVERSIONS),-m) \ > $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \ > $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \ > - $(if $(KBUILD_MODPOST_WARN),-w) \ > + $(if $(KBUILD_MODPOST_WARN),-w) \ > + $(if $(KBUILD_MODPOST_FAIL_ON_WARNINGS),-F) \ > -o $@ > > ifdef MODPOST_VMLINUX > diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c > index 69341b36f271..422f1cfca289 100644 > --- a/scripts/mod/modpost.c > +++ b/scripts/mod/modpost.c > @@ -39,6 +39,9 @@ static int sec_mismatch_fatal = 0; > static int ignore_missing_files; > /* If set to 1, only warn (instead of error) about missing ns imports */ > static int allow_missing_ns_imports; > +/* Turn warnings into errors */ > +static int fail_on_warnings; > +static int warnings_count; > > enum export { > export_plain, export_unused, export_gpl, > @@ -59,6 +62,7 @@ modpost_log(enum loglevel loglevel, const char *fmt, ...) > switch (loglevel) { > case LOG_WARN: > fprintf(stderr, "WARNING: "); > + warnings_count++; > break; > case LOG_ERROR: > fprintf(stderr, "ERROR: "); > @@ -2559,7 +2563,7 @@ int main(int argc, char **argv) > struct dump_list *dump_read_start = NULL; > struct dump_list **dump_read_iter = &dump_read_start; > > - while ((opt = getopt(argc, argv, "ei:mnT:o:awENd:")) != -1) { > + while ((opt = getopt(argc, argv, "ei:mnT:o:awEFNd:")) != -1) { > switch (opt) { > case 'e': > external_module = 1; > @@ -2588,6 +2592,9 @@ int main(int argc, char **argv) > case 'w': > warn_unresolved = 1; > break; > + case 'F': > + fail_on_warnings = 1; > + break; > case 'E': > sec_mismatch_fatal = 1; > break; > @@ -2671,5 +2678,8 @@ int main(int argc, char **argv) > > free(buf.p); > > + if (fail_on_warnings && warnings_count) > + err |= 2; > + > return err; > } > -- > 2.25.1 > -- Best Regards Masahiro Yamada