xref: /openbmc/openbmc/poky/meta/lib/oe/types.py (revision 92b42cb3)
1c342db35SBrad Bishop#
2*92b42cb3SPatrick Williams# Copyright OpenEmbedded Contributors
3*92b42cb3SPatrick Williams#
4c342db35SBrad Bishop# SPDX-License-Identifier: GPL-2.0-only
5c342db35SBrad Bishop#
6c342db35SBrad Bishop
7eb8dc403SDave Cobbleyimport errno
8eb8dc403SDave Cobbleyimport re
9eb8dc403SDave Cobbleyimport os
10eb8dc403SDave Cobbley
11eb8dc403SDave Cobbley
12eb8dc403SDave Cobbleyclass OEList(list):
13eb8dc403SDave Cobbley    """OpenEmbedded 'list' type
14eb8dc403SDave Cobbley
15eb8dc403SDave Cobbley    Acts as an ordinary list, but is constructed from a string value and a
16eb8dc403SDave Cobbley    separator (optional), and re-joins itself when converted to a string with
17eb8dc403SDave Cobbley    str().  Set the variable type flag to 'list' to use this type, and the
18eb8dc403SDave Cobbley    'separator' flag may be specified (defaulting to whitespace)."""
19eb8dc403SDave Cobbley
20eb8dc403SDave Cobbley    name = "list"
21eb8dc403SDave Cobbley
22eb8dc403SDave Cobbley    def __init__(self, value, separator = None):
23eb8dc403SDave Cobbley        if value is not None:
24eb8dc403SDave Cobbley            list.__init__(self, value.split(separator))
25eb8dc403SDave Cobbley        else:
26eb8dc403SDave Cobbley            list.__init__(self)
27eb8dc403SDave Cobbley
28eb8dc403SDave Cobbley        if separator is None:
29eb8dc403SDave Cobbley            self.separator = " "
30eb8dc403SDave Cobbley        else:
31eb8dc403SDave Cobbley            self.separator = separator
32eb8dc403SDave Cobbley
33eb8dc403SDave Cobbley    def __str__(self):
34eb8dc403SDave Cobbley        return self.separator.join(self)
35eb8dc403SDave Cobbley
36eb8dc403SDave Cobbleydef choice(value, choices):
37eb8dc403SDave Cobbley    """OpenEmbedded 'choice' type
38eb8dc403SDave Cobbley
39eb8dc403SDave Cobbley    Acts as a multiple choice for the user.  To use this, set the variable
40eb8dc403SDave Cobbley    type flag to 'choice', and set the 'choices' flag to a space separated
41eb8dc403SDave Cobbley    list of valid values."""
42eb8dc403SDave Cobbley    if not isinstance(value, str):
43eb8dc403SDave Cobbley        raise TypeError("choice accepts a string, not '%s'" % type(value))
44eb8dc403SDave Cobbley
45eb8dc403SDave Cobbley    value = value.lower()
46eb8dc403SDave Cobbley    choices = choices.lower()
47eb8dc403SDave Cobbley    if value not in choices.split():
48eb8dc403SDave Cobbley        raise ValueError("Invalid choice '%s'.  Valid choices: %s" %
49eb8dc403SDave Cobbley                         (value, choices))
50eb8dc403SDave Cobbley    return value
51eb8dc403SDave Cobbley
52eb8dc403SDave Cobbleyclass NoMatch(object):
53eb8dc403SDave Cobbley    """Stub python regex pattern object which never matches anything"""
54eb8dc403SDave Cobbley    def findall(self, string, flags=0):
55eb8dc403SDave Cobbley        return None
56eb8dc403SDave Cobbley
57eb8dc403SDave Cobbley    def finditer(self, string, flags=0):
58eb8dc403SDave Cobbley        return None
59eb8dc403SDave Cobbley
60eb8dc403SDave Cobbley    def match(self, flags=0):
61eb8dc403SDave Cobbley        return None
62eb8dc403SDave Cobbley
63eb8dc403SDave Cobbley    def search(self, string, flags=0):
64eb8dc403SDave Cobbley        return None
65eb8dc403SDave Cobbley
66eb8dc403SDave Cobbley    def split(self, string, maxsplit=0):
67eb8dc403SDave Cobbley        return None
68eb8dc403SDave Cobbley
69eb8dc403SDave Cobbley    def sub(pattern, repl, string, count=0):
70eb8dc403SDave Cobbley        return None
71eb8dc403SDave Cobbley
72eb8dc403SDave Cobbley    def subn(pattern, repl, string, count=0):
73eb8dc403SDave Cobbley        return None
74eb8dc403SDave Cobbley
75eb8dc403SDave CobbleyNoMatch = NoMatch()
76eb8dc403SDave Cobbley
77eb8dc403SDave Cobbleydef regex(value, regexflags=None):
78eb8dc403SDave Cobbley    """OpenEmbedded 'regex' type
79eb8dc403SDave Cobbley
80eb8dc403SDave Cobbley    Acts as a regular expression, returning the pre-compiled regular
81eb8dc403SDave Cobbley    expression pattern object.  To use this type, set the variable type flag
82eb8dc403SDave Cobbley    to 'regex', and optionally, set the 'regexflags' type to a space separated
83eb8dc403SDave Cobbley    list of the flags to control the regular expression matching (e.g.
84eb8dc403SDave Cobbley    FOO[regexflags] += 'ignorecase').  See the python documentation on the
85eb8dc403SDave Cobbley    're' module for a list of valid flags."""
86eb8dc403SDave Cobbley
87eb8dc403SDave Cobbley    flagval = 0
88eb8dc403SDave Cobbley    if regexflags:
89eb8dc403SDave Cobbley        for flag in regexflags.split():
90eb8dc403SDave Cobbley            flag = flag.upper()
91eb8dc403SDave Cobbley            try:
92eb8dc403SDave Cobbley                flagval |= getattr(re, flag)
93eb8dc403SDave Cobbley            except AttributeError:
94eb8dc403SDave Cobbley                raise ValueError("Invalid regex flag '%s'" % flag)
95eb8dc403SDave Cobbley
96eb8dc403SDave Cobbley    if not value:
97eb8dc403SDave Cobbley        # Let's ensure that the default behavior for an undefined or empty
98eb8dc403SDave Cobbley        # variable is to match nothing. If the user explicitly wants to match
99eb8dc403SDave Cobbley        # anything, they can match '.*' instead.
100eb8dc403SDave Cobbley        return NoMatch
101eb8dc403SDave Cobbley
102eb8dc403SDave Cobbley    try:
103eb8dc403SDave Cobbley        return re.compile(value, flagval)
104eb8dc403SDave Cobbley    except re.error as exc:
105eb8dc403SDave Cobbley        raise ValueError("Invalid regex value '%s': %s" %
106eb8dc403SDave Cobbley                         (value, exc.args[0]))
107eb8dc403SDave Cobbley
108eb8dc403SDave Cobbleydef boolean(value):
109eb8dc403SDave Cobbley    """OpenEmbedded 'boolean' type
110eb8dc403SDave Cobbley
111eb8dc403SDave Cobbley    Valid values for true: 'yes', 'y', 'true', 't', '1'
1121a4b7ee2SBrad Bishop    Valid values for false: 'no', 'n', 'false', 'f', '0', None
113eb8dc403SDave Cobbley    """
1141a4b7ee2SBrad Bishop    if value is None:
1151a4b7ee2SBrad Bishop        return False
1161a4b7ee2SBrad Bishop
1171a4b7ee2SBrad Bishop    if isinstance(value, bool):
1181a4b7ee2SBrad Bishop        return value
119eb8dc403SDave Cobbley
120eb8dc403SDave Cobbley    if not isinstance(value, str):
121eb8dc403SDave Cobbley        raise TypeError("boolean accepts a string, not '%s'" % type(value))
122eb8dc403SDave Cobbley
123eb8dc403SDave Cobbley    value = value.lower()
124eb8dc403SDave Cobbley    if value in ('yes', 'y', 'true', 't', '1'):
125eb8dc403SDave Cobbley        return True
126eb8dc403SDave Cobbley    elif value in ('no', 'n', 'false', 'f', '0'):
127eb8dc403SDave Cobbley        return False
128eb8dc403SDave Cobbley    raise ValueError("Invalid boolean value '%s'" % value)
129eb8dc403SDave Cobbley
130eb8dc403SDave Cobbleydef integer(value, numberbase=10):
131eb8dc403SDave Cobbley    """OpenEmbedded 'integer' type
132eb8dc403SDave Cobbley
133eb8dc403SDave Cobbley    Defaults to base 10, but this can be specified using the optional
134eb8dc403SDave Cobbley    'numberbase' flag."""
135eb8dc403SDave Cobbley
136eb8dc403SDave Cobbley    return int(value, int(numberbase))
137eb8dc403SDave Cobbley
138eb8dc403SDave Cobbley_float = float
139eb8dc403SDave Cobbleydef float(value, fromhex='false'):
140eb8dc403SDave Cobbley    """OpenEmbedded floating point type
141eb8dc403SDave Cobbley
142eb8dc403SDave Cobbley    To use this type, set the type flag to 'float', and optionally set the
143eb8dc403SDave Cobbley    'fromhex' flag to a true value (obeying the same rules as for the
144eb8dc403SDave Cobbley    'boolean' type) if the value is in base 16 rather than base 10."""
145eb8dc403SDave Cobbley
146eb8dc403SDave Cobbley    if boolean(fromhex):
147eb8dc403SDave Cobbley        return _float.fromhex(value)
148eb8dc403SDave Cobbley    else:
149eb8dc403SDave Cobbley        return _float(value)
150eb8dc403SDave Cobbley
151eb8dc403SDave Cobbleydef path(value, relativeto='', normalize='true', mustexist='false'):
152eb8dc403SDave Cobbley    value = os.path.join(relativeto, value)
153eb8dc403SDave Cobbley
154eb8dc403SDave Cobbley    if boolean(normalize):
155eb8dc403SDave Cobbley        value = os.path.normpath(value)
156eb8dc403SDave Cobbley
157eb8dc403SDave Cobbley    if boolean(mustexist):
158eb8dc403SDave Cobbley        try:
15964c979e8SBrad Bishop            with open(value, 'r'):
16064c979e8SBrad Bishop                pass
161eb8dc403SDave Cobbley        except IOError as exc:
162eb8dc403SDave Cobbley            if exc.errno == errno.ENOENT:
163eb8dc403SDave Cobbley                raise ValueError("{0}: {1}".format(value, os.strerror(errno.ENOENT)))
164eb8dc403SDave Cobbley
165eb8dc403SDave Cobbley    return value
166977dc1acSBrad Bishop
167977dc1acSBrad Bishopdef is_x86(arch):
168977dc1acSBrad Bishop    """
169977dc1acSBrad Bishop    Check whether arch is x86 or x86_64
170977dc1acSBrad Bishop    """
171977dc1acSBrad Bishop    if arch.startswith('x86_') or re.match('i.*86', arch):
172977dc1acSBrad Bishop        return True
173977dc1acSBrad Bishop    else:
174977dc1acSBrad Bishop        return False
175977dc1acSBrad Bishop
176977dc1acSBrad Bishopdef qemu_use_kvm(kvm, target_arch):
177977dc1acSBrad Bishop    """
178977dc1acSBrad Bishop    Enable kvm if target_arch == build_arch or both of them are x86 archs.
179977dc1acSBrad Bishop    """
180977dc1acSBrad Bishop
181977dc1acSBrad Bishop    use_kvm = False
182977dc1acSBrad Bishop    if kvm and boolean(kvm):
183977dc1acSBrad Bishop        build_arch = os.uname()[4]
184977dc1acSBrad Bishop        if is_x86(build_arch) and is_x86(target_arch):
185977dc1acSBrad Bishop            use_kvm = True
186977dc1acSBrad Bishop        elif build_arch == target_arch:
187977dc1acSBrad Bishop            use_kvm = True
188977dc1acSBrad Bishop    return use_kvm
189