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