diff mbox series

[v2,1/1] package/kismet: fix build with gcc >= 9

Message ID 20200824182121.1929324-1-fontaine.fabrice@gmail.com
State New
Headers show
Series [v2,1/1] package/kismet: fix build with gcc >= 9 | expand

Commit Message

Fabrice Fontaine Aug. 24, 2020, 6:21 p.m. UTC
kismet fails to build with gcc >= 9 on:

In file included from /home/buildroot/autobuild/instance-3/output-1/host/xtensa-buildroot-linux-uclibc/sysroot/usr/include/sys/socket.h:39,
                 from ipc_remote.h:61,
                 from ipc_remote.cc:34:
/home/buildroot/autobuild/instance-3/output-1/host/xtensa-buildroot-linux-uclibc/sysroot/usr/include/bits/socket.h:289:33: error: flexible array member 'cmsghdr::__cmsg_data' not at end of 'struct<unnamed>'
  289 |     __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
      |                                 ^~~~~~~~~~~

Adding -std=c++11 fix the build and can be removed as soon as kismet is
bumped to latest version as the offending code has been removed. It
should be noted that kismet builds fine with gcc 8 so it remains unclear
why this build failure is raised only with gcc >= 9 (build failure
confirmed with gcc 9 and 10)

Fixes:
 - http://autobuild.buildroot.org/results/85f7c746ae1cc19f8839f892f0c280dcb0444ea9

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
---
Changes v1 -> v2 (after review of Thomas Petazzoni):
 - Drop incorrect patch and use -std=c++11

 package/kismet/kismet.mk | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Thomas Petazzoni Aug. 26, 2020, 9:35 p.m. UTC | #1
On Mon, 24 Aug 2020 20:21:21 +0200
Fabrice Fontaine <fontaine.fabrice@gmail.com> wrote:

> Adding -std=c++11 fix the build and can be removed as soon as kismet is
> bumped to latest version as the offending code has been removed. It
> should be noted that kismet builds fine with gcc 8 so it remains unclear
> why this build failure is raised only with gcc >= 9 (build failure
> confirmed with gcc 9 and 10)

Meh, this looks weird :/

bits/socket.h defines the field like this:

#if __glibc_c99_flexarr_available
    __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
#endif

and __glibc_c99_flexarr_available is defined as follows:

/* Support for flexible arrays.
   Headers that should use flexible arrays only if they're "real"
   (e.g. only if they won't affect sizeof()) should test
   #if __glibc_c99_flexarr_available.  */
#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
# define __flexarr      []
# define __glibc_c99_flexarr_available 1
#elif __GNUC_PREREQ (2,97)
/* GCC 2.97 supports C99 flexible array members as an extension,
   even when in C89 mode or compiling C++ (any version).  */
# define __flexarr      []
# define __glibc_c99_flexarr_available 1
#elif defined __GNUC__
/* Pre-2.97 GCC did not support C99 flexible arrays but did have
   an equivalent extension with slightly different notation.  */
# define __flexarr      [0]
# define __glibc_c99_flexarr_available 1
#else
/* Some other non-C99 compiler.  Approximate with [1].  */
# define __flexarr      [1]
# define __glibc_c99_flexarr_available 0
#endif

Some it's really unclear how -std=c++11 can fix the issue.

Could you have a look at which of those #if case we fall into in the
different cases (between gcc 8.x and gcc 9.x, with/without -std=c++11) ?

Thanks!

Thomas
Thomas Petazzoni Sept. 3, 2020, 8:47 p.m. UTC | #2
Hello Fabrice,

Do you have some further research/feedback on the below questions ?

Thanks!

Thomas

On Wed, 26 Aug 2020 23:35:30 +0200
Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:

> On Mon, 24 Aug 2020 20:21:21 +0200
> Fabrice Fontaine <fontaine.fabrice@gmail.com> wrote:
> 
> > Adding -std=c++11 fix the build and can be removed as soon as kismet is
> > bumped to latest version as the offending code has been removed. It
> > should be noted that kismet builds fine with gcc 8 so it remains unclear
> > why this build failure is raised only with gcc >= 9 (build failure
> > confirmed with gcc 9 and 10)  
> 
> Meh, this looks weird :/
> 
> bits/socket.h defines the field like this:
> 
> #if __glibc_c99_flexarr_available
>     __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
> #endif
> 
> and __glibc_c99_flexarr_available is defined as follows:
> 
> /* Support for flexible arrays.
>    Headers that should use flexible arrays only if they're "real"
>    (e.g. only if they won't affect sizeof()) should test
>    #if __glibc_c99_flexarr_available.  */
> #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
> # define __flexarr      []
> # define __glibc_c99_flexarr_available 1
> #elif __GNUC_PREREQ (2,97)
> /* GCC 2.97 supports C99 flexible array members as an extension,
>    even when in C89 mode or compiling C++ (any version).  */
> # define __flexarr      []
> # define __glibc_c99_flexarr_available 1
> #elif defined __GNUC__
> /* Pre-2.97 GCC did not support C99 flexible arrays but did have
>    an equivalent extension with slightly different notation.  */
> # define __flexarr      [0]
> # define __glibc_c99_flexarr_available 1
> #else
> /* Some other non-C99 compiler.  Approximate with [1].  */
> # define __flexarr      [1]
> # define __glibc_c99_flexarr_available 0
> #endif
> 
> Some it's really unclear how -std=c++11 can fix the issue.
> 
> Could you have a look at which of those #if case we fall into in the
> different cases (between gcc 8.x and gcc 9.x, with/without -std=c++11) ?
> 
> Thanks!
> 
> Thomas
diff mbox series

Patch

diff --git a/package/kismet/kismet.mk b/package/kismet/kismet.mk
index d3946d65f3..49ec6d1467 100644
--- a/package/kismet/kismet.mk
+++ b/package/kismet/kismet.mk
@@ -17,6 +17,11 @@  KISMET_AUTORECONF = YES
 
 KISMET_CXXFLAGS = $(TARGET_CXXFLAGS)
 
+# flexible array member 'cmsghdr::__cmsg_data' not at end of 'struct<unnamed>'
+ifeq ($(BR2_TOOLCHAIN_GCC_AT_LEAST_9),y)
+KISMET_CXXFLAGS += -std=c++11
+endif
+
 ifeq ($(BR2_TOOLCHAIN_HAS_GCC_BUG_85180),y)
 KISMET_CXXFLAGS += -O0
 endif