[v13,1/6] mk: fix makefile based cross build errors

Message ID 20180625024913.17219-2-gavin.hu@arm.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series Fix the cross compiling errors |

Checks

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

Commit Message

Gavin Hu June 25, 2018, 2:49 a.m. UTC
  From: gavin hu <gavin.hu@arm.com>

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 gcc is older than 7.0, or the
host cc compiler is clang, 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>
---
 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

Ali Alnubani June 25, 2018, 4:10 p.m. UTC | #1
Tested-by: Ali Alnubani <alialnu@mellanox.com>

> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Gavin Hu
> Sent: Monday, June 25, 2018 5:49 AM
> To: dev@dpdk.org
> Cc: nd@arm.com; gavin.hu@arm.com; stable@dpdk.org
> Subject: [dpdk-dev] [PATCH v13 1/6] mk: fix makefile based cross build errors
> 
> From: gavin hu <gavin.hu@arm.com>
> 
> 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 gcc is older than 7.0, or the host cc
> compiler is clang, 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>
> ---
>  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(-)
> 
> diff --git a/buildtools/pmdinfogen/Makefile
> b/buildtools/pmdinfogen/Makefile index bf07b6f2e..ff7a5fae6 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 255c89677..1e4434fa9 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 7e4531bab..d8b99faf6 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
> --
> 2.11.0
  
Thomas Monjalon June 27, 2018, 9 p.m. UTC | #2
25/06/2018 04:49, Gavin Hu:
> From: gavin hu <gavin.hu@arm.com>
> 
> 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 gcc is older than 7.0, or the
> host cc compiler is clang, 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>

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

Patch

diff --git a/buildtools/pmdinfogen/Makefile b/buildtools/pmdinfogen/Makefile
index bf07b6f2e..ff7a5fae6 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 255c89677..1e4434fa9 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 7e4531bab..d8b99faf6 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