Message ID | 1411500522-11480-1-git-send-email-behanw@converseincode.com |
---|---|
State | New |
Headers | show |
On 2014-09-23 21:28, behanw@converseincode.com wrote: > From: Mark Charlebois <charlebm@gmail.com> > > Clang will warn about unknown warnings but will not return false You mean unknown options, right? > unless -Werror is set. GCC will return false if an unknown > warning is passed. > > Adding -Werror make both compiler behave the same. Can you please limit it to the clang case? Add an internal variable that either contains -Werror or nothing, depending on the compiler. What I fear is that if we use -Werror unconditionally and the user (or some automated build system) decides to add some silly option to KCFLAGS, we will get silent failures in the cc-option tests. Of course, the same can happen with clang, but there seems to be no way around it. BTW, is there a chance that this would be fixed in some later clang version? Accepting unknown commandline options is a rather unusual behavior. How are all the ./configure scripts going to cope with it? Thanks, Michal -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
On 09/24/14 05:07, Michal Marek wrote: > On 2014-09-23 21:28, behanw@converseincode.com wrote: >> From: Mark Charlebois <charlebm@gmail.com> >> >> Clang will warn about unknown warnings but will not return false > You mean unknown options, right? 2 kinds of options: flags and warnings. clang used to merely warn about unused/unsupported flags/warnings. It now returns errors for unknown flags, but not warnings (unless you specify -Werror). The issue is that a lot of existing projects which use clang expect the former behaviour (I agree that makes no sense, but there you go). >> unless -Werror is set. GCC will return false if an unknown >> warning is passed. >> >> Adding -Werror make both compiler behave the same. > Can you please limit it to the clang case? Add an internal variable that > either contains -Werror or nothing, depending on the compiler. I can do that. Will fix. > What I > fear is that if we use -Werror unconditionally and the user (or some > automated build system) decides to add some silly option to KCFLAGS, we > will get silent failures in the cc-option tests. A valid concern for sure. > BTW, is there a chance that this would be fixed in some later clang > version? Accepting unknown commandline options is a rather unusual > behavior. How are all the ./configure scripts going to cope with it? Again, clang does error out on unknown compiler flags (as opposed to warnings). Getting clang to error on unused flags wasn't trivial (this change broke a lot of builds apparently). Fortunately we weren't the only ones who wanted it to behave like gcc in this case. I think it's going to be *much* harder to do the same for warnings. The argument given by supporters of the current situation is that if a warning isn't supported, why break the build? *sigh* The LLVMLinux project is pushing hard to fix these sorts of things in clang, but some changes are more likely than others. Thanks, Behan
On 2014-09-24 20:50, Behan Webster wrote: > On 09/24/14 05:07, Michal Marek wrote: >> On 2014-09-23 21:28, behanw@converseincode.com wrote: >>> From: Mark Charlebois <charlebm@gmail.com> >>> >>> Clang will warn about unknown warnings but will not return false >> You mean unknown options, right? > 2 kinds of options: flags and warnings. clang used to merely warn about > unused/unsupported flags/warnings. It now returns errors for unknown > flags, but not warnings (unless you specify -Werror). Ah, unknown warning options. Now I understand. > Getting clang to error on unused flags wasn't trivial (this change broke > a lot of builds apparently). Fortunately we weren't the only ones who > wanted it to behave like gcc in this case. I think it's going to be > *much* harder to do the same for warnings. The argument given by > supporters of the current situation is that if a warning isn't > supported, why break the build? *sigh* I guess the reason to accept unknown warnings opentions is compatibility with Makefiles with hardcoded gcc-isms. BTW, GCC at some point started to ignore unknown -Wno-* options, for everyone's good of course. That's why we ended up with the cc-disable-warning function. If -W* options for clang need special care, then it might be a good idea to introduce cc-warning with the conditional -Werror for clang. There are not that many places where we add warnings, so the patch would be still short. That way, the possible silent failure is limited only to warning options with clang, which is not such a big deal. Michal -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
On 09/25/14 06:34, Michal Marek wrote: > On 2014-09-24 20:50, Behan Webster wrote: >> Getting clang to error on unused flags wasn't trivial (this change broke >> a lot of builds apparently). Fortunately we weren't the only ones who >> wanted it to behave like gcc in this case. I think it's going to be >> *much* harder to do the same for warnings. The argument given by >> supporters of the current situation is that if a warning isn't >> supported, why break the build? *sigh* > I guess the reason to accept unknown warnings opentions is compatibility > with Makefiles with hardcoded gcc-isms. BTW, GCC at some point started > to ignore unknown -Wno-* options, for everyone's good of course. That's > why we ended up with the cc-disable-warning function. If -W* options for > clang need special care, then it might be a good idea to introduce > cc-warning with the conditional -Werror for clang. There are not that > many places where we add warnings, so the patch would be still short. > That way, the possible silent failure is limited only to warning options > with clang, which is not such a big deal. I'll try this approach. Thanks, Behan
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 8a9a4e1..e37ca5c 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -111,12 +111,12 @@ as-instr = $(call try-run,\ # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) cc-option = $(call try-run,\ - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2)) + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2)) # cc-option-yn # Usage: flag := $(call cc-option-yn,-march=winchip-c6) cc-option-yn = $(call try-run,\ - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) # cc-option-align # Prefix align with either -falign or -malign @@ -126,7 +126,7 @@ cc-option-align = $(subst -functions=0,,\ # cc-disable-warning # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) cc-disable-warning = $(call try-run,\ - $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) + $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) # cc-version # Usage gcc-ver := $(call cc-version)