| From 191e93f8ca46672712ca45462d45f5c5566e97e4 Mon Sep 17 00:00:00 2001 |
| From: Stephen Boyd <swboyd@chromium.org> |
| Date: Tue, 30 Jul 2019 09:48:03 -0700 |
| Subject: kbuild: Check for unknown options with cc-option usage in Kconfig and |
| clang |
| |
| [ Upstream commit e8de12fb7cde2c85bc31097cd098da79a4818305 ] |
| |
| If the particular version of clang a user has doesn't enable |
| -Werror=unknown-warning-option by default, even though it is the |
| default[1], then make sure to pass the option to the Kconfig cc-option |
| command so that testing options from Kconfig files works properly. |
| Otherwise, depending on the default values setup in the clang toolchain |
| we will silently assume options such as -Wmaybe-uninitialized are |
| supported by clang, when they really aren't. |
| |
| A compilation issue only started happening for me once commit |
| 589834b3a009 ("kbuild: Add -Werror=unknown-warning-option to |
| CLANG_FLAGS") was applied on top of commit b303c6df80c9 ("kbuild: |
| compute false-positive -Wmaybe-uninitialized cases in Kconfig"). This |
| leads kbuild to try and test for the existence of the |
| -Wmaybe-uninitialized flag with the cc-option command in |
| scripts/Kconfig.include, and it doesn't see an error returned from the |
| option test so it sets the config value to Y. Then the Makefile tries to |
| pass the unknown option on the command line and |
| -Werror=unknown-warning-option catches the invalid option and breaks the |
| build. Before commit 589834b3a009 ("kbuild: Add |
| -Werror=unknown-warning-option to CLANG_FLAGS") the build works fine, |
| but any cc-option test of a warning option in Kconfig files silently |
| evaluates to true, even if the warning option flag isn't supported on |
| clang. |
| |
| Note: This doesn't change cc-option usages in Makefiles because those |
| use a different rule that includes KBUILD_CFLAGS by default (see the |
| __cc-option command in scripts/Kbuild.incluide). The KBUILD_CFLAGS |
| variable already has the -Werror=unknown-warning-option flag set. Thanks |
| to Doug for pointing out the different rule. |
| |
| [1] https://clang.llvm.org/docs/DiagnosticsReference.html#wunknown-warning-option |
| Cc: Peter Smith <peter.smith@linaro.org> |
| Cc: Nick Desaulniers <ndesaulniers@google.com> |
| Cc: Douglas Anderson <dianders@chromium.org> |
| Signed-off-by: Stephen Boyd <swboyd@chromium.org> |
| Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> |
| Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| scripts/Kconfig.include | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/scripts/Kconfig.include b/scripts/Kconfig.include |
| index dad5583451afb..3b2861f47709b 100644 |
| --- a/scripts/Kconfig.include |
| +++ b/scripts/Kconfig.include |
| @@ -20,7 +20,7 @@ success = $(if-success,$(1),y,n) |
| |
| # $(cc-option,<flag>) |
| # Return y if the compiler supports <flag>, n otherwise |
| -cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null) |
| +cc-option = $(success,$(CC) -Werror $(CLANG_FLAGS) $(1) -E -x c /dev/null -o /dev/null) |
| |
| # $(ld-option,<flag>) |
| # Return y if the linker supports <flag>, n otherwise |
| -- |
| 2.20.1 |
| |