[v3] build: add definitions for use as meson subproject

Message ID 20220506144318.540584-1-bruce.richardson@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers
Series [v3] build: add definitions for use as meson subproject |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/github-robot: build success github build: passed
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-abi-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS

Commit Message

Bruce Richardson May 6, 2022, 2:43 p.m. UTC
  To allow other projects to easily use DPDK as a subproject, add in the
necessary dependency definitions. Slightly different definitions are
necessary for static and shared builds, since for shared builds the
drivers should not be linked in, and the internal meson dependency
objects are more complete.

To use DPDK as a subproject fallback i.e. use installed DPDK if present,
otherwise the shipped one, the following meson statement can be used:

libdpdk = dependency('libdpdk', fallback: ['dpdk', 'dpdk_dep'])

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 buildtools/subproject/meson.build | 21 +++++++++++++++++++++
 drivers/meson.build               |  4 ++++
 lib/meson.build                   |  2 ++
 meson.build                       |  6 ++++++
 4 files changed, 33 insertions(+)
 create mode 100644 buildtools/subproject/meson.build
  

Comments

Ben Magistro May 21, 2022, 12:54 a.m. UTC | #1
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.

Reviewed-by: Ben Magistro <koncept1@gmail.com>
Tested-by: Ben Magistro <koncept1@gmail.com>

On Fri, May 6, 2022 at 10:43 AM Bruce Richardson <bruce.richardson@intel.com>
wrote:

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

Applied, thanks.
  

Patch

diff --git a/buildtools/subproject/meson.build b/buildtools/subproject/meson.build
new file mode 100644
index 0000000000..3192efaa40
--- /dev/null
+++ b/buildtools/subproject/meson.build
@@ -0,0 +1,21 @@ 
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2022 Intel Corporation
+
+message('DPDK subproject linking: ' + get_option('default_library'))
+if get_option('default_library') == 'static'
+    dpdk_dep = declare_dependency(
+            version: meson.project_version(),
+            dependencies: dpdk_static_lib_deps,
+            # static library deps in DPDK build don't include "link_with" parameters,
+            # so explicitly link-in both libs and drivers
+            link_with: dpdk_static_libraries,
+            link_whole: dpdk_drivers,
+            link_args: dpdk_extra_ldflags)
+else
+    dpdk_dep = declare_dependency(
+            version: meson.project_version(),
+            # shared library deps include all necessary linking parameters
+            dependencies: dpdk_shared_lib_deps)
+endif
+
+libdpdk_dep = dpdk_dep
diff --git a/drivers/meson.build b/drivers/meson.build
index 1d8123b00c..db4d9c73bd 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -245,6 +245,10 @@  foreach subpath:subdirs
 
         set_variable('shared_@0@'.format(lib_name), shared_dep)
         set_variable('static_@0@'.format(lib_name), static_dep)
+        # for drivers, we only need to add dependency objects for static libs,
+        # shared lib drivers are not linked in
+        dpdk_static_lib_deps += static_dep
+
         dependency_name = ''.join(lib_name.split('rte_'))
         if developer_mode
             message('drivers/@0@: Defining dependency "@1@"'.format(
diff --git a/lib/meson.build b/lib/meson.build
index 24adbe44c9..c648f7d800 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -266,6 +266,8 @@  foreach l:libraries
 
     set_variable('shared_rte_' + name, shared_dep)
     set_variable('static_rte_' + name, static_dep)
+    dpdk_shared_lib_deps += shared_dep
+    dpdk_static_lib_deps += static_dep
     if developer_mode
         message('lib/@0@: Defining dependency "@1@"'.format(l, name))
     endif
diff --git a/meson.build b/meson.build
index 937f6110c0..6085e32a79 100644
--- a/meson.build
+++ b/meson.build
@@ -36,6 +36,8 @@  dpdk_build_root = meson.current_build_dir()
 dpdk_conf = configuration_data()
 dpdk_libraries = []
 dpdk_static_libraries = []
+dpdk_shared_lib_deps = []
+dpdk_static_lib_deps = []
 dpdk_chkinc_headers = []
 dpdk_driver_classes = []
 dpdk_drivers = []
@@ -103,6 +105,10 @@  configure_file(output: build_cfg,
 # build pkg-config files for dpdk
 subdir('buildtools/pkg-config')
 
+if meson.is_subproject()
+    subdir('buildtools/subproject')
+endif
+
 # final output, list all the libs and drivers to be built
 # this does not affect any part of the build, for information only.
 output_message = '\n=================\nLibraries Enabled\n=================\n'