DPDK relies on pkg-config(1) to provide correct parameters for compiler and linker used in application build. Inaccurate build parameters, produced by pkg-config from DPDK .pc files could fail application build or cause unpredicted results during application runtime.
This patch validates host pkg-config utility and notifies about known issues. Signed-off-by: Gregory Etelson <getel...@nvidia.com> --- buildtools/pkg-config/meson.build | 11 ++++++ buildtools/pkg-config/pkgconfig-validate.sh | 40 +++++++++++++++++++++ doc/guides/linux_gsg/sys_reqs.rst | 5 +++ 3 files changed, 56 insertions(+) create mode 100755 buildtools/pkg-config/pkgconfig-validate.sh diff --git a/buildtools/pkg-config/meson.build b/buildtools/pkg-config/meson.build index 5f19304289..4f907d7638 100644 --- a/buildtools/pkg-config/meson.build +++ b/buildtools/pkg-config/meson.build @@ -53,3 +53,14 @@ This is required for a number of static inline functions in the public headers.' # For static linking with dependencies as shared libraries, # the internal static libraries must be flagged explicitly. run_command(py3, 'set-static-linker-flags.py', check: true) + +pkgconf = find_program('pkg-config', 'pkgconf', required: false) +if (pkgconf.found()) + cmd = run_command('./pkgconfig-validate.sh', pkgconf.path(), + check:false) + if cmd.returncode() != 0 + version = run_command(pkgconf, '--version') + warning('invalid pkg-config version @0@'.format( + version.stdout().strip())) + endif +endif diff --git a/buildtools/pkg-config/pkgconfig-validate.sh b/buildtools/pkg-config/pkgconfig-validate.sh new file mode 100755 index 0000000000..61ddd6d5a3 --- /dev/null +++ b/buildtools/pkg-config/pkgconfig-validate.sh @@ -0,0 +1,40 @@ +#! /bin/sh +# SPDX-License-Identifier: BSD-3-Clause + +# Statically linked private DPDK objects of form +# -l:file.a must be positionned between --whole-archive … --no-whole-archive +# linker parameters. +# Old pkg-config versions misplace --no-whole-archive parameter and put it +# next to --whole-archive. +test1_static_libs_order () { + PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:$pc_dir" \ + "$PKGCONF" --libs --static libdpdk | \ + grep -q 'whole-archive.*l:lib.*no-whole-archive' + if test "$?" -ne 0 ; then + echo "WARNING: invalid static libraries order" + ret=1 + fi + return $ret +} + +if [ "$#" -ne 1 ]; then + echo "$0: no pkg-config parameter" + exit 1 +fi +PKGCONF="$1" + +# take the first result only +pc_file=$(find "$MESON_BUILD_ROOT" -type f -name 'libdpdk.pc' -print -quit) +if [ ! -f "$pc_file" ]; then + echo "$0: cannot locate libdpdk.pc" + exit 1 +fi +pc_dir=$(dirname "$pc_file") + +ret=0 + +test1_static_libs_order +if [ $ret -ne 0 ]; then + exit $ret +fi + diff --git a/doc/guides/linux_gsg/sys_reqs.rst b/doc/guides/linux_gsg/sys_reqs.rst index 6ecdc04aa9..b67da05e13 100644 --- a/doc/guides/linux_gsg/sys_reqs.rst +++ b/doc/guides/linux_gsg/sys_reqs.rst @@ -60,6 +60,11 @@ Compilation of the DPDK * Linux kernel headers or sources required to build kernel modules. + +**Known Issues:** + +* pkg-config v0.27 supplied with RHEL-7 does not process correctly libdpdk.pc Libs.private section. + .. note:: Please ensure that the latest patches are applied to third party libraries -- 2.28.0