DPDK patches and discussions
 help / color / mirror / Atom feed
From: Bruce Richardson <bruce.richardson@intel.com>
To: dev@dpdk.org
Cc: Bruce Richardson <bruce.richardson@intel.com>,
	Nicolas Chautru <nicolas.chautru@intel.com>,
	Dariusz Sosnowski <dsosnowski@nvidia.com>,
	Viacheslav Ovsiienko <viacheslavo@nvidia.com>,
	Bing Zhao <bingz@nvidia.com>, Ori Kam <orika@nvidia.com>,
	Suanming Mou <suanmingm@nvidia.com>,
	Matan Azrad <matan@nvidia.com>,
	Srikanth Yalavarthi <syalavarthi@marvell.com>,
	Ciara Loftus <ciara.loftus@intel.com>,
	Maryam Tahhan <mtahhan@redhat.com>,
	Long Li <longli@microsoft.com>, Wei Hu <weh@microsoft.com>,
	Anatoly Burakov <anatoly.burakov@intel.com>,
	David Hunt <david.hunt@intel.com>,
	Sivaprasad Tummala <sivaprasad.tummala@amd.com>,
	Rosen Xu <rosen.xu@altera.com>,
	Tomasz Kantecki <tomasz.kantecki@intel.com>,
	Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,
	Tyler Retzlaff <roretzla@linux.microsoft.com>
Subject: [PATCH v2] build: validate libraries returned from meson find function
Date: Wed, 24 Sep 2025 11:54:00 +0100	[thread overview]
Message-ID: <20250924111318.567771-1-bruce.richardson@intel.com> (raw)
In-Reply-To: <20250923165830.527416-1-bruce.richardson@intel.com>

The meson find_library() API call sometimes finds a library that is
actually incompatible with the current build, for example, returning a
64-bit library when doing a 32-bit build. To avoid problems with this,
check each library returned from a find_library() call and treat the
library as unfound if its incompatible.

This checking is not necessary (or should not be necessary) for
dependencies got using pkg-config, since the .pc files for each build
type are stored in a different directory on the system.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
v2: expanded the scope of the patch from just fixing the one instance
    I hit, to changing things globally to try and avoid any future issues.
---
 config/meson.build                            | 15 ++++++----
 drivers/baseband/acc/meson.build              | 30 +++++++++++++++----
 drivers/baseband/turbo_sw/meson.build         | 30 +++++++++++++++----
 drivers/common/mlx5/linux/meson.build         |  4 +--
 drivers/common/mlx5/windows/meson.build       |  2 +-
 drivers/ml/cnxk/meson.build                   |  6 +++-
 drivers/net/af_xdp/meson.build                |  3 ++
 drivers/net/mana/meson.build                  |  2 +-
 drivers/net/mlx4/meson.build                  |  2 +-
 drivers/net/pcap/meson.build                  |  6 +++-
 drivers/power/amd_uncore/meson.build          |  2 +-
 drivers/raw/ifpga/meson.build                 |  2 +-
 examples/l2fwd-cat/meson.build                |  2 +-
 examples/l2fwd-keepalive/meson.build          |  2 +-
 .../vm_power_manager/guest_cli/meson.build    |  2 +-
 examples/vm_power_manager/meson.build         |  2 +-
 lib/eal/windows/meson.build                   | 24 +++++++++++----
 meson.build                                   |  3 ++
 18 files changed, 105 insertions(+), 34 deletions(-)

diff --git a/config/meson.build b/config/meson.build
index 55497f0bf5..bb8d475ec8 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -208,7 +208,8 @@ if not is_windows
 endif
 
 # on some OS, maths functions are in a separate library
-if cc.find_library('m', required : false).found()
+math_dep = cc.find_library('m', required : false)
+if math_dep.found() and cc.links(min_c_code, dependencies: math_dep)
     # some libs depend on maths lib
     add_project_link_arguments('-lm', language: 'c')
     dpdk_extra_ldflags += '-lm'
@@ -235,7 +236,7 @@ if meson.is_cross_build() and not meson.get_external_property('numa', true)
 endif
 if find_libnuma
     numa_dep = cc.find_library('numa', required: false)
-    if numa_dep.found() and cc.has_header('numaif.h')
+    if numa_dep.found() and cc.has_header('numaif.h') and cc.links(min_c_code, dependencies: numa_dep)
         dpdk_conf.set10('RTE_HAS_LIBNUMA', true)
         has_libnuma = true
         add_project_link_arguments('-lnuma', language: 'c')
@@ -245,7 +246,7 @@ endif
 
 has_libfdt = false
 fdt_dep = cc.find_library('fdt', required: false)
-if fdt_dep.found() and cc.has_header('fdt.h')
+if fdt_dep.found() and cc.has_header('fdt.h') and cc.links(min_c_code, dependencies: fdt_dep)
     dpdk_conf.set10('RTE_HAS_LIBFDT', true)
     has_libfdt = true
     add_project_link_arguments('-lfdt', language: 'c')
@@ -253,7 +254,7 @@ if fdt_dep.found() and cc.has_header('fdt.h')
 endif
 
 libexecinfo = cc.find_library('execinfo', required: false)
-if libexecinfo.found()
+if libexecinfo.found() and cc.links(min_c_code, dependencies: libexecinfo)
     add_project_link_arguments('-lexecinfo', language: 'c')
     dpdk_extra_ldflags += '-lexecinfo'
 endif
@@ -288,7 +289,8 @@ if not pcap_dep.found()
     # pcap got a pkg-config file only in 1.9.0
     pcap_dep = cc.find_library(pcap_lib, required: false)
 endif
-if pcap_dep.found() and cc.has_header('pcap.h', dependencies: pcap_dep)
+if (pcap_dep.found() and cc.has_header('pcap.h', dependencies: pcap_dep)
+        and cc.links(min_c_code, dependencies: pcap_dep))
     dpdk_conf.set('RTE_HAS_LIBPCAP', 1)
     dpdk_extra_ldflags += '-l@0@'.format(pcap_lib)
 endif
@@ -296,6 +298,9 @@ endif
 # for clang 32-bit compiles we need libatomic for 64-bit atomic ops
 if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false
     atomic_dep = cc.find_library('atomic', required: true)
+    if not cc.links(min_c_code, dependencies: atomic_dep)
+        error('broken dependency, "libatomic"')
+    endif
     add_project_link_arguments('-latomic', language: 'c')
     dpdk_extra_ldflags += '-latomic'
 endif
diff --git a/drivers/baseband/acc/meson.build b/drivers/baseband/acc/meson.build
index 64fcf1537a..4e6d715d7c 100644
--- a/drivers/baseband/acc/meson.build
+++ b/drivers/baseband/acc/meson.build
@@ -5,11 +5,31 @@
 dep_dec5g = dependency('flexran_sdk_ldpc_decoder_5gnr', required: false)
 
 if dep_dec5g.found()
-    ext_deps += cc.find_library('stdc++', required: true)
-    ext_deps += cc.find_library('irc', required: true)
-    ext_deps += cc.find_library('imf', required: true)
-    ext_deps += cc.find_library('ipps', required: true)
-    ext_deps += cc.find_library('svml', required: true)
+    stdcpp_dep = cc.find_library('stdc++', required: true)
+    if not cc.links(min_c_code, dependencies: stdcpp_dep)
+        error('broken dependency, "libstdc++"')
+    endif
+    ext_deps += stdcpp_dep
+    irc_dep = cc.find_library('irc', required: true)
+    if not cc.links(min_c_code, dependencies: irc_dep)
+        error('broken dependency, "libirc"')
+    endif
+    ext_deps += irc_dep
+    imf_dep = cc.find_library('imf', required: true)
+    if not cc.links(min_c_code, dependencies: imf_dep)
+        error('broken dependency, "libimf"')
+    endif
+    ext_deps += imf_dep
+    ipps_dep = cc.find_library('ipps', required: true)
+    if not cc.links(min_c_code, dependencies: ipps_dep)
+        error('broken dependency, "libipps"')
+    endif
+    ext_deps += ipps_dep
+    svml_dep = cc.find_library('svml', required: true)
+    if not cc.links(min_c_code, dependencies: svml_dep)
+        error('broken dependency, "libsvml"')
+    endif
+    ext_deps += svml_dep
     ext_deps += dep_dec5g
     ext_deps += dependency('flexran_sdk_ldpc_encoder_5gnr', required: true)
     ext_deps += dependency('flexran_sdk_LDPC_ratematch_5gnr', required: true)
diff --git a/drivers/baseband/turbo_sw/meson.build b/drivers/baseband/turbo_sw/meson.build
index a9035a753e..5fd5e41c69 100644
--- a/drivers/baseband/turbo_sw/meson.build
+++ b/drivers/baseband/turbo_sw/meson.build
@@ -6,11 +6,31 @@ dep_turbo = dependency('flexran_sdk_turbo', required: false)
 dep_dec5g = dependency('flexran_sdk_ldpc_decoder_5gnr', required: false)
 
 if dep_turbo.found()
-    ext_deps += cc.find_library('stdc++', required: true)
-    ext_deps += cc.find_library('irc', required: true)
-    ext_deps += cc.find_library('imf', required: true)
-    ext_deps += cc.find_library('ipps', required: true)
-    ext_deps += cc.find_library('svml', required: true)
+    stdcpp_dep = cc.find_library('stdc++', required: true)
+    if not cc.links(min_c_code, dependencies: stdcpp_dep)
+        error('broken dependency, "libstdc++"')
+    endif
+    ext_deps += stdcpp_dep
+    irc_dep = cc.find_library('irc', required: true)
+    if not cc.links(min_c_code, dependencies: irc_dep)
+        error('broken dependency, "libirc"')
+    endif
+    ext_deps += irc_dep
+    imf_dep = cc.find_library('imf', required: true)
+    if not cc.links(min_c_code, dependencies: imf_dep)
+        error('broken dependency, "libimf"')
+    endif
+    ext_deps += imf_dep
+    ipps_dep = cc.find_library('ipps', required: true)
+    if not cc.links(min_c_code, dependencies: ipps_dep)
+        error('broken dependency, "libipps"')
+    endif
+    ext_deps += ipps_dep
+    svml_dep = cc.find_library('svml', required: true)
+    if not cc.links(min_c_code, dependencies: svml_dep)
+        error('broken dependency, "libsvml"')
+    endif
+    ext_deps += svml_dep
     ext_deps += dep_turbo
     ext_deps += dependency('flexran_sdk_crc', required: true)
     ext_deps += dependency('flexran_sdk_rate_matching', required: true)
diff --git a/drivers/common/mlx5/linux/meson.build b/drivers/common/mlx5/linux/meson.build
index 5548a56199..3fe7db7ec4 100644
--- a/drivers/common/mlx5/linux/meson.build
+++ b/drivers/common/mlx5/linux/meson.build
@@ -23,7 +23,7 @@ foreach libname:libnames
     if not lib.found() and not static_ibverbs
         lib = cc.find_library(libname, required:false)
     endif
-    if lib.found()
+    if lib.found() and cc.links(min_c_code, dependencies: lib)
         libs += lib
         if not static_ibverbs and not dlopen_ibverbs
             ext_deps += lib
@@ -47,7 +47,7 @@ endif
 
 libmtcr_ul_found = false
 lib = cc.find_library('mtcr_ul', required:false)
-if lib.found()
+if lib.found() and cc.links(min_c_code, dependencies: lib)
     libmtcr_ul_found = true
     ext_deps += lib
 endif
diff --git a/drivers/common/mlx5/windows/meson.build b/drivers/common/mlx5/windows/meson.build
index c3bd3aac26..f454788a9f 100644
--- a/drivers/common/mlx5/windows/meson.build
+++ b/drivers/common/mlx5/windows/meson.build
@@ -8,7 +8,7 @@ if not cc.has_header('mlx5devx.h')
 endif
 
 devxlib = cc.find_library('mlx5devx', required: false)
-if not devxlib.found()
+if not devxlib.found() or not cc.links(min_c_code, dependencies: devxlib)
     build = false
     reason = 'missing dependency, "mlx5devx"'
     subdir_done()
diff --git a/drivers/ml/cnxk/meson.build b/drivers/ml/cnxk/meson.build
index 0680a0faa5..ef7e21d747 100644
--- a/drivers/ml/cnxk/meson.build
+++ b/drivers/ml/cnxk/meson.build
@@ -72,7 +72,11 @@ ext_deps += dlpack_dep
 ext_deps += dmlc_dep
 ext_deps += tvm_dep
 ext_deps += tvmdp_dep
-ext_deps += cc.find_library('stdc++', required: true)
+stdcpp_dep = cc.find_library('stdc++', required: true)
+if not cc.links(min_c_code, dependencies: stdcpp_dep)
+    error('broken dependency, "libstdc++"')
+endif
+ext_deps += stdcpp_dep
 
 deps += ['bus_vdev']
 
diff --git a/drivers/net/af_xdp/meson.build b/drivers/net/af_xdp/meson.build
index 2d37bcc869..b35888b869 100644
--- a/drivers/net/af_xdp/meson.build
+++ b/drivers/net/af_xdp/meson.build
@@ -20,6 +20,9 @@ xdp_dep = dependency('libxdp', version : libxdp_ver, required: false, method: 'p
 bpf_dep = dependency('libbpf', required: false, method: 'pkg-config')
 if not bpf_dep.found()
     bpf_dep = cc.find_library('bpf', required: false)
+    if bpf_dep.found() and not cc.links(min_c_code, dependencies: bpf_dep)
+        bpf_dep = disabler()
+    endif
 endif
 
 cflags += no_wvla_cflag
diff --git a/drivers/net/mana/meson.build b/drivers/net/mana/meson.build
index e320da7fc4..19d4b3695e 100644
--- a/drivers/net/mana/meson.build
+++ b/drivers/net/mana/meson.build
@@ -27,7 +27,7 @@ foreach libname:libnames
     if not lib.found()
         lib = cc.find_library(libname, required:false)
     endif
-    if lib.found()
+    if lib.found() and cc.links(min_c_code, dependencies: lib)
         libs += lib
         ext_deps += lib
     else
diff --git a/drivers/net/mlx4/meson.build b/drivers/net/mlx4/meson.build
index 869d2895c8..1eb67f3c47 100644
--- a/drivers/net/mlx4/meson.build
+++ b/drivers/net/mlx4/meson.build
@@ -31,7 +31,7 @@ foreach libname:libnames
     if not lib.found() and not static_ibverbs
         lib = cc.find_library(libname, required:false)
     endif
-    if lib.found()
+    if lib.found() and cc.links(min_c_code, dependencies: lib)
         libs += lib
         if not static_ibverbs and not dlopen_ibverbs
             ext_deps += lib
diff --git a/drivers/net/pcap/meson.build b/drivers/net/pcap/meson.build
index 676c55018e..f30fc8338b 100644
--- a/drivers/net/pcap/meson.build
+++ b/drivers/net/pcap/meson.build
@@ -13,7 +13,11 @@ sources = files(
 
 ext_deps += pcap_dep
 if is_windows
-    ext_deps += cc.find_library('iphlpapi', required: true)
+    iphlpapi_dep = cc.find_library('iphlpapi', required: true)
+    if not cc.links(min_c_code, dependencies: iphlpapi_dep)
+        error('broken dependency, "iphlpapi"')
+    endif
+    ext_deps += iphlpapi_dep
 endif
 
 require_iova_in_mbuf = false
diff --git a/drivers/power/amd_uncore/meson.build b/drivers/power/amd_uncore/meson.build
index 8cbab47b01..cab260b64e 100644
--- a/drivers/power/amd_uncore/meson.build
+++ b/drivers/power/amd_uncore/meson.build
@@ -9,7 +9,7 @@ endif
 
 ESMI_header = '#include<e_smi/e_smi.h>'
 lib = cc.find_library('e_smi64', required: false)
-if not lib.found()
+if not lib.found() or not cc.links(min_c_code, dependencies: lib)
     build = false
     reason = 'missing dependency, "libe_smi"'
 else
diff --git a/drivers/raw/ifpga/meson.build b/drivers/raw/ifpga/meson.build
index 4295ec04bd..395894af2a 100644
--- a/drivers/raw/ifpga/meson.build
+++ b/drivers/raw/ifpga/meson.build
@@ -11,7 +11,7 @@ rtdep = dependency('librt', required: false)
 if not rtdep.found()
     rtdep = cc.find_library('rt', required: false)
 endif
-if not rtdep.found()
+if not rtdep.found() or not cc.links(min_c_code, dependencies: rtdep)
     build = false
     reason = 'missing dependency, "librt"'
     subdir_done()
diff --git a/examples/l2fwd-cat/meson.build b/examples/l2fwd-cat/meson.build
index ebcc3f66f2..5e8ff3a56c 100644
--- a/examples/l2fwd-cat/meson.build
+++ b/examples/l2fwd-cat/meson.build
@@ -7,7 +7,7 @@
 # DPDK instance, use 'make'
 
 pqos = cc.find_library('pqos', required: false)
-build = pqos.found()
+build = (pqos.found() and cc.links(min_c_code, dependencies: pqos))
 if not build
     subdir_done()
 endif
diff --git a/examples/l2fwd-keepalive/meson.build b/examples/l2fwd-keepalive/meson.build
index ed49c61238..e3f72aedb8 100644
--- a/examples/l2fwd-keepalive/meson.build
+++ b/examples/l2fwd-keepalive/meson.build
@@ -8,7 +8,7 @@
 
 allow_experimental_apis = true
 librt = cc.find_library('rt', required: false)
-if not librt.found()
+if not librt.found() or not cc.links(min_c_code, dependencies: librt)
     build = false
     subdir_done()
 endif
diff --git a/examples/vm_power_manager/guest_cli/meson.build b/examples/vm_power_manager/guest_cli/meson.build
index 00bc32526d..6a6809240e 100644
--- a/examples/vm_power_manager/guest_cli/meson.build
+++ b/examples/vm_power_manager/guest_cli/meson.build
@@ -17,5 +17,5 @@ sources = files(
 allow_experimental_apis = true
 
 opt_dep = cc.find_library('virt', required : false)
-build = opt_dep.found()
+build = (opt_dep.found() and cc.links(min_c_code, dependencies: opt_dep))
 ext_deps += opt_dep
diff --git a/examples/vm_power_manager/meson.build b/examples/vm_power_manager/meson.build
index dcf23198eb..53949ce6d8 100644
--- a/examples/vm_power_manager/meson.build
+++ b/examples/vm_power_manager/meson.build
@@ -38,7 +38,7 @@ else
 endif
 
 opt_dep = cc.find_library('virt', required : false)
-build = opt_dep.found()
+build = (opt_dep.found() and cc.links(min_c_code, dependencies: opt_dep))
 ext_deps += opt_dep
 
 opt_dep = dependency('jansson', required : false, method: 'pkg-config')
diff --git a/lib/eal/windows/meson.build b/lib/eal/windows/meson.build
index c526ede405..afa029d1fc 100644
--- a/lib/eal/windows/meson.build
+++ b/lib/eal/windows/meson.build
@@ -24,12 +24,24 @@ sources += files(
 
 dpdk_conf.set10('RTE_EAL_NUMA_AWARE_HUGEPAGES', true)
 
-ext_deps += [
-        cc.find_library('dbghelp'),
-        cc.find_library('setupapi'),
-        cc.find_library('ws2_32'),
-]
+dbghelp_dep = cc.find_library('dbghelp')
+if not cc.links(min_c_code, dependencies: dbghelp_dep)
+    error('broken dependency, "dbghelp"')
+endif
+setupapi_dep = cc.find_library('setupapi')
+if not cc.links(min_c_code, dependencies: setupapi_dep)
+    error('broken dependency, "setupapi"')
+endif
+ws2_32_dep = cc.find_library('ws2_32')
+if not cc.links(min_c_code, dependencies: ws2_32_dep)
+    error('broken dependency, "ws2_32"')
+endif
+ext_deps += [dbghelp_dep, setupapi_dep, ws2_32_dep]
 if is_ms_linker
         # Contrary to docs, VirtualAlloc2() is exported by mincore.lib.
-        ext_deps += cc.find_library('mincore')
+        mincore_dep = cc.find_library('mincore')
+        if not cc.links(min_c_code, dependencies: mincore_dep)
+            error('broken dependency, "mincore"')
+        endif
+        ext_deps += mincore_dep
 endif
diff --git a/meson.build b/meson.build
index 2423884df7..fcf3d79a3d 100644
--- a/meson.build
+++ b/meson.build
@@ -51,6 +51,9 @@ testpmd_drivers_sources = []
 testpmd_drivers_deps = []
 abi_version_file = files('ABI_VERSION')
 
+# minimal C code for testing library linking compatibility
+min_c_code = 'int main(void) { return 0; }'
+
 if host_machine.cpu_family().startswith('x86')
     arch_subdir = 'x86'
 elif host_machine.cpu_family().startswith('arm') or host_machine.cpu_family().startswith('aarch')
-- 
2.48.1


      reply	other threads:[~2025-09-24 11:13 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-23 16:58 [PATCH] examples/l2fwd-cat: check compatibility of dependency lib Bruce Richardson
2025-09-24 10:54 ` Bruce Richardson [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250924111318.567771-1-bruce.richardson@intel.com \
    --to=bruce.richardson@intel.com \
    --cc=anatoly.burakov@intel.com \
    --cc=bingz@nvidia.com \
    --cc=ciara.loftus@intel.com \
    --cc=david.hunt@intel.com \
    --cc=dev@dpdk.org \
    --cc=dmitry.kozliuk@gmail.com \
    --cc=dsosnowski@nvidia.com \
    --cc=longli@microsoft.com \
    --cc=matan@nvidia.com \
    --cc=mtahhan@redhat.com \
    --cc=nicolas.chautru@intel.com \
    --cc=orika@nvidia.com \
    --cc=roretzla@linux.microsoft.com \
    --cc=rosen.xu@altera.com \
    --cc=sivaprasad.tummala@amd.com \
    --cc=suanmingm@nvidia.com \
    --cc=syalavarthi@marvell.com \
    --cc=tomasz.kantecki@intel.com \
    --cc=viacheslavo@nvidia.com \
    --cc=weh@microsoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).