xref: /dpdk/dts/framework/utils.py (revision 86dfed2a8ed704e013f054985a92d46f07ff48d1)
1# SPDX-License-Identifier: BSD-3-Clause
2# Copyright(c) 2010-2014 Intel Corporation
3# Copyright(c) 2022-2023 PANTHEON.tech s.r.o.
4# Copyright(c) 2022-2023 University of New Hampshire
5
6import sys
7
8
9def check_dts_python_version() -> None:
10    if sys.version_info.major < 3 or (
11        sys.version_info.major == 3 and sys.version_info.minor < 10
12    ):
13        print(
14            RED(
15                (
16                    "WARNING: DTS execution node's python version is lower than"
17                    "python 3.10, is deprecated and will not work in future releases."
18                )
19            ),
20            file=sys.stderr,
21        )
22        print(RED("Please use Python >= 3.10 instead"), file=sys.stderr)
23
24
25def expand_range(range_str: str) -> list[int]:
26    """
27    Process range string into a list of integers. There are two possible formats:
28    n - a single integer
29    n-m - a range of integers
30
31    The returned range includes both n and m. Empty string returns an empty list.
32    """
33    expanded_range: list[int] = []
34    if range_str:
35        range_boundaries = range_str.split("-")
36        # will throw an exception when items in range_boundaries can't be converted,
37        # serving as type check
38        expanded_range.extend(
39            range(int(range_boundaries[0]), int(range_boundaries[-1]) + 1)
40        )
41
42    return expanded_range
43
44
45def GREEN(text: str) -> str:
46    return f"\u001B[32;1m{str(text)}\u001B[0m"
47
48
49def RED(text: str) -> str:
50    return f"\u001B[31;1m{str(text)}\u001B[0m"
51
52
53class EnvVarsDict(dict):
54    def __str__(self) -> str:
55        return " ".join(["=".join(item) for item in self.items()])
56
57
58class MesonArgs(object):
59    """
60    Aggregate the arguments needed to build DPDK:
61    default_library: Default library type, Meson allows "shared", "static" and "both".
62               Defaults to None, in which case the argument won't be used.
63    Keyword arguments: The arguments found in meson_options.txt in root DPDK directory.
64               Do not use -D with them, for example:
65               meson_args = MesonArgs(enable_kmods=True).
66    """
67
68    _default_library: str
69
70    def __init__(self, default_library: str | None = None, **dpdk_args: str | bool):
71        self._default_library = (
72            f"--default-library={default_library}" if default_library else ""
73        )
74        self._dpdk_args = " ".join(
75            (
76                f"-D{dpdk_arg_name}={dpdk_arg_value}"
77                for dpdk_arg_name, dpdk_arg_value in dpdk_args.items()
78            )
79        )
80
81    def __str__(self) -> str:
82        return " ".join(f"{self._default_library} {self._dpdk_args}".split())
83