@@ -75,8 +75,14 @@ foreach app:apps
reason = 'explicitly disabled via build config'
endif
+ app_name = 'dpdk-' + name
if build
subdir(name)
+ type_cmd = '--type=app'
+ run_command([log_deps_cmd, type_cmd, app_name, deps], check: false)
+ if optional_deps.length() > 0
+ run_command([log_deps_cmd, '--optional', type_cmd, app_name, optional_deps], check: false)
+ endif
if not build and require_apps
error('Cannot build explicitly requested app "@0@".\n'.format(name)
+ '\tReason: ' + reason)
@@ -115,7 +121,7 @@ foreach app:apps
link_libs = dpdk_static_libraries + dpdk_drivers
endif
- exec = executable('dpdk-' + name,
+ exec = executable(app_name,
sources,
c_args: cflags,
link_args: ldflags,
new file mode 100644
@@ -0,0 +1,81 @@
+#! /usr/bin/env python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2024 Intel Corporation
+
+"""Utility script to build up a list of dependencies from meson."""
+
+import os
+import sys
+import argparse
+import typing as T
+
+
+def file_to_list(filename: str) -> T.List[str]:
+ """Read file into a list of strings."""
+ with open(filename, encoding="utf-8") as f:
+ return f.readlines()
+
+
+def list_to_file(filename: str, lines: T.List[str]):
+ """Write a list of strings out to a file."""
+ with open(filename, "w", encoding="utf-8") as f:
+ f.writelines(lines)
+
+
+def gen_deps(
+ component_type: str, optional: bool, component: str, deps: T.List[str]
+) -> str:
+ """Generate a dependency graph for meson."""
+ dep_list_str = '", "'.join(deps)
+ deps_str = "" if not deps else f' -> {{ "{dep_list_str}" }}'
+ # we define custom attributes for the nodes
+ attr_str = f'dpdk_componentType="{component_type}"'
+ if optional:
+ # we use a dotted line to represent optional dependencies
+ attr_str += ',style="dotted"'
+ return f'"{component}"{deps_str} [{attr_str}]\n'
+
+
+def _main():
+ depsfile = f'{os.environ["MESON_BUILD_ROOT"]}/deps.dot'
+
+ # to reset the deps file on each build, the script is called without any params
+ if len(sys.argv) == 1:
+ os.remove(depsfile)
+ sys.exit(0)
+
+ # we got arguments, parse them
+ parser = argparse.ArgumentParser(
+ description="Generate a dependency graph for meson."
+ )
+ # type is required
+ parser.add_argument(
+ "--type", required=True, help="Type of dependency (lib, examples, etc.)"
+ )
+ parser.add_argument(
+ "--optional", action="store_true", help="Whether the dependency is optional"
+ )
+ # component is required
+ parser.add_argument("component", help="The component to add to the graph")
+ parser.add_argument("deps", nargs="*", help="The dependencies of the component")
+
+ parsed = parser.parse_args()
+
+ try:
+ contents = file_to_list(depsfile)
+ except FileNotFoundError:
+ contents = ["digraph {\n", "}\n"]
+
+ c_type = parsed.type
+ optional = parsed.optional
+ component = parsed.component
+ deps = parsed.deps
+ contents[-1] = gen_deps(c_type, optional, component, deps)
+
+ contents.append("}\n")
+
+ list_to_file(depsfile, contents)
+
+
+if __name__ == "__main__":
+ _main()
@@ -24,6 +24,8 @@ get_numa_count_cmd = py3 + files('get-numa-count.py')
get_test_suites_cmd = py3 + files('get-test-suites.py')
has_hugepages_cmd = py3 + files('has-hugepages.py')
cmdline_gen_cmd = py3 + files('dpdk-cmdline-gen.py')
+log_deps_cmd = py3 + files('log-deps.py')
+run_command(log_deps_cmd, check: false) # call with no parameters to reset the file
# install any build tools that end-users might want also
install_data([
@@ -155,6 +155,12 @@ foreach subpath:subdirs
if build
# pull in driver directory which should update all the local variables
subdir(drv_path)
+ type_cmd = '--type=drivers'
+ drv_name = class + '_' + name
+ run_command([log_deps_cmd, type_cmd, drv_name, deps], check: false)
+ if optional_deps.length() > 0
+ run_command([log_deps_cmd, '--optional', type_cmd, drv_name, optional_deps], check: false)
+ endif
if dpdk_conf.get('RTE_IOVA_IN_MBUF') == 0 and require_iova_in_mbuf
build = false
@@ -101,8 +101,14 @@ foreach example: examples
optional_deps = []
subdir(example)
+ example_name = 'dpdk-' + name
if build
dep_objs = ext_deps
+ type_cmd = '--type=examples'
+ run_command([log_deps_cmd, type_cmd, example_name, deps], check: false)
+ if optional_deps.length() > 0
+ run_command([log_deps_cmd, '--optional', type_cmd, example_name, optional_deps], check: false)
+ endif
foreach d:deps + optional_deps
var_name = get_option('default_library') + '_rte_' + d
if not is_variable(var_name)
@@ -125,7 +131,7 @@ foreach example: examples
if allow_experimental_apis
cflags += '-DALLOW_EXPERIMENTAL_API'
endif
- executable('dpdk-' + name, sources,
+ executable(example_name, sources,
include_directories: includes,
link_whole: link_whole_libs,
link_args: ldflags,
@@ -161,6 +161,11 @@ foreach l:libraries
if build
subdir(l)
+ type_cmd = '--type=lib'
+ run_command([log_deps_cmd, type_cmd, l, deps], check: false)
+ if optional_deps.length() > 0
+ run_command([log_deps_cmd, '--optional', type_cmd, l, optional_deps], check: false)
+ endif
if not build and require_libs
error('Cannot build explicitly requested lib "@0@".\n'.format(name)
+'\tReason: ' + reason)