[v3,4/4] examples: skip installing unbuildable examples

Message ID 20201111174845.1768044-4-bruce.richardson@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series [v3,1/4] examples: fix flattening directory layout on install |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-testing fail Testing issues
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS

Commit Message

Bruce Richardson Nov. 11, 2020, 5:48 p.m. UTC
  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.richardson@intel.com>
---
 examples/meson.build | 54 +++++++++++++++++++++++++++-----------------
 meson.build          |  2 ++
 2 files changed, 35 insertions(+), 21 deletions(-)
  

Patch

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