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 [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