Rather than just installing all examples, we can use the build checks to
filter out any examples that are missing dependencies or are otherwise
unbuildable on the current system.

Signed-off-by: Bruce Richardson <bruce.richard...@intel.com>
---
 examples/meson.build | 54 +++++++++++++++++++++++++++-----------------
 meson.build          |  2 ++
 2 files changed, 35 insertions(+), 21 deletions(-)

diff --git a/examples/meson.build b/examples/meson.build
index 46ec80919..9d268c978 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -48,15 +48,11 @@ all_examples = [
        'vmdq', 'vmdq_dcb',
 ]
 
-if get_option('examples') == ''
-       subdir_done()
-endif
-
 if get_option('examples').to_lower() == 'all'
-       examples = all_examples
+       requested_examples = all_examples
        allow_skips = true # don't flag an error if we can't build an app
 else
-       examples = get_option('examples').split(',')
+       requested_examples = get_option('examples').split(',')
        allow_skips = false # error out if we can't build a requested app
 endif
 default_cflags = machine_args
@@ -64,7 +60,9 @@ if cc.has_argument('-Wno-format-truncation')
        default_cflags += '-Wno-format-truncation'
 endif
 
-foreach example: examples
+# iterate through all examples to see what we need to install
+# only actually build requested ones
+foreach example: all_examples
        name = example.split('/')[-1]
        build = true
        sources = []
@@ -81,22 +79,36 @@ foreach example: examples
                foreach d:deps
                        var_name = get_option('default_library') + '_rte_' + d
                        if not is_variable(var_name)
-                               error('Missing dependency "@0@" for example 
"@1@"'.format(d, name))
+                               message('Missing dependency "@0@" for example 
"@1@"'.format(d, name))
+                               build = false
+                       else
+                               dep_objs += [get_variable(var_name)]
                        endif
-                       dep_objs += [get_variable(var_name)]
                endforeach
-               if allow_experimental_apis
-                       cflags += '-DALLOW_EXPERIMENTAL_API'
+       endif # build
+
+       if not build
+               # exclude based on top-level directory only
+               dir = example.split('/')[0]
+               dpdk_examples_exclude += dir
+               message('Excluding example directory "@0@" from 
install'.format(dir))
+       endif
+
+       if requested_examples.contains(example)
+               if build
+                       if allow_experimental_apis
+                               cflags += '-DALLOW_EXPERIMENTAL_API'
+                       endif
+                       executable('dpdk-' + name, sources,
+                               include_directories: includes,
+                               link_whole: link_whole_libs,
+                               link_args: dpdk_extra_ldflags,
+                               c_args: cflags,
+                               dependencies: dep_objs)
+               elif not allow_skips
+                       error('Cannot build requested example "' + name + '"')
+               else
+                       message('Skipping example "' + name + '"')
                endif
-               executable('dpdk-' + name, sources,
-                       include_directories: includes,
-                       link_whole: link_whole_libs,
-                       link_args: dpdk_extra_ldflags,
-                       c_args: cflags,
-                       dependencies: dep_objs)
-       elif not allow_skips
-               error('Cannot build requested example "' + name + '"')
-       else
-               message('Skipping example "' + name + '"')
        endif
 endforeach
diff --git a/meson.build b/meson.build
index 45d974cd2..559a9d2f1 100644
--- a/meson.build
+++ b/meson.build
@@ -58,9 +58,11 @@ subdir('doc')
 
 # build any examples explicitly requested - useful for developers - and
 # install any example code into the appropriate install path
+dpdk_examples_exclude = []
 subdir('examples')
 install_subdir('examples',
        install_dir: get_option('datadir') + '/dpdk',
+       exclude_directories: dpdk_examples_exclude,
        exclude_files: 'meson.build')
 
 # build kernel modules if enabled
-- 
2.25.1

Reply via email to