<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>