[dpdk-dev,v2,1/2] mk: fix cross build errors

Message ID 1527490428-15540-1-git-send-email-gavin.hu@arm.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Gavin Hu May 28, 2018, 6:53 a.m. UTC
  The "-Wimplicit-fallthrough=2" option was introduced into gcc 7.0, it was
enabled when the cross compiler gcc is greater than 7.0, but for the host
side buildtools/pmdinfogen, if the native is older than 7.0, it should not
be enabled.

The fix is to differentiate the host gcc Werror options from the cross gcc.

gcc -Wp,-MD,./.pmdinfogen.o.d.tmp  -W -Wall -Wstrict-prototypes
-Wmissing-prototypes -Wmissing-declarations -Wold-style-definition
-Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual
-Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wdeprecated
-Werror -Wimplicit-fallthrough=2 -Dbbb -Wno-format-truncation -g
-I/home/gavin/arm_repo/dpdk/build/include    -o pmdinfogen.o -c
~/dpdk/buildtools/pmdinfogen/pmdinfogen.c gcc: error:
unrecognized command line option ‘-Wimplicit-fallthrough=2’
~/dpdk/mk/internal/rte.compile-pre.mk:114: recipe for target 'pmdinfogen.o'
failed make[3]: *** [pmdinfogen.o] Error 1

Fixes: ced3e6f8 ("mk: adjust gcc flags for new gcc 7 warnings")
Cc: stable@dpdk.org

Signed-off-by: Gavin Hu <gavin.hu@arm.com>
Reviewed-by: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
Reviewed-by: Steve Capper <Steve.Capper@arm.com>
Reviewed-by: Thomas Monjalon <thomas@monjalon.net>
---
 buildtools/pmdinfogen/Makefile           | 2 +-
 mk/toolchain/gcc/rte.toolchain-compat.mk | 5 +++++
 mk/toolchain/gcc/rte.vars.mk             | 9 +++++++++
 3 files changed, 15 insertions(+), 1 deletion(-)
  

Comments

Bruce Richardson May 28, 2018, 1:24 p.m. UTC | #1
On Mon, May 28, 2018 at 02:53:47AM -0400, Gavin Hu wrote:
> The "-Wimplicit-fallthrough=2" option was introduced into gcc 7.0, it was
> enabled when the cross compiler gcc is greater than 7.0, but for the host
> side buildtools/pmdinfogen, if the native is older than 7.0, it should not
> be enabled.
> 
> The fix is to differentiate the host gcc Werror options from the cross gcc.
> 
> gcc -Wp,-MD,./.pmdinfogen.o.d.tmp  -W -Wall -Wstrict-prototypes
> -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition
> -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual
> -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -Wdeprecated
> -Werror -Wimplicit-fallthrough=2 -Dbbb -Wno-format-truncation -g
> -I/home/gavin/arm_repo/dpdk/build/include    -o pmdinfogen.o -c
> ~/dpdk/buildtools/pmdinfogen/pmdinfogen.c gcc: error:
> unrecognized command line option ‘-Wimplicit-fallthrough=2’
> ~/dpdk/mk/internal/rte.compile-pre.mk:114: recipe for target 'pmdinfogen.o'
> failed make[3]: *** [pmdinfogen.o] Error 1
> 
> Fixes: ced3e6f8 ("mk: adjust gcc flags for new gcc 7 warnings")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Gavin Hu <gavin.hu@arm.com>
> Reviewed-by: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
> Reviewed-by: Steve Capper <Steve.Capper@arm.com>
> Reviewed-by: Thomas Monjalon <thomas@monjalon.net>
> ---

Would a simpler solution for this not be to put "-Wno-implicit-fallthrough"
for pmdinfogen? GCC will not give a warning for an unrecognised "-Wno"
flag when compiling, unless there are other errors. This means we can just
use the flag without bothering with version checks.

/Bruce
  
Gavin Hu May 29, 2018, 1:22 a.m. UTC | #2
Hi Bruce,

Thanks for your helpful comment, see my inline comments.

Best Regards,
Gavin

-----Original Message-----
From: Bruce Richardson <bruce.richardson@intel.com>

Sent: Monday, May 28, 2018 9:24 PM
To: Gavin Hu <Gavin.Hu@arm.com>
Cc: dev@dpdk.org; stable@dpdk.org
Subject: Re: [dpdk-dev] [PATCH v2 1/2] mk: fix cross build errors

On Mon, May 28, 2018 at 02:53:47AM -0400, Gavin Hu wrote:
> The "-Wimplicit-fallthrough=2" option was introduced into gcc 7.0, it

> was enabled when the cross compiler gcc is greater than 7.0, but for

> the host side buildtools/pmdinfogen, if the native is older than 7.0,

> it should not be enabled.

>

> The fix is to differentiate the host gcc Werror options from the cross gcc.

>

> gcc -Wp,-MD,./.pmdinfogen.o.d.tmp  -W -Wall -Wstrict-prototypes

> -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition

> -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual

> -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings

> -Wdeprecated -Werror -Wimplicit-fallthrough=2 -Dbbb -Wno-format-truncation -g

> -I/home/gavin/arm_repo/dpdk/build/include    -o pmdinfogen.o -c

> ~/dpdk/buildtools/pmdinfogen/pmdinfogen.c gcc: error:

> unrecognized command line option ‘-Wimplicit-fallthrough=2’

> ~/dpdk/mk/internal/rte.compile-pre.mk:114: recipe for target 'pmdinfogen.o'

> failed make[3]: *** [pmdinfogen.o] Error 1

>

> Fixes: ced3e6f8 ("mk: adjust gcc flags for new gcc 7 warnings")

> Cc: stable@dpdk.org

>

> Signed-off-by: Gavin Hu <gavin.hu@arm.com>

> Reviewed-by: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>

> Reviewed-by: Steve Capper <Steve.Capper@arm.com>

> Reviewed-by: Thomas Monjalon <thomas@monjalon.net>

> ---


Would a simpler solution for this not be to put "-Wno-implicit-fallthrough"
for pmdinfogen? GCC will not give a warning for an unrecognised "-Wno"
flag when compiling, unless there are other errors. This means we can just use the flag without bothering with version checks.

 [Gavin Hu] I tried your proposal, added "-Wno-implicit-fallthrough" before $( WERROR_FLAGS) in the pmdinfo Makefile.
It took precedence and made following " Wimplicit-fallthrough=2" useless, the compilation succeeded.

Is this what you mean?
Note the two options must be in this order, otherwise the compiling error still hit.

Another option is totally disable WERROR_FLAGS for pmdinfo, but this is not a best way as it includes a lot of other options.

toolchain/gcc/rte.vars.mk:46:WERROR_FLAGS := -W -Wall -Wstrict-prototypes -Wmissing-prototypes
toolchain/gcc/rte.vars.mk:47:WERROR_FLAGS += -Wmissing-declarations -Wold-style-definition -Wpointer-arith
toolchain/gcc/rte.vars.mk:48:WERROR_FLAGS += -Wcast-align -Wnested-externs -Wcast-qual
toolchain/gcc/rte.vars.mk:49:WERROR_FLAGS += -Wformat-nonliteral -Wformat-security
toolchain/gcc/rte.vars.mk:50:WERROR_FLAGS += -Wundef -Wwrite-strings -Wdeprecated
toolchain/gcc/rte.vars.mk:53:WERROR_FLAGS += -Werror
toolchain/gcc/rte.vars.mk:59:WERROR_FLAGS += -Wno-error=cast-align
toolchain/gcc/rte.vars.mk:67:WERROR_FLAGS += -Wno-missing-field-initializers
toolchain/gcc/rte.vars.mk:71:WERROR_FLAGS += -Wno-uninitialized
toolchain/gcc/rte.vars.mk:85:WERROR_FLAGS += -Wimplicit-fallthrough=2
toolchain/gcc/rte.vars.mk:87:WERROR_FLAGS += -Wno-format-truncation

/Bruce
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
  
Thomas Monjalon May 29, 2018, 2:45 p.m. UTC | #3
28/05/2018 15:24, Bruce Richardson:
> Would a simpler solution for this not be to put "-Wno-implicit-fallthrough"
> for pmdinfogen? GCC will not give a warning for an unrecognised "-Wno"
> flag when compiling, unless there are other errors. This means we can just
> use the flag without bothering with version checks.

No, it does not work.
I have this error with clang 5.0.1:
	error: unknown warning option '-Wno-format-truncation'
  
Bruce Richardson May 29, 2018, 3 p.m. UTC | #4
On Tue, May 29, 2018 at 04:45:55PM +0200, Thomas Monjalon wrote:
> 28/05/2018 15:24, Bruce Richardson:
> > Would a simpler solution for this not be to put "-Wno-implicit-fallthrough"
> > for pmdinfogen? GCC will not give a warning for an unrecognised "-Wno"
> > flag when compiling, unless there are other errors. This means we can just
> > use the flag without bothering with version checks.
> 
> No, it does not work.
> I have this error with clang 5.0.1:
> 	error: unknown warning option '-Wno-format-truncation'
> 
Yes, you still need to check for GCC to use the flag, just not for a
specific version of GCC.

/Bruce
  
Gavin Hu May 29, 2018, 4:20 p.m. UTC | #5
> -----Original Message-----
> From: Bruce Richardson <bruce.richardson@intel.com>
> Sent: Tuesday, May 29, 2018 11:00 PM
> To: Thomas Monjalon <thomas@monjalon.net>
> Cc: Gavin Hu <Gavin.Hu@arm.com>; dev@dpdk.org
> Subject: Re: [dpdk-stable] [dpdk-dev] [PATCH v2 1/2] mk: fix cross build
> errors
>
> On Tue, May 29, 2018 at 04:45:55PM +0200, Thomas Monjalon wrote:
> > 28/05/2018 15:24, Bruce Richardson:
> > > Would a simpler solution for this not be to put "-Wno-implicit-
> fallthrough"
> > > for pmdinfogen? GCC will not give a warning for an unrecognised "-Wno"
> > > flag when compiling, unless there are other errors. This means we
> > > can just use the flag without bothering with version checks.
> >
> > No, it does not work.
> > I have this error with clang 5.0.1:
> > error: unknown warning option '-Wno-format-truncation'
> >
> Yes, you still need to check for GCC to use the flag, just not for a specific
> version of GCC.
>
> /Bruce
Hi Thomas, did you meet this clang error when you applied my patch(which version?) or your own one?
@Bruce and Thomas, Could you review my v5 patch?  Thanks!

/Gavin

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
  
Thomas Monjalon May 29, 2018, 7:53 p.m. UTC | #6
29/05/2018 18:20, Gavin Hu:
> 
> > -----Original Message-----
> > From: Bruce Richardson <bruce.richardson@intel.com>
> > Sent: Tuesday, May 29, 2018 11:00 PM
> > To: Thomas Monjalon <thomas@monjalon.net>
> > Cc: Gavin Hu <Gavin.Hu@arm.com>; dev@dpdk.org
> > Subject: Re: [dpdk-stable] [dpdk-dev] [PATCH v2 1/2] mk: fix cross build
> > errors
> >
> > On Tue, May 29, 2018 at 04:45:55PM +0200, Thomas Monjalon wrote:
> > > 28/05/2018 15:24, Bruce Richardson:
> > > > Would a simpler solution for this not be to put "-Wno-implicit-
> > fallthrough"
> > > > for pmdinfogen? GCC will not give a warning for an unrecognised "-Wno"
> > > > flag when compiling, unless there are other errors. This means we
> > > > can just use the flag without bothering with version checks.
> > >
> > > No, it does not work.
> > > I have this error with clang 5.0.1:
> > > error: unknown warning option '-Wno-format-truncation'
> > >
> > Yes, you still need to check for GCC to use the flag, just not for a specific
> > version of GCC.
> >
> > /Bruce
> Hi Thomas, did you meet this clang error when you applied my patch(which version?) or your own one?
> @Bruce and Thomas, Could you review my v5 patch?  Thanks!

I've already replied to your v5.
The error is seen with your v5.
  

Patch

diff --git a/buildtools/pmdinfogen/Makefile b/buildtools/pmdinfogen/Makefile
index bf07b6f..ff7a5fa 100644
--- a/buildtools/pmdinfogen/Makefile
+++ b/buildtools/pmdinfogen/Makefile
@@ -41,7 +41,7 @@  HOSTAPP = dpdk-pmdinfogen
 #
 SRCS-y += pmdinfogen.c
 
-HOST_CFLAGS += $(WERROR_FLAGS) -g
+HOST_CFLAGS += $(HOST_WERROR_FLAGS) -g
 HOST_CFLAGS += -I$(RTE_OUTPUT)/include
 
 include $(RTE_SDK)/mk/rte.hostapp.mk
diff --git a/mk/toolchain/gcc/rte.toolchain-compat.mk b/mk/toolchain/gcc/rte.toolchain-compat.mk
index 255c896..1e4434f 100644
--- a/mk/toolchain/gcc/rte.toolchain-compat.mk
+++ b/mk/toolchain/gcc/rte.toolchain-compat.mk
@@ -15,6 +15,11 @@  GCC_MINOR = $(shell echo __GNUC_MINOR__ | $(CC) -E -x c - | tail -n 1)
 GCC_PATCHLEVEL = $(shell echo __GNUC_PATCHLEVEL__ | $(CC) -E -x c - | tail -n 1)
 GCC_VERSION = $(GCC_MAJOR)$(GCC_MINOR)
 
+HOST_GCC_MAJOR = $(shell echo __GNUC__ | $(HOSTCC) -E -x c - | tail -n 1)
+HOST_GCC_MINOR = $(shell echo __GNUC_MINOR__ | $(HOSTCC) -E -x c - | tail -n 1)
+HOST_GCC_PATCHLEVEL = $(shell echo __GNUC_PATCHLEVEL__ | $(HOSTCC) -E -x c - | tail -n 1)
+HOST_GCC_VERSION = $(HOST_GCC_MAJOR)$(HOST_GCC_MINOR)
+
 # if GCC is older than 4.x
 ifeq ($(shell test $(GCC_VERSION) -lt 40 && echo 1), 1)
 	MACHINE_CFLAGS =
diff --git a/mk/toolchain/gcc/rte.vars.mk b/mk/toolchain/gcc/rte.vars.mk
index 7e4531b..d8b99fa 100644
--- a/mk/toolchain/gcc/rte.vars.mk
+++ b/mk/toolchain/gcc/rte.vars.mk
@@ -71,6 +71,15 @@  ifeq ($(shell test $(GCC_VERSION) -lt 47 && echo 1), 1)
 WERROR_FLAGS += -Wno-uninitialized
 endif
 
+HOST_WERROR_FLAGS := $(WERROR_FLAGS)
+
+ifeq ($(shell test $(HOST_GCC_VERSION) -gt 70 && echo 1), 1)
+# Tell GCC only to error for switch fallthroughs without a suitable comment
+HOST_WERROR_FLAGS += -Wimplicit-fallthrough=2
+# Ignore errors for snprintf truncation
+HOST_WERROR_FLAGS += -Wno-format-truncation
+endif
+
 ifeq ($(shell test $(GCC_VERSION) -gt 70 && echo 1), 1)
 # Tell GCC only to error for switch fallthroughs without a suitable comment
 WERROR_FLAGS += -Wimplicit-fallthrough=2