<div dir="ltr">Currently utilizing this in an upcoming set of changes for TLDK and all seems to be working for fallback dependency support under both shared and static linkage.<div><br></div><div>Reviewed-by: Ben Magistro <<a href="mailto:koncept1@gmail.com">koncept1@gmail.com</a>></div><div>Tested-by: Ben Magistro <<a href="mailto:koncept1@gmail.com">koncept1@gmail.com</a>></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 6, 2022 at 10:43 AM Bruce Richardson <<a href="mailto:bruce.richardson@intel.com">bruce.richardson@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">To allow other projects to easily use DPDK as a subproject, add in the<br>
necessary dependency definitions. Slightly different definitions are<br>
necessary for static and shared builds, since for shared builds the<br>
drivers should not be linked in, and the internal meson dependency<br>
objects are more complete.<br>
<br>
To use DPDK as a subproject fallback i.e. use installed DPDK if present,<br>
otherwise the shipped one, the following meson statement can be used:<br>
<br>
libdpdk = dependency('libdpdk', fallback: ['dpdk', 'dpdk_dep'])<br>
<br>
Signed-off-by: Stephen Hemminger <<a href="mailto:stephen@networkplumber.org" target="_blank">stephen@networkplumber.org</a>><br>
Signed-off-by: Bruce Richardson <<a href="mailto:bruce.richardson@intel.com" target="_blank">bruce.richardson@intel.com</a>><br>
---<br>
 buildtools/subproject/meson.build | 21 +++++++++++++++++++++<br>
 drivers/meson.build               |  4 ++++<br>
 lib/meson.build                   |  2 ++<br>
 meson.build                       |  6 ++++++<br>
 4 files changed, 33 insertions(+)<br>
 create mode 100644 buildtools/subproject/meson.build<br>
<br>
diff --git a/buildtools/subproject/meson.build b/buildtools/subproject/meson.build<br>
new file mode 100644<br>
index 0000000000..3192efaa40<br>
--- /dev/null<br>
+++ b/buildtools/subproject/meson.build<br>
@@ -0,0 +1,21 @@<br>
+# SPDX-License-Identifier: BSD-3-Clause<br>
+# Copyright(c) 2022 Intel Corporation<br>
+<br>
+message('DPDK subproject linking: ' + get_option('default_library'))<br>
+if get_option('default_library') == 'static'<br>
+    dpdk_dep = declare_dependency(<br>
+            version: meson.project_version(),<br>
+            dependencies: dpdk_static_lib_deps,<br>
+            # static library deps in DPDK build don't include "link_with" parameters,<br>
+            # so explicitly link-in both libs and drivers<br>
+            link_with: dpdk_static_libraries,<br>
+            link_whole: dpdk_drivers,<br>
+            link_args: dpdk_extra_ldflags)<br>
+else<br>
+    dpdk_dep = declare_dependency(<br>
+            version: meson.project_version(),<br>
+            # shared library deps include all necessary linking parameters<br>
+            dependencies: dpdk_shared_lib_deps)<br>
+endif<br>
+<br>
+libdpdk_dep = dpdk_dep<br>
diff --git a/drivers/meson.build b/drivers/meson.build<br>
index 1d8123b00c..db4d9c73bd 100644<br>
--- a/drivers/meson.build<br>
+++ b/drivers/meson.build<br>
@@ -245,6 +245,10 @@ foreach subpath:subdirs<br>
<br>
         set_variable('shared_@0@'.format(lib_name), shared_dep)<br>
         set_variable('static_@0@'.format(lib_name), static_dep)<br>
+        # for drivers, we only need to add dependency objects for static libs,<br>
+        # shared lib drivers are not linked in<br>
+        dpdk_static_lib_deps += static_dep<br>
+<br>
         dependency_name = ''.join(lib_name.split('rte_'))<br>
         if developer_mode<br>
             message('drivers/@0@: Defining dependency "@1@"'.format(<br>
diff --git a/lib/meson.build b/lib/meson.build<br>
index 24adbe44c9..c648f7d800 100644<br>
--- a/lib/meson.build<br>
+++ b/lib/meson.build<br>
@@ -266,6 +266,8 @@ foreach l:libraries<br>
<br>
     set_variable('shared_rte_' + name, shared_dep)<br>
     set_variable('static_rte_' + name, static_dep)<br>
+    dpdk_shared_lib_deps += shared_dep<br>
+    dpdk_static_lib_deps += static_dep<br>
     if developer_mode<br>
         message('lib/@0@: Defining dependency "@1@"'.format(l, name))<br>
     endif<br>
diff --git a/meson.build b/meson.build<br>
index 937f6110c0..6085e32a79 100644<br>
--- a/meson.build<br>
+++ b/meson.build<br>
@@ -36,6 +36,8 @@ dpdk_build_root = meson.current_build_dir()<br>
 dpdk_conf = configuration_data()<br>
 dpdk_libraries = []<br>
 dpdk_static_libraries = []<br>
+dpdk_shared_lib_deps = []<br>
+dpdk_static_lib_deps = []<br>
 dpdk_chkinc_headers = []<br>
 dpdk_driver_classes = []<br>
 dpdk_drivers = []<br>
@@ -103,6 +105,10 @@ configure_file(output: build_cfg,<br>
 # build pkg-config files for dpdk<br>
 subdir('buildtools/pkg-config')<br>
<br>
+if meson.is_subproject()<br>
+    subdir('buildtools/subproject')<br>
+endif<br>
+<br>
 # final output, list all the libs and drivers to be built<br>
 # this does not affect any part of the build, for information only.<br>
 output_message = '\n=================\nLibraries Enabled\n=================\n'<br>
-- <br>
2.34.1<br>
<br>
</blockquote></div>