[v5,04/17] build: define _GNU_SOURCE globally

Message ID 20210225182250.1149592-5-thomas@monjalon.net (mailing list archive)
State Superseded, archived
Headers
Series Alpine/musl build support |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Thomas Monjalon Feb. 25, 2021, 6:22 p.m. UTC
  There was an intent to define _GNU_SOURCE globally,
but it was not set in pkg-config for external applications.

The internal definition in config/meson.build is kept,
and one is added in buildtools/pkg-config/meson.build for external apps.
All other specific definitions of _GNU_SOURCE are removed.

Fixes: 5d7b673d5fd6 ("mk: build with _GNU_SOURCE defined by default")
Fixes: 28188cee2aa0 ("build: enable BSD features visibility for FreeBSD")
Cc: stable@dpdk.org

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 app/test/meson.build                              | 2 --
 buildtools/pkg-config/meson.build                 | 1 +
 drivers/bus/fslmc/qbman/include/compat.h          | 3 ---
 drivers/common/dpaax/compat.h                     | 4 ----
 drivers/common/dpaax/meson.build                  | 1 -
 drivers/net/memif/rte_eth_memif.h                 | 4 ----
 drivers/net/mlx5/linux/mlx5_socket.c              | 4 ----
 examples/ip_pipeline/Makefile                     | 2 +-
 examples/performance-thread/l3fwd-thread/main.c   | 4 ----
 examples/performance-thread/pthread_shim/Makefile | 1 -
 examples/pipeline/Makefile                        | 2 +-
 examples/vhost_blk/vhost_blk.c                    | 4 ----
 12 files changed, 3 insertions(+), 29 deletions(-)
  

Comments

Bruce Richardson Feb. 26, 2021, 9:08 a.m. UTC | #1
On Thu, Feb 25, 2021 at 07:22:37PM +0100, Thomas Monjalon wrote:
> There was an intent to define _GNU_SOURCE globally,
> but it was not set in pkg-config for external applications.
> 
Is this something that we really want to do, to force all external apps to
use _GNU_SOURCE when compiling? Do some of our header files rely on
definitions only available with _GNU_SOURCE? If so, we should probably look
to remove that dependency rather than mandating the define.
  
Thomas Monjalon Feb. 26, 2021, 9:40 a.m. UTC | #2
26/02/2021 10:08, Bruce Richardson:
> On Thu, Feb 25, 2021 at 07:22:37PM +0100, Thomas Monjalon wrote:
> > There was an intent to define _GNU_SOURCE globally,
> > but it was not set in pkg-config for external applications.
> > 
> Is this something that we really want to do, to force all external apps to
> use _GNU_SOURCE when compiling? Do some of our header files rely on
> definitions only available with _GNU_SOURCE? If so, we should probably look
> to remove that dependency rather than mandating the define.

From patch 5:
In musl libc, cpu_set_t is defined only if _GNU_SOURCE is defined.

If we avoid mandating _GNU_SOURCE,
we must #ifdef functions relying on rte_cpuset_t in the headers:
	- rte_lcore_cpuset
	- rte_thread_set_affinity
	- rte_thread_get_affinity
	- rte_telemetry_init (internal)
Or a different trick in linux/include/rte_os.h could be:
	typedef void rte_cpuset_t;
so it allows including files, but not using above functions of course.
  
Bruce Richardson Feb. 26, 2021, 9:46 a.m. UTC | #3
On Fri, Feb 26, 2021 at 10:40:32AM +0100, Thomas Monjalon wrote:
> 26/02/2021 10:08, Bruce Richardson:
> > On Thu, Feb 25, 2021 at 07:22:37PM +0100, Thomas Monjalon wrote:
> > > There was an intent to define _GNU_SOURCE globally,
> > > but it was not set in pkg-config for external applications.
> > > 
> > Is this something that we really want to do, to force all external apps to
> > use _GNU_SOURCE when compiling? Do some of our header files rely on
> > definitions only available with _GNU_SOURCE? If so, we should probably look
> > to remove that dependency rather than mandating the define.
> 
> From patch 5:
> In musl libc, cpu_set_t is defined only if _GNU_SOURCE is defined.
> 
> If we avoid mandating _GNU_SOURCE,
> we must #ifdef functions relying on rte_cpuset_t in the headers:
> 	- rte_lcore_cpuset
> 	- rte_thread_set_affinity
> 	- rte_thread_get_affinity
> 	- rte_telemetry_init (internal)
> Or a different trick in linux/include/rte_os.h could be:
> 	typedef void rte_cpuset_t;
> so it allows including files, but not using above functions of course.
> 
Can we just define _GNU_SOURCE in the header file with rte_cpuset_t?
  
Thomas Monjalon Feb. 26, 2021, 10:04 a.m. UTC | #4
26/02/2021 10:46, Bruce Richardson:
> On Fri, Feb 26, 2021 at 10:40:32AM +0100, Thomas Monjalon wrote:
> > 26/02/2021 10:08, Bruce Richardson:
> > > On Thu, Feb 25, 2021 at 07:22:37PM +0100, Thomas Monjalon wrote:
> > > > There was an intent to define _GNU_SOURCE globally,
> > > > but it was not set in pkg-config for external applications.
> > > > 
> > > Is this something that we really want to do, to force all external apps to
> > > use _GNU_SOURCE when compiling? Do some of our header files rely on
> > > definitions only available with _GNU_SOURCE? If so, we should probably look
> > > to remove that dependency rather than mandating the define.
> > 
> > From patch 5:
> > In musl libc, cpu_set_t is defined only if _GNU_SOURCE is defined.
> > 
> > If we avoid mandating _GNU_SOURCE,
> > we must #ifdef functions relying on rte_cpuset_t in the headers:
> > 	- rte_lcore_cpuset
> > 	- rte_thread_set_affinity
> > 	- rte_thread_get_affinity
> > 	- rte_telemetry_init (internal)
> > Or a different trick in linux/include/rte_os.h could be:
> > 	typedef void rte_cpuset_t;
> > so it allows including files, but not using above functions of course.
> > 
> Can we just define _GNU_SOURCE in the header file with rte_cpuset_t?

That would be the simplest solution yes :)
I don't really like defining such flag in a header file because
it impacts all code coming after the include.
It would mean all includes done after DPDK ones behave differently.

I vote for the trick:
#ifdef _GNU_SOURCE
	typedef cpu_set_t rte_cpuset_t;
#else
	typedef void rte_cpuset_t;
#endif

Opinions?
  
Thomas Monjalon Feb. 28, 2021, 12:53 p.m. UTC | #5
26/02/2021 11:04, Thomas Monjalon:
> 26/02/2021 10:46, Bruce Richardson:
> > On Fri, Feb 26, 2021 at 10:40:32AM +0100, Thomas Monjalon wrote:
> > > 26/02/2021 10:08, Bruce Richardson:
> > > > On Thu, Feb 25, 2021 at 07:22:37PM +0100, Thomas Monjalon wrote:
> > > > > There was an intent to define _GNU_SOURCE globally,
> > > > > but it was not set in pkg-config for external applications.
> > > > > 
> > > > Is this something that we really want to do, to force all external apps to
> > > > use _GNU_SOURCE when compiling? Do some of our header files rely on
> > > > definitions only available with _GNU_SOURCE? If so, we should probably look
> > > > to remove that dependency rather than mandating the define.
> > > 
> > > From patch 5:
> > > In musl libc, cpu_set_t is defined only if _GNU_SOURCE is defined.
> > > 
> > > If we avoid mandating _GNU_SOURCE,
> > > we must #ifdef functions relying on rte_cpuset_t in the headers:
> > > 	- rte_lcore_cpuset
> > > 	- rte_thread_set_affinity
> > > 	- rte_thread_get_affinity
> > > 	- rte_telemetry_init (internal)
> > > Or a different trick in linux/include/rte_os.h could be:
> > > 	typedef void rte_cpuset_t;
> > > so it allows including files, but not using above functions of course.
> > > 
> > Can we just define _GNU_SOURCE in the header file with rte_cpuset_t?
> 
> That would be the simplest solution yes :)
> I don't really like defining such flag in a header file because
> it impacts all code coming after the include.
> It would mean all includes done after DPDK ones behave differently.
> 
> I vote for the trick:
> #ifdef _GNU_SOURCE
> 	typedef cpu_set_t rte_cpuset_t;
> #else
> 	typedef void rte_cpuset_t;
> #endif
> 
> Opinions?

I changed my mind, I think it is saner to not export functions
which use rte_cpuset_t, if the type is not defined.
The type definition is detected thanks to CPU_SETSIZE
and a new definition is used inside DPDK: RTE_HAS_CPUSET.
I think it is more elegant and easier to debug.
I am sending a v6.
  

Patch

diff --git a/app/test/meson.build b/app/test/meson.build
index 099895fc87..76eaaea457 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -398,8 +398,6 @@  if cc.has_argument('-Wno-format-truncation')
     cflags += '-Wno-format-truncation'
 endif
 
-# specify -D_GNU_SOURCE unconditionally
-cflags += '-D_GNU_SOURCE'
 # Strict-aliasing rules are violated by uint8_t[] to context size casts.
 cflags += '-fno-strict-aliasing'
 
diff --git a/buildtools/pkg-config/meson.build b/buildtools/pkg-config/meson.build
index 39a8fd1c8e..d3f3edaa2f 100644
--- a/buildtools/pkg-config/meson.build
+++ b/buildtools/pkg-config/meson.build
@@ -3,6 +3,7 @@ 
 
 pkg = import('pkgconfig')
 pkg_extra_cflags = ['-include', 'rte_config.h'] + machine_args
+pkg_extra_cflags += '-D_GNU_SOURCE'
 if is_freebsd
 	pkg_extra_cflags += ['-D__BSD_VISIBLE']
 endif
diff --git a/drivers/bus/fslmc/qbman/include/compat.h b/drivers/bus/fslmc/qbman/include/compat.h
index 1ddd69e127..a4471a80af 100644
--- a/drivers/bus/fslmc/qbman/include/compat.h
+++ b/drivers/bus/fslmc/qbman/include/compat.h
@@ -8,9 +8,6 @@ 
 #ifndef HEADER_COMPAT_H
 #define HEADER_COMPAT_H
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
diff --git a/drivers/common/dpaax/compat.h b/drivers/common/dpaax/compat.h
index 1a5f36e99e..c69e76ab96 100644
--- a/drivers/common/dpaax/compat.h
+++ b/drivers/common/dpaax/compat.h
@@ -10,10 +10,6 @@ 
 #define __COMPAT_H
 
 #include <sched.h>
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
 #include <stdint.h>
 #include <stdlib.h>
 #include <stddef.h>
diff --git a/drivers/common/dpaax/meson.build b/drivers/common/dpaax/meson.build
index 4535482701..b7f177a62e 100644
--- a/drivers/common/dpaax/meson.build
+++ b/drivers/common/dpaax/meson.build
@@ -10,7 +10,6 @@  sources = files('dpaax_iova_table.c', 'dpaa_of.c', 'caamflib.c')
 
 includes += include_directories('caamflib')
 
-cflags += ['-D_GNU_SOURCE']
 if cc.has_argument('-Wno-cast-qual')
 	cflags += '-Wno-cast-qual'
 endif
diff --git a/drivers/net/memif/rte_eth_memif.h b/drivers/net/memif/rte_eth_memif.h
index 24321d3a39..2038bda742 100644
--- a/drivers/net/memif/rte_eth_memif.h
+++ b/drivers/net/memif/rte_eth_memif.h
@@ -5,10 +5,6 @@ 
 #ifndef _RTE_ETH_MEMIF_H_
 #define _RTE_ETH_MEMIF_H_
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif				/* GNU_SOURCE */
-
 #include <sys/queue.h>
 
 #include <ethdev_driver.h>
diff --git a/drivers/net/mlx5/linux/mlx5_socket.c b/drivers/net/mlx5/linux/mlx5_socket.c
index 1938453980..b1f41bc102 100644
--- a/drivers/net/mlx5/linux/mlx5_socket.c
+++ b/drivers/net/mlx5/linux/mlx5_socket.c
@@ -2,10 +2,6 @@ 
  * Copyright 2019 Mellanox Technologies, Ltd
  */
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/un.h>
diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile
index 96f492a5ea..7933ad7519 100644
--- a/examples/ip_pipeline/Makefile
+++ b/examples/ip_pipeline/Makefile
@@ -47,7 +47,7 @@  $(error "Cannot generate statically-linked binaries with this version of pkg-con
 endif
 endif
 
-CFLAGS += -I. -DALLOW_EXPERIMENTAL_API -D_GNU_SOURCE
+CFLAGS += -I. -DALLOW_EXPERIMENTAL_API
 
 OBJS := $(patsubst %.c,build/%.o,$(SRCS-y))
 
diff --git a/examples/performance-thread/l3fwd-thread/main.c b/examples/performance-thread/l3fwd-thread/main.c
index 4d82fb82ef..10bd33d767 100644
--- a/examples/performance-thread/l3fwd-thread/main.c
+++ b/examples/performance-thread/l3fwd-thread/main.c
@@ -2,10 +2,6 @@ 
  * Copyright(c) 2010-2016 Intel Corporation
  */
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
diff --git a/examples/performance-thread/pthread_shim/Makefile b/examples/performance-thread/pthread_shim/Makefile
index 5aa401dc49..a1f4557cd4 100644
--- a/examples/performance-thread/pthread_shim/Makefile
+++ b/examples/performance-thread/pthread_shim/Makefile
@@ -18,7 +18,6 @@  endif
 endif
 
 CFLAGS += -DALLOW_EXPERIMENTAL_API
-CFLAGS += -D_GNU_SOURCE
 LDFLAGS += "-Wl,--copy-dt-needed-entries"
 
 # Build using pkg-config variables if possible
diff --git a/examples/pipeline/Makefile b/examples/pipeline/Makefile
index fcba51fd4d..92caf4aeb2 100644
--- a/examples/pipeline/Makefile
+++ b/examples/pipeline/Makefile
@@ -38,7 +38,7 @@  $(error "Cannot generate statically-linked binaries with this version of pkg-con
 endif
 endif
 
-CFLAGS += -I. -DALLOW_EXPERIMENTAL_API -D_GNU_SOURCE
+CFLAGS += -I. -DALLOW_EXPERIMENTAL_API
 
 OBJS := $(patsubst %.c,build/%.o,$(SRCS-y))
 
diff --git a/examples/vhost_blk/vhost_blk.c b/examples/vhost_blk/vhost_blk.c
index 7ea60863da..e9361267a6 100644
--- a/examples/vhost_blk/vhost_blk.c
+++ b/examples/vhost_blk/vhost_blk.c
@@ -2,12 +2,8 @@ 
  * Copyright(c) 2010-2019 Intel Corporation
  */
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
 #include <pthread.h>
 #include <sched.h>
-
 #include <stdint.h>
 #include <unistd.h>
 #include <stdbool.h>