[v2] build: add pkg-config validation
Checks
Commit Message
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 <getelson@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
Comments
On Mon, Nov 02, 2020 at 08:45:48AM +0200, Gregory Etelson wrote:
> 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 <getelson@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" \
Should the $pc_dir not be put first, in case there are older .pc files
around for DPDK?
Hello Bruce,
> -----Original Message-----
[snip]
> > +put it # next to --whole-archive.
> > +test1_static_libs_order () {
> > + PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:$pc_dir" \
>
> Should the $pc_dir not be put first, in case there are older .pc files
> around for DPDK?
I posted a v3 update for the patch.
PKG_CONFIG_PATH will be updated if pkgconf could not locate libdpdk.pc
@@ -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
new file mode 100755
@@ -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
+
@@ -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