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 <tho...@monjalon.net> > Signed-off-by: Bruce Richardson <bruce.richard...@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?