[dpdk-dev] [PATCH v5 4/6] net/mlx: workaround static linkage with meson

Thomas Monjalon thomas at monjalon.net
Wed Feb 12 23:07:06 CET 2020


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 at monjalon.net>
Signed-off-by: Bruce Richardson <bruce.richardson at 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..9812917e50 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -3,9 +3,11 @@
 
 subdir('pmdinfogen')
 
+pkgconf = find_program('pkg-config', 'pkgconf', required: false)
 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 47ae1b65c2..4e987ed277 100644
--- a/drivers/common/mlx5/meson.build
+++ b/drivers/common/mlx5/meson.build
@@ -29,16 +29,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 + '"'
 		subdir_done()
 	endif
 endforeach
+if 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
 
 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 7513516764..290bd1e268 100644
--- a/drivers/net/mlx4/meson.build
+++ b/drivers/net/mlx4/meson.build
@@ -29,16 +29,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 + '"'
 		subdir_done()
 	endif
 endforeach
+if 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
 
 allow_experimental_apis = true
-ext_deps += libs
 sources = files(
 	'mlx4.c',
 	'mlx4_ethdev.c',
-- 
2.25.0



More information about the dev mailing list