<div dir="ltr"><br><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">---------- Forwarded message ---------<br>From: <strong class="gmail_sendername" dir="auto">Koushik Bhargav Nimoji</strong> <span dir="auto"><<a href="mailto:knimoji@iol.unh.edu">knimoji@iol.unh.edu</a>></span><br>Date: Mon, Jun 8, 2026 at 9:23 AM<br>Subject: [PATCH v1 2/2] dts: add build arguments to test run configuration<br>To: <<a href="mailto:luca.vizzarro@arm.com">luca.vizzarro@arm.com</a>>, <<a href="mailto:patrickrobb1997@gmail.com">patrickrobb1997@gmail.com</a>><br>Cc: <<a href="mailto:abailey@iol.unh.edu">abailey@iol.unh.edu</a>>, <<a href="mailto:ahassick@iol.unh.edu">ahassick@iol.unh.edu</a>>, <<a href="mailto:lylavoie@iol.unh.edu">lylavoie@iol.unh.edu</a>>, Koushik Bhargav Nimoji <<a href="mailto:knimoji@iol.unh.edu">knimoji@iol.unh.edu</a>><br></div><br><br>This patch adds the ability to specify build arguments when building DPDK<br>
through DTS. Doing so allows users to build DPDK with the desired build<br>
arguments, which allows for a more configurable DTS run.<br>
<br>
Signed-off-by: Koushik Bhargav Nimoji <<a href="mailto:knimoji@iol.unh.edu" target="_blank">knimoji@iol.unh.edu</a>><br>
---<br>
dts/configurations/test_run.example.yaml | 13 +++++++++++++<br>
dts/framework/config/test_run.py | 2 ++<br>
dts/framework/remote_session/dpdk.py | 12 ++++++++----<br>
dts/framework/utils.py | 21 ++++++++++++++++++++-<br>
4 files changed, 43 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/dts/configurations/test_run.example.yaml b/dts/configurations/test_run.example.yaml<br>
index ee641f5dce..0bd5151801 100644<br>
--- a/dts/configurations/test_run.example.yaml<br>
+++ b/dts/configurations/test_run.example.yaml<br>
@@ -16,6 +16,8 @@<br>
# `precompiled_build_dir` or `build_options` can be defined, but not both.<br>
# `compiler_wrapper`:<br>
# Optional, adds a compiler wrapper if present.<br>
+# `build_args`:<br>
+# The additional build arguments to be used when building DPDK.<br>
# `func_traffic_generator` & `perf_traffic_generator`:<br>
# Define `func_traffic_generator` when `func` set to true.<br>
# Define `perf_traffic_generator` when `perf` set to true.<br>
@@ -40,6 +42,17 @@ dpdk:<br>
# the combination of the following two makes CC="ccache gcc"<br>
compiler: gcc<br>
compiler_wrapper: ccache # see `Optional Fields`<br>
+ # arguments to be used when building DPDK<br>
+ # build_args:<br>
+ # c_args:<br>
+ # - O3<br>
+ # - g<br>
+ # b_coverage:<br>
+ # - "true"<br>
+ # buildtype:<br>
+ # - release<br>
+ # flags:<br>
+ # - strip<br>
func_traffic_generator:<br>
type: SCAPY<br>
# perf_traffic_generator:<br>
diff --git a/dts/framework/config/test_run.py b/dts/framework/config/test_run.py<br>
index 76e24d1785..eab12041fc 100644<br>
--- a/dts/framework/config/test_run.py<br>
+++ b/dts/framework/config/test_run.py<br>
@@ -191,6 +191,8 @@ class DPDKBuildOptionsConfiguration(FrozenModel):<br>
#: This string will be put in front of the compiler when executing the build. Useful for adding<br>
#: wrapper commands, such as ``ccache``.<br>
compiler_wrapper: str = ""<br>
+ #: The build arguments to build dpdk with<br>
+ build_args: dict[str, list[str]] = {}<br>
<br>
<br>
class DPDKUncompiledBuildConfiguration(BaseDPDKBuildConfiguration):<br>
diff --git a/dts/framework/remote_session/dpdk.py b/dts/framework/remote_session/dpdk.py<br>
index 865f97f6ca..4dc0ceeaaf 100644<br>
--- a/dts/framework/remote_session/dpdk.py<br>
+++ b/dts/framework/remote_session/dpdk.py<br>
@@ -100,8 +100,8 @@ def setup(self) -> None:<br>
match self.config:<br>
case DPDKPrecompiledBuildConfiguration(precompiled_build_dir=build_dir):<br>
self._set_remote_dpdk_build_dir(build_dir)<br>
- case DPDKUncompiledBuildConfiguration(build_options=build_options):<br>
- self._configure_dpdk_build(build_options)<br>
+ case DPDKUncompiledBuildConfiguration():<br>
+ self._configure_dpdk_build(self.config.build_options)<br>
self._build_dpdk()<br>
<br>
def teardown(self) -> None:<br>
@@ -277,16 +277,20 @@ def _build_dpdk(self) -> None:<br>
`remote_dpdk_tree_path` has already been set on the SUT node.<br>
"""<br>
ctx = get_ctx()<br>
+ build_options = getattr(self.config, "build_options")<br>
# If the SUT is an ice driver device, make sure to build with 16B descriptors.<br>
if (<br>
ctx.topology.sut_port_ingress<br>
and ctx.topology.sut_port_ingress.config.os_driver == "ice"<br>
):<br>
meson_args = MesonArgs(<br>
- default_library="static", libdir="lib", c_args="-DRTE_NET_INTEL_USE_16BYTE_DESC"<br>
+ build_options.build_args,<br>
+ default_library="static",<br>
+ libdir="lib",<br>
+ c_args="-DRTE_NET_INTEL_USE_16BYTE_DESC",<br>
)<br>
else:<br>
- meson_args = MesonArgs(default_library="static", libdir="lib")<br>
+ meson_args = MesonArgs(build_options.build_args, default_library="static", libdir="lib")<br>
<br>
if SETTINGS.code_coverage:<br>
meson_args._add_arg("-Db_coverage=true")<br>
diff --git a/dts/framework/utils.py b/dts/framework/utils.py<br>
index 38da88cd9c..e0ed35066c 100644<br>
--- a/dts/framework/utils.py<br>
+++ b/dts/framework/utils.py<br>
@@ -99,10 +99,16 @@ class MesonArgs:<br>
<br>
_default_library: str<br>
<br>
- def __init__(self, default_library: str | None = None, **dpdk_args: str | bool):<br>
+ def __init__(<br>
+ self,<br>
+ dpdk_build_args: dict[str, list[str]],<br>
+ default_library: str | None = None,<br>
+ **dpdk_args: str | bool,<br>
+ ):<br>
"""Initialize the meson arguments.<br>
<br>
Args:<br>
+ dpdk_build_args: The DPDK build arguments specified in the test run configuration file.<br>
default_library: The default library type, Meson supports ``shared``, ``static`` and<br>
``both``. Defaults to :data:`None`, in which case the argument won't be used.<br>
dpdk_args: The arguments found in ``meson_options.txt`` in root DPDK directory.<br>
@@ -121,6 +127,19 @@ def __init__(self, default_library: str | None = None, **dpdk_args: str | bool):<br>
)<br>
)<br>
<br>
+ arguments = []<br>
+ for option, value in dpdk_build_args.items():<br>
+ if option == "c_args":<br>
+ values = " ".join(f"-{val}" for val in value)<br>
+ arguments.append(f'-D{option}="{values}"')<br>
+ elif option == "flags":<br>
+ values = " ".join(f"--{val}" for val in value)<br>
+ arguments.append(values)<br>
+ else:<br>
+ arguments.append(f" -D{option}={value[0]}")<br>
+<br>
+ self._dpdk_args = " ".join(arguments)<br>
+<br>
def __str__(self) -> str:<br>
"""The actual args."""<br>
return " ".join(f"{self._default_library} {self._dpdk_args}".split())<br>
-- <br>
2.54.0<br>
<br>
</div></div>