blob: b929afb1f3f6c475490bf645692f47d01f5988cc [file] [log] [blame]
Brad Bishopc342db32019-05-15 21:57:59 -04001#
Patrick Williams92b42cb2022-09-03 06:53:57 -05002# Copyright OpenEmbedded Contributors
3#
Brad Bishopc342db32019-05-15 21:57:59 -04004# SPDX-License-Identifier: GPL-2.0-only
5#
6
Patrick Williamsc124f4f2015-09-15 14:41:29 -05007import errno
8import re
9import os
10
11
12class OEList(list):
13 """OpenEmbedded 'list' type
14
15 Acts as an ordinary list, but is constructed from a string value and a
16 separator (optional), and re-joins itself when converted to a string with
17 str(). Set the variable type flag to 'list' to use this type, and the
18 'separator' flag may be specified (defaulting to whitespace)."""
19
20 name = "list"
21
22 def __init__(self, value, separator = None):
23 if value is not None:
24 list.__init__(self, value.split(separator))
25 else:
26 list.__init__(self)
27
28 if separator is None:
29 self.separator = " "
30 else:
31 self.separator = separator
32
33 def __str__(self):
34 return self.separator.join(self)
35
36def choice(value, choices):
37 """OpenEmbedded 'choice' type
38
39 Acts as a multiple choice for the user. To use this, set the variable
40 type flag to 'choice', and set the 'choices' flag to a space separated
41 list of valid values."""
Patrick Williamsc0f7c042017-02-23 20:41:17 -060042 if not isinstance(value, str):
Patrick Williamsc124f4f2015-09-15 14:41:29 -050043 raise TypeError("choice accepts a string, not '%s'" % type(value))
44
45 value = value.lower()
46 choices = choices.lower()
47 if value not in choices.split():
48 raise ValueError("Invalid choice '%s'. Valid choices: %s" %
49 (value, choices))
50 return value
51
52class NoMatch(object):
53 """Stub python regex pattern object which never matches anything"""
54 def findall(self, string, flags=0):
55 return None
56
57 def finditer(self, string, flags=0):
58 return None
59
60 def match(self, flags=0):
61 return None
62
63 def search(self, string, flags=0):
64 return None
65
66 def split(self, string, maxsplit=0):
67 return None
68
69 def sub(pattern, repl, string, count=0):
70 return None
71
72 def subn(pattern, repl, string, count=0):
73 return None
74
75NoMatch = NoMatch()
76
77def regex(value, regexflags=None):
78 """OpenEmbedded 'regex' type
79
80 Acts as a regular expression, returning the pre-compiled regular
81 expression pattern object. To use this type, set the variable type flag
82 to 'regex', and optionally, set the 'regexflags' type to a space separated
83 list of the flags to control the regular expression matching (e.g.
84 FOO[regexflags] += 'ignorecase'). See the python documentation on the
85 're' module for a list of valid flags."""
86
87 flagval = 0
88 if regexflags:
89 for flag in regexflags.split():
90 flag = flag.upper()
91 try:
92 flagval |= getattr(re, flag)
93 except AttributeError:
94 raise ValueError("Invalid regex flag '%s'" % flag)
95
96 if not value:
97 # Let's ensure that the default behavior for an undefined or empty
98 # variable is to match nothing. If the user explicitly wants to match
99 # anything, they can match '.*' instead.
100 return NoMatch
101
102 try:
103 return re.compile(value, flagval)
104 except re.error as exc:
105 raise ValueError("Invalid regex value '%s': %s" %
106 (value, exc.args[0]))
107
108def boolean(value):
109 """OpenEmbedded 'boolean' type
110
111 Valid values for true: 'yes', 'y', 'true', 't', '1'
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800112 Valid values for false: 'no', 'n', 'false', 'f', '0', None
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500113 """
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800114 if value is None:
115 return False
116
117 if isinstance(value, bool):
118 return value
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500119
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600120 if not isinstance(value, str):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500121 raise TypeError("boolean accepts a string, not '%s'" % type(value))
122
123 value = value.lower()
124 if value in ('yes', 'y', 'true', 't', '1'):
125 return True
126 elif value in ('no', 'n', 'false', 'f', '0'):
127 return False
128 raise ValueError("Invalid boolean value '%s'" % value)
129
130def integer(value, numberbase=10):
131 """OpenEmbedded 'integer' type
132
133 Defaults to base 10, but this can be specified using the optional
134 'numberbase' flag."""
135
136 return int(value, int(numberbase))
137
138_float = float
139def float(value, fromhex='false'):
140 """OpenEmbedded floating point type
141
142 To use this type, set the type flag to 'float', and optionally set the
143 'fromhex' flag to a true value (obeying the same rules as for the
144 'boolean' type) if the value is in base 16 rather than base 10."""
145
146 if boolean(fromhex):
147 return _float.fromhex(value)
148 else:
149 return _float(value)
150
151def path(value, relativeto='', normalize='true', mustexist='false'):
152 value = os.path.join(relativeto, value)
153
154 if boolean(normalize):
155 value = os.path.normpath(value)
156
157 if boolean(mustexist):
158 try:
Brad Bishop64c979e2019-11-04 13:55:29 -0500159 with open(value, 'r'):
160 pass
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500161 except IOError as exc:
162 if exc.errno == errno.ENOENT:
163 raise ValueError("{0}: {1}".format(value, os.strerror(errno.ENOENT)))
164
165 return value
Brad Bishop977dc1a2019-02-06 16:01:43 -0500166
167def is_x86(arch):
168 """
169 Check whether arch is x86 or x86_64
170 """
171 if arch.startswith('x86_') or re.match('i.*86', arch):
172 return True
173 else:
174 return False
175
176def qemu_use_kvm(kvm, target_arch):
177 """
178 Enable kvm if target_arch == build_arch or both of them are x86 archs.
179 """
180
181 use_kvm = False
182 if kvm and boolean(kvm):
183 build_arch = os.uname()[4]
184 if is_x86(build_arch) and is_x86(target_arch):
185 use_kvm = True
186 elif build_arch == target_arch:
187 use_kvm = True
188 return use_kvm