[v6,1/8] build: introduce optional internal dependencies

Message ID 6a2c1083c2196b6dbf39f3fe043e3336e5216358.1739877266.git.anatoly.burakov@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series Record and rework component dependencies |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Burakov, Anatoly Feb. 18, 2025, 11:15 a.m. UTC
Allow specifying internal dependencies as either mandatory or optional.
Specifying a dependency as optional will mean that the component being
built will be skipped if said dependency is not being built. At build
time, the build system will resolve any optional dependencies and add
them to the list of dependencies to be built. Any source files requiring
said optional depepdencies will still have to be added explicitly to the
build by the respective component (e.g. adding BPF-related files when BPF
support is being built).

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---

Notes:
    v4 -> v5:
    - Automatically handle optional dependencies based on Bruce's
      earlier patch [1]
    
    [1] https://patches.dpdk.org/project/dpdk/patch/20231220142152.492556-4-bruce.richardson@intel.com/

 app/meson.build                       | 14 ++++++-
 app/proc-info/meson.build             |  4 +-
 app/test-bbdev/meson.build            | 18 +++------
 app/test-crypto-perf/meson.build      |  4 +-
 app/test-pmd/meson.build              | 56 +++++++++------------------
 app/test/meson.build                  | 12 +++---
 drivers/meson.build                   | 13 ++++++-
 examples/ethtool/meson.build          |  4 +-
 examples/l2fwd-crypto/meson.build     |  4 +-
 examples/l3fwd/meson.build            |  4 +-
 examples/meson.build                  | 13 ++++++-
 examples/vm_power_manager/meson.build | 16 +++-----
 lib/meson.build                       | 13 ++++++-
 13 files changed, 89 insertions(+), 86 deletions(-)
  

Comments

Bruce Richardson Feb. 18, 2025, 11:28 a.m. UTC | #1
On Tue, Feb 18, 2025 at 11:15:27AM +0000, Anatoly Burakov wrote:
> Allow specifying internal dependencies as either mandatory or optional.
> Specifying a dependency as optional will mean that the component being
s/optional/mandatory/

> built will be skipped if said dependency is not being built. At build
> time, the build system will resolve any optional dependencies and add
> them to the list of dependencies to be built. Any source files requiring
> said optional depepdencies will still have to be added explicitly to the
> build by the respective component (e.g. adding BPF-related files when BPF
> support is being built).
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> ---
> 
> Notes:
>     v4 -> v5:
>     - Automatically handle optional dependencies based on Bruce's
>       earlier patch [1]
>     
>     [1] https://patches.dpdk.org/project/dpdk/patch/20231220142152.492556-4-bruce.richardson@intel.com/
> 
>  app/meson.build                       | 14 ++++++-
>  app/proc-info/meson.build             |  4 +-
>  app/test-bbdev/meson.build            | 18 +++------
>  app/test-crypto-perf/meson.build      |  4 +-
>  app/test-pmd/meson.build              | 56 +++++++++------------------
>  app/test/meson.build                  | 12 +++---
>  drivers/meson.build                   | 13 ++++++-
>  examples/ethtool/meson.build          |  4 +-
>  examples/l2fwd-crypto/meson.build     |  4 +-
>  examples/l3fwd/meson.build            |  4 +-
>  examples/meson.build                  | 13 ++++++-
>  examples/vm_power_manager/meson.build | 16 +++-----
>  lib/meson.build                       | 13 ++++++-
>  13 files changed, 89 insertions(+), 86 deletions(-)
> 
> diff --git a/app/meson.build b/app/meson.build
> index e2db888ae1..61202495bd 100644
> --- a/app/meson.build
> +++ b/app/meson.build
> @@ -66,6 +66,7 @@ foreach app:apps
>      # external package/library requirements
>      ext_deps = []
>      deps = []
> +    optional_deps = []
>  
>      if not enable_apps.contains(app)
>          build = false
> @@ -83,10 +84,19 @@ foreach app:apps
>          endif
>      endif
>  
> +    # resolve any optional internal dependencies
> +    def_lib = get_option('default_library')
> +    foreach d: optional_deps
> +        # if optional dependency is defined, add it to the deps list
> +        if is_variable(def_lib + '_rte_' + d)
> +            deps += [d]
> +        endif
> +    endforeach
> +
>      if build
>          dep_objs = []
>          foreach d:deps
> -            var_name = get_option('default_library') + '_rte_' + d
> +            var_name = def_lib + '_rte_' + d
>              if not is_variable(var_name)
>                  build = false
>                  reason = 'missing internal dependency, "@0@"'.format(d)
> @@ -111,7 +121,7 @@ foreach app:apps
>  
>      dpdk_apps_enabled += app
>      link_libs = []
> -    if get_option('default_library') == 'static'
> +    if def_lib == 'static'
>          link_libs = dpdk_static_libraries + dpdk_drivers
>      endif
>  
> diff --git a/app/proc-info/meson.build b/app/proc-info/meson.build
> index 316253cd5d..51315f72a1 100644
> --- a/app/proc-info/meson.build
> +++ b/app/proc-info/meson.build
> @@ -9,8 +9,6 @@ endif
>  
>  sources = files('main.c')
>  deps += ['ethdev', 'security', 'eventdev']
> -if dpdk_conf.has('RTE_LIB_METRICS')
> -    deps += 'metrics'
> -endif
> +optional_deps += 'metrics'
>  
>  cflags += no_wvla_cflag
> diff --git a/app/test-bbdev/meson.build b/app/test-bbdev/meson.build
> index 85b060edec..d41bd60396 100644
> --- a/app/test-bbdev/meson.build
> +++ b/app/test-bbdev/meson.build
> @@ -14,17 +14,11 @@ sources = files(
>          'test_bbdev_vector.c',
>  )
>  deps += ['bbdev', 'bus_vdev']
> -if dpdk_conf.has('RTE_BASEBAND_FPGA_LTE_FEC')
> -    deps += ['baseband_fpga_lte_fec']
> -endif
> -if dpdk_conf.has('RTE_BASEBAND_FPGA_5GNR_FEC')
> -    deps += ['baseband_fpga_5gnr_fec']
> -endif
> -if dpdk_conf.has('RTE_BASEBAND_ACC')
> -    deps += ['baseband_acc']
> -endif
> -if dpdk_conf.has('RTE_BASEBAND_LA12XX')
> -    deps += ['baseband_la12xx']
> -endif
> +optional_deps += [
> +        'baseband_fpga_lte_fec',
> +        'baseband_fpga_5gnr_fec',
> +        'baseband_acc',
> +        'baseband_la12xx',
> +]
>  
>  cflags += no_wvla_cflag
> diff --git a/app/test-crypto-perf/meson.build b/app/test-crypto-perf/meson.build
> index 87dd3bc5f1..fb48d9ec29 100644
> --- a/app/test-crypto-perf/meson.build
> +++ b/app/test-crypto-perf/meson.build
> @@ -20,8 +20,6 @@ sources = files(
>          'main.c',
>  )
>  deps += ['cryptodev', 'net', 'security']
> -if dpdk_conf.has('RTE_CRYPTO_SCHEDULER')
> -    deps += 'crypto_scheduler'
> -endif
> +optional_deps += 'crypto_scheduler'
>  
>  cflags += no_wvla_cflag
> diff --git a/app/test-pmd/meson.build b/app/test-pmd/meson.build
> index f1c36529b4..bbc8d429f8 100644
> --- a/app/test-pmd/meson.build
> +++ b/app/test-pmd/meson.build
> @@ -34,47 +34,29 @@ sources = files(
>  if dpdk_conf.has('RTE_HAS_JANSSON')
>      ext_deps += jansson_dep
>  endif
> -
> -deps += ['ethdev', 'cmdline']
> -if dpdk_conf.has('RTE_CRYPTO_SCHEDULER')
> -    deps += 'crypto_scheduler'
> -endif
> -if dpdk_conf.has('RTE_LIB_BITRATESTATS')
> -    deps += 'bitratestats'
> -endif
>  if dpdk_conf.has('RTE_LIB_BPF')
>      sources += files('bpf_cmd.c')
> -    deps += 'bpf'
> -endif
> -if dpdk_conf.has('RTE_LIB_GRO')
> -    deps += 'gro'
> -endif
> -if dpdk_conf.has('RTE_LIB_GSO')
> -    deps += 'gso'
> -endif
> -if dpdk_conf.has('RTE_LIB_LATENCYSTATS')
> -    deps += 'latencystats'
> -endif
> -if dpdk_conf.has('RTE_LIB_METRICS')
> -    deps += 'metrics'
> -endif
> -if dpdk_conf.has('RTE_LIB_PDUMP')
> -    deps += 'pdump'
> -endif
> -if dpdk_conf.has('RTE_NET_BNXT')
> -    deps += 'net_bnxt'
> -endif
> -if dpdk_conf.has('RTE_NET_I40E')
> -    deps += 'net_i40e'
> -endif
> -if dpdk_conf.has('RTE_NET_IXGBE')
> -    deps += 'net_ixgbe'
> -endif
> -if dpdk_conf.has('RTE_NET_DPAA')
> -    deps += ['bus_dpaa', 'mempool_dpaa', 'net_dpaa']
>  endif
>  
> +deps += ['ethdev', 'cmdline']
> +optional_deps += [
> +        'crypto_scheduler',
> +        'bitratestats',
> +        'bpf',
> +        'gro',
> +        'gso',
> +        'latencystats',
> +        'metrics',
> +        'pdump',
> +        'net_bnxt',
> +        'net_i40e',
> +        'net_ixgbe',
> +        'bus_dpaa',
> +        'mempool_dpaa',
> +        'net_dpaa',
> +]
> +
>  # Driver-specific commands are located in driver directories.
>  includes = include_directories('.')
>  sources += testpmd_drivers_sources
> -deps += testpmd_drivers_deps
> +optional_deps += testpmd_drivers_deps
> diff --git a/app/test/meson.build b/app/test/meson.build
> index b6285a6b45..eb0447e8c6 100644
> --- a/app/test/meson.build
> +++ b/app/test/meson.build
> @@ -7,7 +7,7 @@ sources += files('commands.c', 'test.c')
>  
>  # optional dependencies: some files may use these - and so we should link them in -
>  # but do not explicitly require them so they are not listed in the per-file lists below
> -optional_deps = ['crypto_scheduler', 'lpm']
> +opt_deps = ['crypto_scheduler', 'lpm']
>  
>  # some other utility C files, providing functions used by various tests
>  # so we need to include these deps in the dependency list for the files using those fns.
> @@ -222,8 +222,8 @@ foreach f, f_deps : source_file_deps
>              break
>          else
>              # technically we might not need this dep, but adding it is harmless
> -            if d not in deps
> -                deps += d
> +            if d not in optional_deps and d not in deps
> +                optional_deps += d
>              endif
>          endif
>      endforeach
> @@ -244,9 +244,9 @@ foreach f, f_deps : source_file_deps
>      endif
>  endforeach
>  # add the optional dependencies
> -foreach d:optional_deps
> -    if is_variable(def_lib + '_rte_' + d) and d not in deps
> -        deps += d
> +foreach d:opt_deps
> +    if d not in optional_deps and d not in deps
> +        optional_deps += d
>      endif
>  endforeach
>  
> diff --git a/drivers/meson.build b/drivers/meson.build
> index 05391a575d..fb48e11eaf 100644
> --- a/drivers/meson.build
> +++ b/drivers/meson.build
> @@ -133,6 +133,7 @@ foreach subpath:subdirs
>          includes = [include_directories(drv_path)]
>          # set up internal deps. Drivers can append/override as necessary
>          deps = std_deps
> +        optional_deps = []
>          # ext_deps: Stores external library dependency got
>          # using dependency() (preferred) or find_library().
>          # For the find_library() case (but not with dependency()) we also
> @@ -178,11 +179,21 @@ foreach subpath:subdirs
>              # get dependency objs from strings
>              shared_deps = ext_deps
>              static_deps = ext_deps
> +
> +            # resolve any optional internal dependencies
> +            def_lib = get_option('default_library')
> +            foreach d: optional_deps
> +                # if optional dependency is defined, add it to the deps list
> +                if is_variable(def_lib + '_rte_' + d)
> +                    deps += [d]
> +                endif
> +            endforeach
> +
>              foreach d:deps
>                  if not build
>                      break
>                  endif
> -                if not is_variable('shared_rte_' + d)
> +                if not is_variable(def_lib + '_rte_' + d)
>                      build = false
>                      reason = 'missing internal dependency, "@0@"'.format(d)
>                      if dpdk_libs_deprecated.contains(d)
> diff --git a/examples/ethtool/meson.build b/examples/ethtool/meson.build
> index d7f63d48af..bb2a7fbb89 100644
> --- a/examples/ethtool/meson.build
> +++ b/examples/ethtool/meson.build
> @@ -19,8 +19,6 @@ sources = files(
>  includes = include_directories('lib', 'ethtool-app')
>  
>  deps += 'bus_pci'
> -if dpdk_conf.has('RTE_NET_IXGBE')
> -    deps += 'net_ixgbe'
> -endif
> +optional_deps += 'net_ixgbe'
>  
>  allow_experimental_apis = true
> diff --git a/examples/l2fwd-crypto/meson.build b/examples/l2fwd-crypto/meson.build
> index c21722b85c..2a1070707e 100644
> --- a/examples/l2fwd-crypto/meson.build
> +++ b/examples/l2fwd-crypto/meson.build
> @@ -7,9 +7,7 @@
>  # DPDK instance, use 'make'
>  
>  deps += 'cryptodev'
> -if dpdk_conf.has('RTE_CRYPTO_SCHEDULER')
> -    deps += 'crypto_scheduler'
> -endif
> +optional_deps += 'crypto_scheduler'
>  allow_experimental_apis = true
>  sources = files(
>          'main.c',
> diff --git a/examples/l3fwd/meson.build b/examples/l3fwd/meson.build
> index 74144c7979..9a9f2c6d40 100644
> --- a/examples/l3fwd/meson.build
> +++ b/examples/l3fwd/meson.build
> @@ -18,7 +18,5 @@ sources = files(
>          'l3fwd_lpm.c',
>          'main.c',
>  )
> -if dpdk_conf.has('RTE_LIB_EVENTDEV')
> -    deps += 'eventdev'
> -endif
> +optional_deps += 'eventdev'
>  cflags += no_wvla_cflag
> diff --git a/examples/meson.build b/examples/meson.build
> index 8e8968a1fa..14b8aadf68 100644
> --- a/examples/meson.build
> +++ b/examples/meson.build
> @@ -98,12 +98,23 @@ foreach example: examples
>      ext_deps = []
>      includes = [include_directories(example, 'common')]
>      deps = ['eal', 'mempool', 'net', 'mbuf', 'ethdev', 'cmdline']
> +    optional_deps = []
>      subdir(example)
>  
>      if build
>          dep_objs = ext_deps
> +
> +        # resolve any optional internal dependencies
> +        def_lib = get_option('default_library')
> +        foreach d: optional_deps
> +            # if optional dependency is defined, add it to the deps list
> +            if is_variable(def_lib + '_rte_' + d)
> +                deps += [d]
> +            endif
> +        endforeach
> +
>          foreach d:deps
> -            var_name = get_option('default_library') + '_rte_' + d
> +            var_name = def_lib + '_rte_' + d
>              if not is_variable(var_name)
>                  build = false
>                  message('Missing dependency "@0@" for example "@1@"'.format(d, name))
> diff --git a/examples/vm_power_manager/meson.build b/examples/vm_power_manager/meson.build
> index dcf23198eb..6fc081b06b 100644
> --- a/examples/vm_power_manager/meson.build
> +++ b/examples/vm_power_manager/meson.build
> @@ -8,17 +8,11 @@
>  
>  deps += ['power', 'power_kvm_vm']
>  
> -if dpdk_conf.has('RTE_NET_BNXT')
> -    deps += ['net_bnxt']
> -endif
> -
> -if dpdk_conf.has('RTE_NET_I40E')
> -    deps += ['net_i40e']
> -endif
> -
> -if dpdk_conf.has('RTE_NET_IXGBE')
> -    deps += ['net_ixgbe']
> -endif
> +optional_deps += [
> +        'net_bnxt',
> +        'net_i40e',
> +        'net_ixgbe',
> +]
>  
>  allow_experimental_apis = true
>  sources = files(
> diff --git a/lib/meson.build b/lib/meson.build
> index ce92cb5537..76bf849852 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -134,6 +134,7 @@ foreach l:libraries
>      # external package/library requirements
>      ext_deps = []
>      deps = []
> +    optional_deps = []
>      # eal is standard dependency once built
>      if dpdk_conf.has('RTE_LIB_EAL')
>          deps += ['eal']
> @@ -171,11 +172,21 @@ foreach l:libraries
>  
>      shared_deps = ext_deps
>      static_deps = ext_deps
> +
> +    # resolve any optional internal dependencies
> +    def_lib = get_option('default_library')
> +    foreach d: optional_deps
> +        # if optional dependency is defined, add it to the deps list
> +        if is_variable(def_lib + '_rte_' + d)
> +            deps += [d]
> +        endif
> +    endforeach
> +
>      foreach d:deps
>          if not build
>              break
>          endif
> -        if not is_variable('shared_rte_' + d)
> +        if not is_variable(def_lib + '_rte_' + d)
>              build = false
>              reason = 'missing internal dependency, "@0@"'.format(d)
>              if dpdk_libs_deprecated.contains(d)
> -- 
> 2.43.5
>
  

Patch

diff --git a/app/meson.build b/app/meson.build
index e2db888ae1..61202495bd 100644
--- a/app/meson.build
+++ b/app/meson.build
@@ -66,6 +66,7 @@  foreach app:apps
     # external package/library requirements
     ext_deps = []
     deps = []
+    optional_deps = []
 
     if not enable_apps.contains(app)
         build = false
@@ -83,10 +84,19 @@  foreach app:apps
         endif
     endif
 
+    # resolve any optional internal dependencies
+    def_lib = get_option('default_library')
+    foreach d: optional_deps
+        # if optional dependency is defined, add it to the deps list
+        if is_variable(def_lib + '_rte_' + d)
+            deps += [d]
+        endif
+    endforeach
+
     if build
         dep_objs = []
         foreach d:deps
-            var_name = get_option('default_library') + '_rte_' + d
+            var_name = def_lib + '_rte_' + d
             if not is_variable(var_name)
                 build = false
                 reason = 'missing internal dependency, "@0@"'.format(d)
@@ -111,7 +121,7 @@  foreach app:apps
 
     dpdk_apps_enabled += app
     link_libs = []
-    if get_option('default_library') == 'static'
+    if def_lib == 'static'
         link_libs = dpdk_static_libraries + dpdk_drivers
     endif
 
diff --git a/app/proc-info/meson.build b/app/proc-info/meson.build
index 316253cd5d..51315f72a1 100644
--- a/app/proc-info/meson.build
+++ b/app/proc-info/meson.build
@@ -9,8 +9,6 @@  endif
 
 sources = files('main.c')
 deps += ['ethdev', 'security', 'eventdev']
-if dpdk_conf.has('RTE_LIB_METRICS')
-    deps += 'metrics'
-endif
+optional_deps += 'metrics'
 
 cflags += no_wvla_cflag
diff --git a/app/test-bbdev/meson.build b/app/test-bbdev/meson.build
index 85b060edec..d41bd60396 100644
--- a/app/test-bbdev/meson.build
+++ b/app/test-bbdev/meson.build
@@ -14,17 +14,11 @@  sources = files(
         'test_bbdev_vector.c',
 )
 deps += ['bbdev', 'bus_vdev']
-if dpdk_conf.has('RTE_BASEBAND_FPGA_LTE_FEC')
-    deps += ['baseband_fpga_lte_fec']
-endif
-if dpdk_conf.has('RTE_BASEBAND_FPGA_5GNR_FEC')
-    deps += ['baseband_fpga_5gnr_fec']
-endif
-if dpdk_conf.has('RTE_BASEBAND_ACC')
-    deps += ['baseband_acc']
-endif
-if dpdk_conf.has('RTE_BASEBAND_LA12XX')
-    deps += ['baseband_la12xx']
-endif
+optional_deps += [
+        'baseband_fpga_lte_fec',
+        'baseband_fpga_5gnr_fec',
+        'baseband_acc',
+        'baseband_la12xx',
+]
 
 cflags += no_wvla_cflag
diff --git a/app/test-crypto-perf/meson.build b/app/test-crypto-perf/meson.build
index 87dd3bc5f1..fb48d9ec29 100644
--- a/app/test-crypto-perf/meson.build
+++ b/app/test-crypto-perf/meson.build
@@ -20,8 +20,6 @@  sources = files(
         'main.c',
 )
 deps += ['cryptodev', 'net', 'security']
-if dpdk_conf.has('RTE_CRYPTO_SCHEDULER')
-    deps += 'crypto_scheduler'
-endif
+optional_deps += 'crypto_scheduler'
 
 cflags += no_wvla_cflag
diff --git a/app/test-pmd/meson.build b/app/test-pmd/meson.build
index f1c36529b4..bbc8d429f8 100644
--- a/app/test-pmd/meson.build
+++ b/app/test-pmd/meson.build
@@ -34,47 +34,29 @@  sources = files(
 if dpdk_conf.has('RTE_HAS_JANSSON')
     ext_deps += jansson_dep
 endif
-
-deps += ['ethdev', 'cmdline']
-if dpdk_conf.has('RTE_CRYPTO_SCHEDULER')
-    deps += 'crypto_scheduler'
-endif
-if dpdk_conf.has('RTE_LIB_BITRATESTATS')
-    deps += 'bitratestats'
-endif
 if dpdk_conf.has('RTE_LIB_BPF')
     sources += files('bpf_cmd.c')
-    deps += 'bpf'
-endif
-if dpdk_conf.has('RTE_LIB_GRO')
-    deps += 'gro'
-endif
-if dpdk_conf.has('RTE_LIB_GSO')
-    deps += 'gso'
-endif
-if dpdk_conf.has('RTE_LIB_LATENCYSTATS')
-    deps += 'latencystats'
-endif
-if dpdk_conf.has('RTE_LIB_METRICS')
-    deps += 'metrics'
-endif
-if dpdk_conf.has('RTE_LIB_PDUMP')
-    deps += 'pdump'
-endif
-if dpdk_conf.has('RTE_NET_BNXT')
-    deps += 'net_bnxt'
-endif
-if dpdk_conf.has('RTE_NET_I40E')
-    deps += 'net_i40e'
-endif
-if dpdk_conf.has('RTE_NET_IXGBE')
-    deps += 'net_ixgbe'
-endif
-if dpdk_conf.has('RTE_NET_DPAA')
-    deps += ['bus_dpaa', 'mempool_dpaa', 'net_dpaa']
 endif
 
+deps += ['ethdev', 'cmdline']
+optional_deps += [
+        'crypto_scheduler',
+        'bitratestats',
+        'bpf',
+        'gro',
+        'gso',
+        'latencystats',
+        'metrics',
+        'pdump',
+        'net_bnxt',
+        'net_i40e',
+        'net_ixgbe',
+        'bus_dpaa',
+        'mempool_dpaa',
+        'net_dpaa',
+]
+
 # Driver-specific commands are located in driver directories.
 includes = include_directories('.')
 sources += testpmd_drivers_sources
-deps += testpmd_drivers_deps
+optional_deps += testpmd_drivers_deps
diff --git a/app/test/meson.build b/app/test/meson.build
index b6285a6b45..eb0447e8c6 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -7,7 +7,7 @@  sources += files('commands.c', 'test.c')
 
 # optional dependencies: some files may use these - and so we should link them in -
 # but do not explicitly require them so they are not listed in the per-file lists below
-optional_deps = ['crypto_scheduler', 'lpm']
+opt_deps = ['crypto_scheduler', 'lpm']
 
 # some other utility C files, providing functions used by various tests
 # so we need to include these deps in the dependency list for the files using those fns.
@@ -222,8 +222,8 @@  foreach f, f_deps : source_file_deps
             break
         else
             # technically we might not need this dep, but adding it is harmless
-            if d not in deps
-                deps += d
+            if d not in optional_deps and d not in deps
+                optional_deps += d
             endif
         endif
     endforeach
@@ -244,9 +244,9 @@  foreach f, f_deps : source_file_deps
     endif
 endforeach
 # add the optional dependencies
-foreach d:optional_deps
-    if is_variable(def_lib + '_rte_' + d) and d not in deps
-        deps += d
+foreach d:opt_deps
+    if d not in optional_deps and d not in deps
+        optional_deps += d
     endif
 endforeach
 
diff --git a/drivers/meson.build b/drivers/meson.build
index 05391a575d..fb48e11eaf 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -133,6 +133,7 @@  foreach subpath:subdirs
         includes = [include_directories(drv_path)]
         # set up internal deps. Drivers can append/override as necessary
         deps = std_deps
+        optional_deps = []
         # ext_deps: Stores external library dependency got
         # using dependency() (preferred) or find_library().
         # For the find_library() case (but not with dependency()) we also
@@ -178,11 +179,21 @@  foreach subpath:subdirs
             # get dependency objs from strings
             shared_deps = ext_deps
             static_deps = ext_deps
+
+            # resolve any optional internal dependencies
+            def_lib = get_option('default_library')
+            foreach d: optional_deps
+                # if optional dependency is defined, add it to the deps list
+                if is_variable(def_lib + '_rte_' + d)
+                    deps += [d]
+                endif
+            endforeach
+
             foreach d:deps
                 if not build
                     break
                 endif
-                if not is_variable('shared_rte_' + d)
+                if not is_variable(def_lib + '_rte_' + d)
                     build = false
                     reason = 'missing internal dependency, "@0@"'.format(d)
                     if dpdk_libs_deprecated.contains(d)
diff --git a/examples/ethtool/meson.build b/examples/ethtool/meson.build
index d7f63d48af..bb2a7fbb89 100644
--- a/examples/ethtool/meson.build
+++ b/examples/ethtool/meson.build
@@ -19,8 +19,6 @@  sources = files(
 includes = include_directories('lib', 'ethtool-app')
 
 deps += 'bus_pci'
-if dpdk_conf.has('RTE_NET_IXGBE')
-    deps += 'net_ixgbe'
-endif
+optional_deps += 'net_ixgbe'
 
 allow_experimental_apis = true
diff --git a/examples/l2fwd-crypto/meson.build b/examples/l2fwd-crypto/meson.build
index c21722b85c..2a1070707e 100644
--- a/examples/l2fwd-crypto/meson.build
+++ b/examples/l2fwd-crypto/meson.build
@@ -7,9 +7,7 @@ 
 # DPDK instance, use 'make'
 
 deps += 'cryptodev'
-if dpdk_conf.has('RTE_CRYPTO_SCHEDULER')
-    deps += 'crypto_scheduler'
-endif
+optional_deps += 'crypto_scheduler'
 allow_experimental_apis = true
 sources = files(
         'main.c',
diff --git a/examples/l3fwd/meson.build b/examples/l3fwd/meson.build
index 74144c7979..9a9f2c6d40 100644
--- a/examples/l3fwd/meson.build
+++ b/examples/l3fwd/meson.build
@@ -18,7 +18,5 @@  sources = files(
         'l3fwd_lpm.c',
         'main.c',
 )
-if dpdk_conf.has('RTE_LIB_EVENTDEV')
-    deps += 'eventdev'
-endif
+optional_deps += 'eventdev'
 cflags += no_wvla_cflag
diff --git a/examples/meson.build b/examples/meson.build
index 8e8968a1fa..14b8aadf68 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -98,12 +98,23 @@  foreach example: examples
     ext_deps = []
     includes = [include_directories(example, 'common')]
     deps = ['eal', 'mempool', 'net', 'mbuf', 'ethdev', 'cmdline']
+    optional_deps = []
     subdir(example)
 
     if build
         dep_objs = ext_deps
+
+        # resolve any optional internal dependencies
+        def_lib = get_option('default_library')
+        foreach d: optional_deps
+            # if optional dependency is defined, add it to the deps list
+            if is_variable(def_lib + '_rte_' + d)
+                deps += [d]
+            endif
+        endforeach
+
         foreach d:deps
-            var_name = get_option('default_library') + '_rte_' + d
+            var_name = def_lib + '_rte_' + d
             if not is_variable(var_name)
                 build = false
                 message('Missing dependency "@0@" for example "@1@"'.format(d, name))
diff --git a/examples/vm_power_manager/meson.build b/examples/vm_power_manager/meson.build
index dcf23198eb..6fc081b06b 100644
--- a/examples/vm_power_manager/meson.build
+++ b/examples/vm_power_manager/meson.build
@@ -8,17 +8,11 @@ 
 
 deps += ['power', 'power_kvm_vm']
 
-if dpdk_conf.has('RTE_NET_BNXT')
-    deps += ['net_bnxt']
-endif
-
-if dpdk_conf.has('RTE_NET_I40E')
-    deps += ['net_i40e']
-endif
-
-if dpdk_conf.has('RTE_NET_IXGBE')
-    deps += ['net_ixgbe']
-endif
+optional_deps += [
+        'net_bnxt',
+        'net_i40e',
+        'net_ixgbe',
+]
 
 allow_experimental_apis = true
 sources = files(
diff --git a/lib/meson.build b/lib/meson.build
index ce92cb5537..76bf849852 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -134,6 +134,7 @@  foreach l:libraries
     # external package/library requirements
     ext_deps = []
     deps = []
+    optional_deps = []
     # eal is standard dependency once built
     if dpdk_conf.has('RTE_LIB_EAL')
         deps += ['eal']
@@ -171,11 +172,21 @@  foreach l:libraries
 
     shared_deps = ext_deps
     static_deps = ext_deps
+
+    # resolve any optional internal dependencies
+    def_lib = get_option('default_library')
+    foreach d: optional_deps
+        # if optional dependency is defined, add it to the deps list
+        if is_variable(def_lib + '_rte_' + d)
+            deps += [d]
+        endif
+    endforeach
+
     foreach d:deps
         if not build
             break
         endif
-        if not is_variable('shared_rte_' + d)
+        if not is_variable(def_lib + '_rte_' + d)
             build = false
             reason = 'missing internal dependency, "@0@"'.format(d)
             if dpdk_libs_deprecated.contains(d)