[v3,3/5] net/mlx: workaround static linkage with meson

Message ID 20200211011942.1569573-4-thomas@monjalon.net (mailing list archive)
State Superseded, archived
Delegated to: Raslan Darawsheh
Headers
Series mlx ibverbs linking in meson |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail apply issues

Commit Message

Thomas Monjalon Feb. 11, 2020, 1:19 a.m. UTC
  If ibverbs_link is static and the application choose to link DPDK
as static libraries, both PMD and ibverbs libraries must be linked
as static libraries. And the dependencies of ibverbs (netlink) must
still be linked as shared libraries.

Unfortunately, meson forget about the static requirement for ibverbs
when generating the .pc file.
As a result, libibverbs, libmlx4, libmlx5 are listed in Requires.private
section (allowing to be linked as shared libraries) and libnl is missing.

A fix is in progress for meson, but anyway we will have to live without
such a fix until a better version of meson is widely available:
	https://github.com/mesonbuild/meson/pull/6393

In order to avoid meson suggesting shared libraries in the section
Requires.private of the .pc file, the dependency object is recreated
with declare_dependency():
	- cflags are extracted the libibverbs.pc
	- ldflags, from libibverbs.pc, are processed to force
	static flavor of ibverbs libraries, thanks to this syntax:
			-l:libfoo.a

Fixes: 83fff714bd27 ("net/mlx: add static ibverbs linkage with meson")

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 buildtools/meson.build          |  2 ++
 drivers/common/mlx5/meson.build | 12 +++++++++++-
 drivers/net/mlx4/meson.build    | 14 ++++++++++++--
 3 files changed, 25 insertions(+), 3 deletions(-)
  

Comments

Bruce Richardson Feb. 11, 2020, 11:29 a.m. UTC | #1
On Tue, Feb 11, 2020 at 02:19:40AM +0100, Thomas Monjalon wrote:
> If ibverbs_link is static and the application choose to link DPDK
> as static libraries, both PMD and ibverbs libraries must be linked
> as static libraries. And the dependencies of ibverbs (netlink) must
> still be linked as shared libraries.
> 
> Unfortunately, meson forget about the static requirement for ibverbs
> when generating the .pc file.
> As a result, libibverbs, libmlx4, libmlx5 are listed in Requires.private
> section (allowing to be linked as shared libraries) and libnl is missing.
> 
> A fix is in progress for meson, but anyway we will have to live without
> such a fix until a better version of meson is widely available:
> 	https://github.com/mesonbuild/meson/pull/6393
> 
> In order to avoid meson suggesting shared libraries in the section
> Requires.private of the .pc file, the dependency object is recreated
> with declare_dependency():
> 	- cflags are extracted the libibverbs.pc
> 	- ldflags, from libibverbs.pc, are processed to force
> 	static flavor of ibverbs libraries, thanks to this syntax:
> 			-l:libfoo.a
> 
> Fixes: 83fff714bd27 ("net/mlx: add static ibverbs linkage with meson")
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  buildtools/meson.build          |  2 ++
>  drivers/common/mlx5/meson.build | 12 +++++++++++-
>  drivers/net/mlx4/meson.build    | 14 ++++++++++++--
>  3 files changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/buildtools/meson.build b/buildtools/meson.build
> index 0f563d89a3..4e3541b0d7 100644
> --- a/buildtools/meson.build
> +++ b/buildtools/meson.build
> @@ -3,9 +3,11 @@
>  
>  subdir('pmdinfogen')
>  
> +pkgconf = find_program('pkg-config', 'pkgconf')
>  pmdinfo = find_program('gen-pmdinfo-cfile.sh')
>  list_dir_globs = find_program('list-dir-globs.py')
>  check_experimental_syms = find_program('check-experimental-syms.sh')
> +ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
>  
>  # set up map-to-def script using python, either built-in or external
>  python3 = import('python').find_installation(required: false)
> diff --git a/drivers/common/mlx5/meson.build b/drivers/common/mlx5/meson.build
> index f24e421bc3..bf04d16d76 100644
> --- a/drivers/common/mlx5/meson.build
> +++ b/drivers/common/mlx5/meson.build
> @@ -30,16 +30,26 @@ foreach libname:libnames
>  	endif
>  	if lib.found()
>  		libs += lib
> +		if not static_ibverbs
> +			ext_deps += lib
> +		endif
>  	else
>  		build = false
>  		reason = 'missing dependency, "' + libname + '"'
>  	endif
>  endforeach
> +if build and static_ibverbs
> +	# Build without adding shared libs to Requires.private
> +	ibv_cflags = run_command(pkgconf, '--cflags', 'libibverbs').stdout()
> +	ext_deps += declare_dependency(compile_args: ibv_cflags.split())
> +	# Add static deps ldflags to internal apps and Libs.private
> +	ibv_ldflags = run_command(ldflags_ibverbs_static, check:true).stdout()
> +	ext_deps += declare_dependency(link_args:ibv_ldflags.split())
> +endif
>  

Is there a reason for specfiying two dependencies, rather than putting both
cflags and ldflags into the one dependency object?
  
Thomas Monjalon Feb. 11, 2020, 11:36 a.m. UTC | #2
11/02/2020 12:29, Bruce Richardson:
> On Tue, Feb 11, 2020 at 02:19:40AM +0100, Thomas Monjalon wrote:
> > If ibverbs_link is static and the application choose to link DPDK
> > as static libraries, both PMD and ibverbs libraries must be linked
> > as static libraries. And the dependencies of ibverbs (netlink) must
> > still be linked as shared libraries.
> > 
> > Unfortunately, meson forget about the static requirement for ibverbs
> > when generating the .pc file.
> > As a result, libibverbs, libmlx4, libmlx5 are listed in Requires.private
> > section (allowing to be linked as shared libraries) and libnl is missing.
> > 
> > A fix is in progress for meson, but anyway we will have to live without
> > such a fix until a better version of meson is widely available:
> > 	https://github.com/mesonbuild/meson/pull/6393
> > 
> > In order to avoid meson suggesting shared libraries in the section
> > Requires.private of the .pc file, the dependency object is recreated
> > with declare_dependency():
> > 	- cflags are extracted the libibverbs.pc
> > 	- ldflags, from libibverbs.pc, are processed to force
> > 	static flavor of ibverbs libraries, thanks to this syntax:
> > 			-l:libfoo.a
> > 
> > Fixes: 83fff714bd27 ("net/mlx: add static ibverbs linkage with meson")
> > 
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > ---
> > +if build and static_ibverbs
> > +	# Build without adding shared libs to Requires.private
> > +	ibv_cflags = run_command(pkgconf, '--cflags', 'libibverbs').stdout()
> > +	ext_deps += declare_dependency(compile_args: ibv_cflags.split())
> > +	# Add static deps ldflags to internal apps and Libs.private
> > +	ibv_ldflags = run_command(ldflags_ibverbs_static, check:true).stdout()
> > +	ext_deps += declare_dependency(link_args:ibv_ldflags.split())
> > +endif
> 
> Is there a reason for specfiying two dependencies, rather than putting both
> cflags and ldflags into the one dependency object?

Yes, the reason is the patch for dlopen which needs cflags only.
  
Bruce Richardson Feb. 11, 2020, 11:43 a.m. UTC | #3
On Tue, Feb 11, 2020 at 12:36:06PM +0100, Thomas Monjalon wrote:
> 11/02/2020 12:29, Bruce Richardson:
> > On Tue, Feb 11, 2020 at 02:19:40AM +0100, Thomas Monjalon wrote:
> > > If ibverbs_link is static and the application choose to link DPDK
> > > as static libraries, both PMD and ibverbs libraries must be linked
> > > as static libraries. And the dependencies of ibverbs (netlink) must
> > > still be linked as shared libraries.
> > > 
> > > Unfortunately, meson forget about the static requirement for ibverbs
> > > when generating the .pc file.
> > > As a result, libibverbs, libmlx4, libmlx5 are listed in Requires.private
> > > section (allowing to be linked as shared libraries) and libnl is missing.
> > > 
> > > A fix is in progress for meson, but anyway we will have to live without
> > > such a fix until a better version of meson is widely available:
> > > 	https://github.com/mesonbuild/meson/pull/6393
> > > 
> > > In order to avoid meson suggesting shared libraries in the section
> > > Requires.private of the .pc file, the dependency object is recreated
> > > with declare_dependency():
> > > 	- cflags are extracted the libibverbs.pc
> > > 	- ldflags, from libibverbs.pc, are processed to force
> > > 	static flavor of ibverbs libraries, thanks to this syntax:
> > > 			-l:libfoo.a
> > > 
> > > Fixes: 83fff714bd27 ("net/mlx: add static ibverbs linkage with meson")
> > > 
> > > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > > ---
> > > +if build and static_ibverbs
> > > +	# Build without adding shared libs to Requires.private
> > > +	ibv_cflags = run_command(pkgconf, '--cflags', 'libibverbs').stdout()
> > > +	ext_deps += declare_dependency(compile_args: ibv_cflags.split())
> > > +	# Add static deps ldflags to internal apps and Libs.private
> > > +	ibv_ldflags = run_command(ldflags_ibverbs_static, check:true).stdout()
> > > +	ext_deps += declare_dependency(link_args:ibv_ldflags.split())
> > > +endif
> > 
> > Is there a reason for specfiying two dependencies, rather than putting both
> > cflags and ldflags into the one dependency object?
> 
> Yes, the reason is the patch for dlopen which needs cflags only.
> 
Ah, ok, thanks for clarifying.
  

Patch

diff --git a/buildtools/meson.build b/buildtools/meson.build
index 0f563d89a3..4e3541b0d7 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -3,9 +3,11 @@ 
 
 subdir('pmdinfogen')
 
+pkgconf = find_program('pkg-config', 'pkgconf')
 pmdinfo = find_program('gen-pmdinfo-cfile.sh')
 list_dir_globs = find_program('list-dir-globs.py')
 check_experimental_syms = find_program('check-experimental-syms.sh')
+ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
 
 # set up map-to-def script using python, either built-in or external
 python3 = import('python').find_installation(required: false)
diff --git a/drivers/common/mlx5/meson.build b/drivers/common/mlx5/meson.build
index f24e421bc3..bf04d16d76 100644
--- a/drivers/common/mlx5/meson.build
+++ b/drivers/common/mlx5/meson.build
@@ -30,16 +30,26 @@  foreach libname:libnames
 	endif
 	if lib.found()
 		libs += lib
+		if not static_ibverbs
+			ext_deps += lib
+		endif
 	else
 		build = false
 		reason = 'missing dependency, "' + libname + '"'
 	endif
 endforeach
+if build and static_ibverbs
+	# Build without adding shared libs to Requires.private
+	ibv_cflags = run_command(pkgconf, '--cflags', 'libibverbs').stdout()
+	ext_deps += declare_dependency(compile_args: ibv_cflags.split())
+	# Add static deps ldflags to internal apps and Libs.private
+	ibv_ldflags = run_command(ldflags_ibverbs_static, check:true).stdout()
+	ext_deps += declare_dependency(link_args:ibv_ldflags.split())
+endif
 
 if build
 	allow_experimental_apis = true
 	deps += ['hash', 'pci', 'net', 'eal', 'kvargs']
-	ext_deps += libs
 	sources = files(
 		'mlx5_devx_cmds.c',
 		'mlx5_common.c',
diff --git a/drivers/net/mlx4/meson.build b/drivers/net/mlx4/meson.build
index 8696f6ebdf..cf53a6b3e1 100644
--- a/drivers/net/mlx4/meson.build
+++ b/drivers/net/mlx4/meson.build
@@ -30,16 +30,26 @@  foreach libname:libnames
 		lib = cc.find_library(libname, required:false)
 	endif
 	if lib.found()
-		libs += [ lib ]
+		libs += lib
+		if not static_ibverbs
+			ext_deps += lib
+		endif
 	else
 		build = false
 		reason = 'missing dependency, "' + libname + '"'
 	endif
 endforeach
+if build and static_ibverbs
+	# Build without adding shared libs to Requires.private
+	ibv_cflags = run_command(pkgconf, '--cflags', 'libibverbs').stdout()
+	ext_deps += declare_dependency(compile_args: ibv_cflags.split())
+	# Add static deps ldflags to internal apps and Libs.private
+	ibv_ldflags = run_command(ldflags_ibverbs_static, check:true).stdout()
+	ext_deps += declare_dependency(link_args:ibv_ldflags.split())
+endif
 
 if build
 	allow_experimental_apis = true
-	ext_deps += libs
 	sources = files(
 		'mlx4.c',
 		'mlx4_ethdev.c',