1*61046927SAndroid Build Coastguard Workerfrom enum import Enum 2*61046927SAndroid Build Coastguard Workerfrom abc import ABC, abstractmethod 3*61046927SAndroid Build Coastguard Workerimport os 4*61046927SAndroid Build Coastguard Workerimport re 5*61046927SAndroid Build Coastguard Workerimport subprocess 6*61046927SAndroid Build Coastguard Workerimport tomllib 7*61046927SAndroid Build Coastguard Worker 8*61046927SAndroid Build Coastguard Worker# The file used to write output build definitions. 9*61046927SAndroid Build Coastguard Worker_gOutputFile = '' 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker# The relative directory that is currently being processed. When files are 12*61046927SAndroid Build Coastguard Worker# referenced they are relative to this path. 13*61046927SAndroid Build Coastguard Worker_gRelativeDir = '' 14*61046927SAndroid Build Coastguard Worker 15*61046927SAndroid Build Coastguard Worker# Global compiler flags 16*61046927SAndroid Build Coastguard Worker_gProjectCflags = [] 17*61046927SAndroid Build Coastguard Worker_gProjectCppflags = [] 18*61046927SAndroid Build Coastguard Worker 19*61046927SAndroid Build Coastguard Worker_gProjectVersion = 'unknown' 20*61046927SAndroid Build Coastguard Worker_gProjectOptions = [] 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard Worker# Caches the list of dependencies found in .toml config files 23*61046927SAndroid Build Coastguard Worker# Structure: 24*61046927SAndroid Build Coastguard Worker# DependencyTargetType 25*61046927SAndroid Build Coastguard Worker# SHARED_LIBRARY = 1 26*61046927SAndroid Build Coastguard Worker# STATIC_LIBRARY = 2 27*61046927SAndroid Build Coastguard Worker# HEADER_LIBRARY = 3 28*61046927SAndroid Build Coastguard Worker# See meson_impl.py 29*61046927SAndroid Build Coastguard Worker# external_dep = { 30*61046927SAndroid Build Coastguard Worker# 'zlib': { 31*61046927SAndroid Build Coastguard Worker# # target_name: target_type 32*61046927SAndroid Build Coastguard Worker# 'libz': 2 33*61046927SAndroid Build Coastguard Worker# }, 34*61046927SAndroid Build Coastguard Worker# } 35*61046927SAndroid Build Coastguard Workerexternal_dep = {} 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Workerclass IncludeDirectories: 39*61046927SAndroid Build Coastguard Worker def __init__(self, name: str, dirs: []): 40*61046927SAndroid Build Coastguard Worker self.name = name 41*61046927SAndroid Build Coastguard Worker self.dirs = dirs 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker def __iter__(self): 44*61046927SAndroid Build Coastguard Worker return iter([self]) 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Workerclass File: 48*61046927SAndroid Build Coastguard Worker def __init__(self, name: str): 49*61046927SAndroid Build Coastguard Worker self.name = name 50*61046927SAndroid Build Coastguard Worker 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Workerclass Machine: 53*61046927SAndroid Build Coastguard Worker def __init__(self, system, cpu, cpu_family): 54*61046927SAndroid Build Coastguard Worker self._system = system 55*61046927SAndroid Build Coastguard Worker self._cpu = cpu 56*61046927SAndroid Build Coastguard Worker self._cpu_family = cpu_family 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker def system(self): 59*61046927SAndroid Build Coastguard Worker return self._system 60*61046927SAndroid Build Coastguard Worker 61*61046927SAndroid Build Coastguard Worker def set_system(self, system: str): 62*61046927SAndroid Build Coastguard Worker self._system = system 63*61046927SAndroid Build Coastguard Worker 64*61046927SAndroid Build Coastguard Worker def cpu_family(self): 65*61046927SAndroid Build Coastguard Worker return self._cpu_family 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Worker def cpu(self): 68*61046927SAndroid Build Coastguard Worker return self._cpu 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Workerclass DependencyTargetType(Enum): 72*61046927SAndroid Build Coastguard Worker SHARED_LIBRARY = 1 73*61046927SAndroid Build Coastguard Worker STATIC_LIBRARY = 2 74*61046927SAndroid Build Coastguard Worker HEADER_LIBRARY = 3 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Workerclass DependencyTarget: 78*61046927SAndroid Build Coastguard Worker def __init__(self, target_name: str, target_type: DependencyTargetType): 79*61046927SAndroid Build Coastguard Worker self.target_name = target_name 80*61046927SAndroid Build Coastguard Worker self.target_type = target_type 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker 83*61046927SAndroid Build Coastguard Workerclass Dependency: 84*61046927SAndroid Build Coastguard Worker _id_generator = 1000 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker def __init__( 87*61046927SAndroid Build Coastguard Worker self, 88*61046927SAndroid Build Coastguard Worker name: str, 89*61046927SAndroid Build Coastguard Worker version='', 90*61046927SAndroid Build Coastguard Worker found=False, 91*61046927SAndroid Build Coastguard Worker targets=[], 92*61046927SAndroid Build Coastguard Worker compile_args=[], 93*61046927SAndroid Build Coastguard Worker include_directories=[], 94*61046927SAndroid Build Coastguard Worker dependencies=[], 95*61046927SAndroid Build Coastguard Worker sources=[], 96*61046927SAndroid Build Coastguard Worker link_with=[], 97*61046927SAndroid Build Coastguard Worker link_whole=[], 98*61046927SAndroid Build Coastguard Worker ): 99*61046927SAndroid Build Coastguard Worker self.name = name 100*61046927SAndroid Build Coastguard Worker self.targets = targets 101*61046927SAndroid Build Coastguard Worker self._version = version 102*61046927SAndroid Build Coastguard Worker self._found = found 103*61046927SAndroid Build Coastguard Worker self.compile_args = compile_args 104*61046927SAndroid Build Coastguard Worker self.include_directories = include_directories 105*61046927SAndroid Build Coastguard Worker self.dependencies = dependencies 106*61046927SAndroid Build Coastguard Worker self.sources = sources 107*61046927SAndroid Build Coastguard Worker self.link_with = link_with 108*61046927SAndroid Build Coastguard Worker self.link_whole = link_whole 109*61046927SAndroid Build Coastguard Worker Dependency._id_generator += 1 110*61046927SAndroid Build Coastguard Worker self.unique_id = Dependency._id_generator 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker def version(self): 113*61046927SAndroid Build Coastguard Worker return self._version 114*61046927SAndroid Build Coastguard Worker 115*61046927SAndroid Build Coastguard Worker def found(self): 116*61046927SAndroid Build Coastguard Worker return self._found 117*61046927SAndroid Build Coastguard Worker 118*61046927SAndroid Build Coastguard Worker def partial_dependency(self, compile_args=''): 119*61046927SAndroid Build Coastguard Worker return self 120*61046927SAndroid Build Coastguard Worker 121*61046927SAndroid Build Coastguard Worker def __iter__(self): 122*61046927SAndroid Build Coastguard Worker return iter([self]) 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker def __hash__(self): 125*61046927SAndroid Build Coastguard Worker return hash(self.unique_id) 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker def __eq__(self, other): 128*61046927SAndroid Build Coastguard Worker return self.unique_id == other.unique_id 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker 131*61046927SAndroid Build Coastguard Workerclass CommandReturn: 132*61046927SAndroid Build Coastguard Worker def __init__(self, completed_process): 133*61046927SAndroid Build Coastguard Worker self.completed_process = completed_process 134*61046927SAndroid Build Coastguard Worker 135*61046927SAndroid Build Coastguard Worker def returncode(self): 136*61046927SAndroid Build Coastguard Worker return self.completed_process.returncode 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker def stdout(self): 139*61046927SAndroid Build Coastguard Worker return self.completed_process.stdout 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker 142*61046927SAndroid Build Coastguard Workerclass Program: 143*61046927SAndroid Build Coastguard Worker def __init__(self, command, found: bool): 144*61046927SAndroid Build Coastguard Worker self.command = command 145*61046927SAndroid Build Coastguard Worker self._found = found 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard Worker # Running commands from the ambient system may give wrong/misleading results, since 148*61046927SAndroid Build Coastguard Worker # some build systems use hermetic installations of tools like python. 149*61046927SAndroid Build Coastguard Worker def run_command(self, *commands, capture_output=False): 150*61046927SAndroid Build Coastguard Worker command_line = [self.command] 151*61046927SAndroid Build Coastguard Worker for command in commands: 152*61046927SAndroid Build Coastguard Worker command_line += command 153*61046927SAndroid Build Coastguard Worker 154*61046927SAndroid Build Coastguard Worker completed_process = subprocess.run( 155*61046927SAndroid Build Coastguard Worker command_line, check=False, capture_output=capture_output 156*61046927SAndroid Build Coastguard Worker ) 157*61046927SAndroid Build Coastguard Worker return CommandReturn(completed_process) 158*61046927SAndroid Build Coastguard Worker 159*61046927SAndroid Build Coastguard Worker def found(self): 160*61046927SAndroid Build Coastguard Worker return self._found 161*61046927SAndroid Build Coastguard Worker 162*61046927SAndroid Build Coastguard Worker def full_path(self): 163*61046927SAndroid Build Coastguard Worker return 'full_path' 164*61046927SAndroid Build Coastguard Worker 165*61046927SAndroid Build Coastguard Worker 166*61046927SAndroid Build Coastguard Workerclass PythonModule: 167*61046927SAndroid Build Coastguard Worker def find_installation(self, name: str): 168*61046927SAndroid Build Coastguard Worker if name == 'python3': 169*61046927SAndroid Build Coastguard Worker return Program(name, found=True) 170*61046927SAndroid Build Coastguard Worker exit('Unhandled python installation: ' + name) 171*61046927SAndroid Build Coastguard Worker 172*61046927SAndroid Build Coastguard Worker 173*61046927SAndroid Build Coastguard Workerclass EnableState(Enum): 174*61046927SAndroid Build Coastguard Worker ENABLED = 1 175*61046927SAndroid Build Coastguard Worker DISABLED = 2 176*61046927SAndroid Build Coastguard Worker AUTO = 3 177*61046927SAndroid Build Coastguard Worker 178*61046927SAndroid Build Coastguard Worker 179*61046927SAndroid Build Coastguard Workerclass FeatureOption: 180*61046927SAndroid Build Coastguard Worker def __init__(self, name, state=EnableState.AUTO): 181*61046927SAndroid Build Coastguard Worker self.name = name 182*61046927SAndroid Build Coastguard Worker self.state = state 183*61046927SAndroid Build Coastguard Worker 184*61046927SAndroid Build Coastguard Worker def allowed(self): 185*61046927SAndroid Build Coastguard Worker return self.state == EnableState.ENABLED or self.state == EnableState.AUTO 186*61046927SAndroid Build Coastguard Worker 187*61046927SAndroid Build Coastguard Worker def enabled(self): 188*61046927SAndroid Build Coastguard Worker return self.state == EnableState.ENABLED 189*61046927SAndroid Build Coastguard Worker 190*61046927SAndroid Build Coastguard Worker def disabled(self): 191*61046927SAndroid Build Coastguard Worker return self.state == EnableState.DISABLED 192*61046927SAndroid Build Coastguard Worker 193*61046927SAndroid Build Coastguard Worker def disable_auto_if(self, value: bool): 194*61046927SAndroid Build Coastguard Worker if value and self.state == EnableState.AUTO: 195*61046927SAndroid Build Coastguard Worker self.state = EnableState.DISABLED 196*61046927SAndroid Build Coastguard Worker return self 197*61046927SAndroid Build Coastguard Worker 198*61046927SAndroid Build Coastguard Worker def disable_if(self, value: bool, error_message: str): 199*61046927SAndroid Build Coastguard Worker if not value: 200*61046927SAndroid Build Coastguard Worker return self 201*61046927SAndroid Build Coastguard Worker if self.state == EnableState.ENABLED: 202*61046927SAndroid Build Coastguard Worker exit(error_message) 203*61046927SAndroid Build Coastguard Worker return FeatureOption(self.name, state=EnableState.DISABLED) 204*61046927SAndroid Build Coastguard Worker 205*61046927SAndroid Build Coastguard Worker def require(self, value: bool, error_message: str): 206*61046927SAndroid Build Coastguard Worker if value: 207*61046927SAndroid Build Coastguard Worker return self 208*61046927SAndroid Build Coastguard Worker if self.state == EnableState.ENABLED: 209*61046927SAndroid Build Coastguard Worker exit(error_message) 210*61046927SAndroid Build Coastguard Worker return FeatureOption(self.name, state=EnableState.DISABLED) 211*61046927SAndroid Build Coastguard Worker 212*61046927SAndroid Build Coastguard Worker def set(self, value: str): 213*61046927SAndroid Build Coastguard Worker value = value.lower() 214*61046927SAndroid Build Coastguard Worker if value == 'auto': 215*61046927SAndroid Build Coastguard Worker self.state = EnableState.AUTO 216*61046927SAndroid Build Coastguard Worker elif value == 'enabled': 217*61046927SAndroid Build Coastguard Worker self.state = EnableState.ENABLED 218*61046927SAndroid Build Coastguard Worker elif value == 'disabled': 219*61046927SAndroid Build Coastguard Worker self.state = EnableState.DISABLED 220*61046927SAndroid Build Coastguard Worker else: 221*61046927SAndroid Build Coastguard Worker exit('Unable to set feature to: %s' % value) 222*61046927SAndroid Build Coastguard Worker 223*61046927SAndroid Build Coastguard Worker 224*61046927SAndroid Build Coastguard Workerclass ArrayOption: 225*61046927SAndroid Build Coastguard Worker def __init__(self, name: str, value: []): 226*61046927SAndroid Build Coastguard Worker self.name = name 227*61046927SAndroid Build Coastguard Worker self.strings = value 228*61046927SAndroid Build Coastguard Worker 229*61046927SAndroid Build Coastguard Worker def set(self, value: str): 230*61046927SAndroid Build Coastguard Worker if value == '': 231*61046927SAndroid Build Coastguard Worker self.strings = [] 232*61046927SAndroid Build Coastguard Worker else: 233*61046927SAndroid Build Coastguard Worker self.strings = [value] 234*61046927SAndroid Build Coastguard Worker 235*61046927SAndroid Build Coastguard Worker 236*61046927SAndroid Build Coastguard Workerclass ComboOption: 237*61046927SAndroid Build Coastguard Worker def __init__(self, name: str, value: str): 238*61046927SAndroid Build Coastguard Worker self.name = name 239*61046927SAndroid Build Coastguard Worker self.value = value 240*61046927SAndroid Build Coastguard Worker 241*61046927SAndroid Build Coastguard Worker def set(self, value: str): 242*61046927SAndroid Build Coastguard Worker self.value = value 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Worker 245*61046927SAndroid Build Coastguard Workerclass BooleanOption: 246*61046927SAndroid Build Coastguard Worker def __init__(self, name, value: bool): 247*61046927SAndroid Build Coastguard Worker assert type(value) is bool 248*61046927SAndroid Build Coastguard Worker self.name = name 249*61046927SAndroid Build Coastguard Worker self.value = value 250*61046927SAndroid Build Coastguard Worker 251*61046927SAndroid Build Coastguard Worker def set(self, value: str): 252*61046927SAndroid Build Coastguard Worker self.value = bool(value) 253*61046927SAndroid Build Coastguard Worker 254*61046927SAndroid Build Coastguard Worker 255*61046927SAndroid Build Coastguard Worker# Value can be string or other type 256*61046927SAndroid Build Coastguard Workerclass SimpleOption: 257*61046927SAndroid Build Coastguard Worker def __init__(self, name, value): 258*61046927SAndroid Build Coastguard Worker self.name = name 259*61046927SAndroid Build Coastguard Worker self.value = value 260*61046927SAndroid Build Coastguard Worker 261*61046927SAndroid Build Coastguard Worker def set(self, value: str): 262*61046927SAndroid Build Coastguard Worker if type(self.value) is int: 263*61046927SAndroid Build Coastguard Worker self.value = int(value) 264*61046927SAndroid Build Coastguard Worker else: 265*61046927SAndroid Build Coastguard Worker self.value = value 266*61046927SAndroid Build Coastguard Worker 267*61046927SAndroid Build Coastguard Worker 268*61046927SAndroid Build Coastguard Workerclass Environment: 269*61046927SAndroid Build Coastguard Worker def set(self, var, val): 270*61046927SAndroid Build Coastguard Worker return 271*61046927SAndroid Build Coastguard Worker 272*61046927SAndroid Build Coastguard Worker def append(self, var, val): 273*61046927SAndroid Build Coastguard Worker return 274*61046927SAndroid Build Coastguard Worker 275*61046927SAndroid Build Coastguard Worker 276*61046927SAndroid Build Coastguard Workerclass StaticLibrary: 277*61046927SAndroid Build Coastguard Worker def __init__(self, target_name, link_with=[], link_whole=[]): 278*61046927SAndroid Build Coastguard Worker self.target_name = target_name 279*61046927SAndroid Build Coastguard Worker self.link_with = link_with 280*61046927SAndroid Build Coastguard Worker self.link_whole = link_whole 281*61046927SAndroid Build Coastguard Worker 282*61046927SAndroid Build Coastguard Worker 283*61046927SAndroid Build Coastguard Workerclass SharedLibrary: 284*61046927SAndroid Build Coastguard Worker name = '' 285*61046927SAndroid Build Coastguard Worker 286*61046927SAndroid Build Coastguard Worker def __init__(self, name): 287*61046927SAndroid Build Coastguard Worker self.name = name 288*61046927SAndroid Build Coastguard Worker 289*61046927SAndroid Build Coastguard Worker 290*61046927SAndroid Build Coastguard Workerclass Executable: 291*61046927SAndroid Build Coastguard Worker def __init__(self, name): 292*61046927SAndroid Build Coastguard Worker self.name = name 293*61046927SAndroid Build Coastguard Worker 294*61046927SAndroid Build Coastguard Worker 295*61046927SAndroid Build Coastguard Workerclass CustomTargetItem: 296*61046927SAndroid Build Coastguard Worker def __init__(self, custom_target, index): 297*61046927SAndroid Build Coastguard Worker self.target = custom_target 298*61046927SAndroid Build Coastguard Worker self.index = index 299*61046927SAndroid Build Coastguard Worker 300*61046927SAndroid Build Coastguard Worker 301*61046927SAndroid Build Coastguard Workerclass CustomTarget: 302*61046927SAndroid Build Coastguard Worker def __init__(self, name, outputs=[], generates_h=False, generates_c=False): 303*61046927SAndroid Build Coastguard Worker self._name = name 304*61046927SAndroid Build Coastguard Worker self._outputs = outputs 305*61046927SAndroid Build Coastguard Worker self._generates_h = generates_h 306*61046927SAndroid Build Coastguard Worker self._generates_c = generates_c 307*61046927SAndroid Build Coastguard Worker 308*61046927SAndroid Build Coastguard Worker @property 309*61046927SAndroid Build Coastguard Worker def outputs(self): 310*61046927SAndroid Build Coastguard Worker return self._outputs 311*61046927SAndroid Build Coastguard Worker 312*61046927SAndroid Build Coastguard Worker def generates_h(self): 313*61046927SAndroid Build Coastguard Worker return self._generates_h 314*61046927SAndroid Build Coastguard Worker 315*61046927SAndroid Build Coastguard Worker def generates_c(self): 316*61046927SAndroid Build Coastguard Worker return self._generates_c 317*61046927SAndroid Build Coastguard Worker 318*61046927SAndroid Build Coastguard Worker def target_name(self): 319*61046927SAndroid Build Coastguard Worker return self._name 320*61046927SAndroid Build Coastguard Worker 321*61046927SAndroid Build Coastguard Worker def target_name_h(self): 322*61046927SAndroid Build Coastguard Worker if self._generates_h and self._generates_c: 323*61046927SAndroid Build Coastguard Worker return self._name + '.h' 324*61046927SAndroid Build Coastguard Worker return self._name 325*61046927SAndroid Build Coastguard Worker 326*61046927SAndroid Build Coastguard Worker def target_name_c(self): 327*61046927SAndroid Build Coastguard Worker if self._generates_h and self._generates_c: 328*61046927SAndroid Build Coastguard Worker return self._name + '.c' 329*61046927SAndroid Build Coastguard Worker return self._name 330*61046927SAndroid Build Coastguard Worker 331*61046927SAndroid Build Coastguard Worker def header_outputs(self): 332*61046927SAndroid Build Coastguard Worker hdrs = [] 333*61046927SAndroid Build Coastguard Worker for out in self._outputs: 334*61046927SAndroid Build Coastguard Worker if out.endswith('.h'): 335*61046927SAndroid Build Coastguard Worker hdrs.append(out) 336*61046927SAndroid Build Coastguard Worker return hdrs 337*61046927SAndroid Build Coastguard Worker 338*61046927SAndroid Build Coastguard Worker def __iter__(self): 339*61046927SAndroid Build Coastguard Worker return iter([self]) 340*61046927SAndroid Build Coastguard Worker 341*61046927SAndroid Build Coastguard Worker def __getitem__(self, index): 342*61046927SAndroid Build Coastguard Worker return CustomTargetItem(self, index) 343*61046927SAndroid Build Coastguard Worker 344*61046927SAndroid Build Coastguard Worker def full_path(self): 345*61046927SAndroid Build Coastguard Worker return 'fullpath' 346*61046927SAndroid Build Coastguard Worker 347*61046927SAndroid Build Coastguard Worker 348*61046927SAndroid Build Coastguard Workerclass Meson: 349*61046927SAndroid Build Coastguard Worker def __init__(self, compiler): 350*61046927SAndroid Build Coastguard Worker self._compiler = compiler 351*61046927SAndroid Build Coastguard Worker 352*61046927SAndroid Build Coastguard Worker def get_compiler(self, language_string, native=False): 353*61046927SAndroid Build Coastguard Worker return self._compiler 354*61046927SAndroid Build Coastguard Worker 355*61046927SAndroid Build Coastguard Worker def set_compiler(self, compiler): 356*61046927SAndroid Build Coastguard Worker self._compiler = compiler 357*61046927SAndroid Build Coastguard Worker 358*61046927SAndroid Build Coastguard Worker def project_version(self): 359*61046927SAndroid Build Coastguard Worker return _gProjectVersion 360*61046927SAndroid Build Coastguard Worker 361*61046927SAndroid Build Coastguard Worker def project_source_root(self): 362*61046927SAndroid Build Coastguard Worker return os.getcwd() 363*61046927SAndroid Build Coastguard Worker 364*61046927SAndroid Build Coastguard Worker def is_cross_build(self): 365*61046927SAndroid Build Coastguard Worker return True 366*61046927SAndroid Build Coastguard Worker 367*61046927SAndroid Build Coastguard Worker def can_run_host_binaries(self): 368*61046927SAndroid Build Coastguard Worker return False 369*61046927SAndroid Build Coastguard Worker 370*61046927SAndroid Build Coastguard Worker def current_source_dir(self): 371*61046927SAndroid Build Coastguard Worker return os.getcwd() 372*61046927SAndroid Build Coastguard Worker 373*61046927SAndroid Build Coastguard Worker def current_build_dir(self): 374*61046927SAndroid Build Coastguard Worker return '@CURRENT_BUILD_DIR@' 375*61046927SAndroid Build Coastguard Worker 376*61046927SAndroid Build Coastguard Worker def project_build_root(self): 377*61046927SAndroid Build Coastguard Worker return '@PROJECT_BUILD_ROOT@' 378*61046927SAndroid Build Coastguard Worker 379*61046927SAndroid Build Coastguard Worker def add_devenv(self, env): 380*61046927SAndroid Build Coastguard Worker return 381*61046927SAndroid Build Coastguard Worker 382*61046927SAndroid Build Coastguard Worker 383*61046927SAndroid Build Coastguard Workerclass Compiler(ABC): 384*61046927SAndroid Build Coastguard Worker def __init__(self, cpu_family): 385*61046927SAndroid Build Coastguard Worker self._id = 'clang' 386*61046927SAndroid Build Coastguard Worker self._cpu_family = cpu_family 387*61046927SAndroid Build Coastguard Worker 388*61046927SAndroid Build Coastguard Worker @abstractmethod 389*61046927SAndroid Build Coastguard Worker def has_header_symbol( 390*61046927SAndroid Build Coastguard Worker self, 391*61046927SAndroid Build Coastguard Worker header: str, 392*61046927SAndroid Build Coastguard Worker symbol: str, 393*61046927SAndroid Build Coastguard Worker args=None, 394*61046927SAndroid Build Coastguard Worker dependencies=None, 395*61046927SAndroid Build Coastguard Worker include_directories=None, 396*61046927SAndroid Build Coastguard Worker no_builtin_args: bool = False, 397*61046927SAndroid Build Coastguard Worker prefix=None, 398*61046927SAndroid Build Coastguard Worker required: bool = False, 399*61046927SAndroid Build Coastguard Worker ) -> bool: 400*61046927SAndroid Build Coastguard Worker pass 401*61046927SAndroid Build Coastguard Worker 402*61046927SAndroid Build Coastguard Worker @abstractmethod 403*61046927SAndroid Build Coastguard Worker def check_header(self, header: str, prefix: str = '') -> bool: 404*61046927SAndroid Build Coastguard Worker pass 405*61046927SAndroid Build Coastguard Worker 406*61046927SAndroid Build Coastguard Worker @abstractmethod 407*61046927SAndroid Build Coastguard Worker def has_function(self, function, args=None, prefix='', dependencies='') -> bool: 408*61046927SAndroid Build Coastguard Worker pass 409*61046927SAndroid Build Coastguard Worker 410*61046927SAndroid Build Coastguard Worker @abstractmethod 411*61046927SAndroid Build Coastguard Worker def links(self, snippet: str, name: str, args=None, dependencies=None) -> bool: 412*61046927SAndroid Build Coastguard Worker pass 413*61046927SAndroid Build Coastguard Worker 414*61046927SAndroid Build Coastguard Worker def get_id(self): 415*61046927SAndroid Build Coastguard Worker return self._id 416*61046927SAndroid Build Coastguard Worker 417*61046927SAndroid Build Coastguard Worker def is_symbol_supported(self, header: str, symbol: str): 418*61046927SAndroid Build Coastguard Worker if header == 'sys/mkdev.h' or symbol == 'program_invocation_name': 419*61046927SAndroid Build Coastguard Worker return False 420*61046927SAndroid Build Coastguard Worker return True 421*61046927SAndroid Build Coastguard Worker 422*61046927SAndroid Build Coastguard Worker def is_function_supported(self, function: str): 423*61046927SAndroid Build Coastguard Worker if ( 424*61046927SAndroid Build Coastguard Worker function == 'qsort_s' 425*61046927SAndroid Build Coastguard Worker or function == 'pthread_setaffinity_np' 426*61046927SAndroid Build Coastguard Worker or function == 'secure_getenv' 427*61046927SAndroid Build Coastguard Worker ): 428*61046927SAndroid Build Coastguard Worker return False 429*61046927SAndroid Build Coastguard Worker return True 430*61046927SAndroid Build Coastguard Worker 431*61046927SAndroid Build Coastguard Worker def is_link_supported(self, name: str): 432*61046927SAndroid Build Coastguard Worker if name == 'GNU qsort_r' or name == 'BSD qsort_r': 433*61046927SAndroid Build Coastguard Worker return False 434*61046927SAndroid Build Coastguard Worker return True 435*61046927SAndroid Build Coastguard Worker 436*61046927SAndroid Build Coastguard Worker def is_header_supported(self, header: str): 437*61046927SAndroid Build Coastguard Worker if ( 438*61046927SAndroid Build Coastguard Worker header == 'xlocale.h' 439*61046927SAndroid Build Coastguard Worker or header == 'pthread_np.h' 440*61046927SAndroid Build Coastguard Worker or header == 'renderdoc_app.h' 441*61046927SAndroid Build Coastguard Worker ): 442*61046927SAndroid Build Coastguard Worker return False 443*61046927SAndroid Build Coastguard Worker return True 444*61046927SAndroid Build Coastguard Worker 445*61046927SAndroid Build Coastguard Worker def get_define(self, define: str, prefix: str): 446*61046927SAndroid Build Coastguard Worker if define == 'ETIME': 447*61046927SAndroid Build Coastguard Worker return define 448*61046927SAndroid Build Coastguard Worker exit('Unhandled define: ' + define) 449*61046927SAndroid Build Coastguard Worker 450*61046927SAndroid Build Coastguard Worker def get_supported_function_attributes(self, attributes: list[str]): 451*61046927SAndroid Build Coastguard Worker # Assume all are supported 452*61046927SAndroid Build Coastguard Worker return attributes 453*61046927SAndroid Build Coastguard Worker 454*61046927SAndroid Build Coastguard Worker def has_function_attribute(self, attribute: str): 455*61046927SAndroid Build Coastguard Worker return True 456*61046927SAndroid Build Coastguard Worker 457*61046927SAndroid Build Coastguard Worker def has_argument(self, name: str): 458*61046927SAndroid Build Coastguard Worker result = True 459*61046927SAndroid Build Coastguard Worker print("has_argument '%s': %s" % (name, str(result))) 460*61046927SAndroid Build Coastguard Worker return result 461*61046927SAndroid Build Coastguard Worker 462*61046927SAndroid Build Coastguard Worker def has_link_argument(self, name: str): 463*61046927SAndroid Build Coastguard Worker result = True 464*61046927SAndroid Build Coastguard Worker print("has_link_argument '%s': %s" % (name, str(result))) 465*61046927SAndroid Build Coastguard Worker return result 466*61046927SAndroid Build Coastguard Worker 467*61046927SAndroid Build Coastguard Worker def compiles(self, snippet, name: str): 468*61046927SAndroid Build Coastguard Worker # Exclude what is currently not working. 469*61046927SAndroid Build Coastguard Worker result = True 470*61046927SAndroid Build Coastguard Worker if name == '__uint128_t': 471*61046927SAndroid Build Coastguard Worker result = False 472*61046927SAndroid Build Coastguard Worker print("compiles '%s': %s" % (name, str(result))) 473*61046927SAndroid Build Coastguard Worker return result 474*61046927SAndroid Build Coastguard Worker 475*61046927SAndroid Build Coastguard Worker def has_member(self, struct, member, prefix): 476*61046927SAndroid Build Coastguard Worker # Assume it does 477*61046927SAndroid Build Coastguard Worker return True 478*61046927SAndroid Build Coastguard Worker 479*61046927SAndroid Build Coastguard Worker def get_argument_syntax(self): 480*61046927SAndroid Build Coastguard Worker return 'gcc' 481*61046927SAndroid Build Coastguard Worker 482*61046927SAndroid Build Coastguard Worker def get_supported_arguments(self, args): 483*61046927SAndroid Build Coastguard Worker supported_args = [] 484*61046927SAndroid Build Coastguard Worker for arg in args: 485*61046927SAndroid Build Coastguard Worker if ( 486*61046927SAndroid Build Coastguard Worker arg.startswith('-flifetime-dse') 487*61046927SAndroid Build Coastguard Worker or arg.startswith('-Wno-format-truncation') 488*61046927SAndroid Build Coastguard Worker or arg.startswith('-Wno-nonnull-compare') 489*61046927SAndroid Build Coastguard Worker or arg.startswith('-Wno-class-memaccess') 490*61046927SAndroid Build Coastguard Worker or arg.startswith('-Wno-format-truncation') 491*61046927SAndroid Build Coastguard Worker ): 492*61046927SAndroid Build Coastguard Worker continue 493*61046927SAndroid Build Coastguard Worker supported_args.append(arg) 494*61046927SAndroid Build Coastguard Worker return supported_args 495*61046927SAndroid Build Coastguard Worker 496*61046927SAndroid Build Coastguard Worker def get_supported_link_arguments(self, args): 497*61046927SAndroid Build Coastguard Worker return args 498*61046927SAndroid Build Coastguard Worker 499*61046927SAndroid Build Coastguard Worker def find_library(self, name, required=False): 500*61046927SAndroid Build Coastguard Worker if name == 'ws2_32' or name == 'elf' or name == 'm' or name == 'sensors': 501*61046927SAndroid Build Coastguard Worker return Dependency(name, found=required) 502*61046927SAndroid Build Coastguard Worker exit('Unhandled library: ' + name) 503*61046927SAndroid Build Coastguard Worker 504*61046927SAndroid Build Coastguard Worker def sizeof(self, string): 505*61046927SAndroid Build Coastguard Worker table = _get_sizeof_table(self._cpu_family) 506*61046927SAndroid Build Coastguard Worker 507*61046927SAndroid Build Coastguard Worker if string not in table: 508*61046927SAndroid Build Coastguard Worker exit('Unhandled compiler sizeof: ' + string) 509*61046927SAndroid Build Coastguard Worker return table[string] 510*61046927SAndroid Build Coastguard Worker 511*61046927SAndroid Build Coastguard Worker 512*61046927SAndroid Build Coastguard Workerclass PkgConfigModule: 513*61046927SAndroid Build Coastguard Worker def generate( 514*61046927SAndroid Build Coastguard Worker self, 515*61046927SAndroid Build Coastguard Worker lib, 516*61046927SAndroid Build Coastguard Worker name='', 517*61046927SAndroid Build Coastguard Worker description='', 518*61046927SAndroid Build Coastguard Worker extra_cflags=None, 519*61046927SAndroid Build Coastguard Worker filebase='', 520*61046927SAndroid Build Coastguard Worker version='', 521*61046927SAndroid Build Coastguard Worker libraries=None, 522*61046927SAndroid Build Coastguard Worker libraries_private=None, 523*61046927SAndroid Build Coastguard Worker ): 524*61046927SAndroid Build Coastguard Worker pass 525*61046927SAndroid Build Coastguard Worker 526*61046927SAndroid Build Coastguard Worker 527*61046927SAndroid Build Coastguard Worker################################################################################################### 528*61046927SAndroid Build Coastguard Worker 529*61046927SAndroid Build Coastguard Worker 530*61046927SAndroid Build Coastguard Workerdef fprint(args): 531*61046927SAndroid Build Coastguard Worker print(args, file=_gOutputFile) 532*61046927SAndroid Build Coastguard Worker 533*61046927SAndroid Build Coastguard Worker 534*61046927SAndroid Build Coastguard Workerdef set_relative_dir(dir): 535*61046927SAndroid Build Coastguard Worker global _gRelativeDir 536*61046927SAndroid Build Coastguard Worker _gRelativeDir = dir 537*61046927SAndroid Build Coastguard Worker 538*61046927SAndroid Build Coastguard Worker 539*61046927SAndroid Build Coastguard Workerdef open_output_file(name): 540*61046927SAndroid Build Coastguard Worker global _gOutputFile 541*61046927SAndroid Build Coastguard Worker _gOutputFile = open(name, 'w') 542*61046927SAndroid Build Coastguard Worker 543*61046927SAndroid Build Coastguard Worker 544*61046927SAndroid Build Coastguard Workerdef close_output_file(): 545*61046927SAndroid Build Coastguard Worker global _gOutputFile 546*61046927SAndroid Build Coastguard Worker _gOutputFile.close() 547*61046927SAndroid Build Coastguard Worker 548*61046927SAndroid Build Coastguard Worker 549*61046927SAndroid Build Coastguard Workerdef get_relative_dir(path_or_file=''): 550*61046927SAndroid Build Coastguard Worker if isinstance(path_or_file, File): 551*61046927SAndroid Build Coastguard Worker return path_or_file.name 552*61046927SAndroid Build Coastguard Worker 553*61046927SAndroid Build Coastguard Worker assert isinstance(path_or_file, str) 554*61046927SAndroid Build Coastguard Worker if path_or_file == '': 555*61046927SAndroid Build Coastguard Worker return _gRelativeDir 556*61046927SAndroid Build Coastguard Worker return os.path.join(_gRelativeDir, path_or_file) 557*61046927SAndroid Build Coastguard Worker 558*61046927SAndroid Build Coastguard Worker 559*61046927SAndroid Build Coastguard Workerdef get_relative_gen_dir(path=''): 560*61046927SAndroid Build Coastguard Worker return os.path.join(_gRelativeDir, path) 561*61046927SAndroid Build Coastguard Worker 562*61046927SAndroid Build Coastguard Worker 563*61046927SAndroid Build Coastguard Workerdef project(name, language_list, version, license, meson_version, default_options): 564*61046927SAndroid Build Coastguard Worker if type(version) is str: 565*61046927SAndroid Build Coastguard Worker _gProjectVersion = version 566*61046927SAndroid Build Coastguard Worker else: 567*61046927SAndroid Build Coastguard Worker assert type(version) is list 568*61046927SAndroid Build Coastguard Worker version_file = version[0] 569*61046927SAndroid Build Coastguard Worker assert type(version_file) is File 570*61046927SAndroid Build Coastguard Worker with open(version_file.name, 'r') as file: 571*61046927SAndroid Build Coastguard Worker for line in file: 572*61046927SAndroid Build Coastguard Worker _gProjectVersion = line.strip() 573*61046927SAndroid Build Coastguard Worker break 574*61046927SAndroid Build Coastguard Worker 575*61046927SAndroid Build Coastguard Worker for option in default_options: 576*61046927SAndroid Build Coastguard Worker value_pair = option.split('=') 577*61046927SAndroid Build Coastguard Worker _gProjectOptions.append(SimpleOption(value_pair[0], value_pair[1])) 578*61046927SAndroid Build Coastguard Worker 579*61046927SAndroid Build Coastguard Worker 580*61046927SAndroid Build Coastguard Workerdef get_project_options(): 581*61046927SAndroid Build Coastguard Worker return _gProjectOptions 582*61046927SAndroid Build Coastguard Worker 583*61046927SAndroid Build Coastguard Worker 584*61046927SAndroid Build Coastguard Workerdef add_project_arguments(args, language=[], native=False): 585*61046927SAndroid Build Coastguard Worker global _gProjectCflags, _gProjectCppflags 586*61046927SAndroid Build Coastguard Worker if type(args) is not list: 587*61046927SAndroid Build Coastguard Worker args = [args] 588*61046927SAndroid Build Coastguard Worker for lang in language: 589*61046927SAndroid Build Coastguard Worker for arg in args: 590*61046927SAndroid Build Coastguard Worker if isinstance(arg, list): 591*61046927SAndroid Build Coastguard Worker add_project_arguments(arg, language=language, native=native) 592*61046927SAndroid Build Coastguard Worker continue 593*61046927SAndroid Build Coastguard Worker assert isinstance(arg, str) 594*61046927SAndroid Build Coastguard Worker if lang == 'c': 595*61046927SAndroid Build Coastguard Worker print('cflags: ' + arg) 596*61046927SAndroid Build Coastguard Worker _gProjectCflags.append(arg) 597*61046927SAndroid Build Coastguard Worker elif lang == 'cpp': 598*61046927SAndroid Build Coastguard Worker print('cppflags: ' + arg) 599*61046927SAndroid Build Coastguard Worker _gProjectCppflags.append(arg) 600*61046927SAndroid Build Coastguard Worker else: 601*61046927SAndroid Build Coastguard Worker exit('Unhandle arguments language: ' + lang) 602*61046927SAndroid Build Coastguard Worker 603*61046927SAndroid Build Coastguard Worker 604*61046927SAndroid Build Coastguard Workerdef get_project_cflags(): 605*61046927SAndroid Build Coastguard Worker return _gProjectCflags 606*61046927SAndroid Build Coastguard Worker 607*61046927SAndroid Build Coastguard Worker 608*61046927SAndroid Build Coastguard Workerdef get_project_cppflags(): 609*61046927SAndroid Build Coastguard Worker return _gProjectCppflags 610*61046927SAndroid Build Coastguard Worker 611*61046927SAndroid Build Coastguard Worker 612*61046927SAndroid Build Coastguard Workerdef _get_sizeof_table(cpu_family): 613*61046927SAndroid Build Coastguard Worker table_32 = {'void*': 4} 614*61046927SAndroid Build Coastguard Worker table_64 = {'void*': 8} 615*61046927SAndroid Build Coastguard Worker if cpu_family == 'arm' or cpu_family == 'x86_64': 616*61046927SAndroid Build Coastguard Worker table = table_32 617*61046927SAndroid Build Coastguard Worker elif cpu_family == 'aarch64': 618*61046927SAndroid Build Coastguard Worker table = table_64 619*61046927SAndroid Build Coastguard Worker else: 620*61046927SAndroid Build Coastguard Worker exit('sizeof unhandled cpu family: %s' % cpu_family) 621*61046927SAndroid Build Coastguard Worker return table 622*61046927SAndroid Build Coastguard Worker 623*61046927SAndroid Build Coastguard Worker 624*61046927SAndroid Build Coastguard Workerdef get_linear_list(arg_list): 625*61046927SAndroid Build Coastguard Worker args = [] 626*61046927SAndroid Build Coastguard Worker for arg in arg_list: 627*61046927SAndroid Build Coastguard Worker if type(arg) is list: 628*61046927SAndroid Build Coastguard Worker args.extend(get_linear_list(arg)) 629*61046927SAndroid Build Coastguard Worker else: 630*61046927SAndroid Build Coastguard Worker args.append(arg) 631*61046927SAndroid Build Coastguard Worker return args 632*61046927SAndroid Build Coastguard Worker 633*61046927SAndroid Build Coastguard Worker 634*61046927SAndroid Build Coastguard Workerdef load_dependencies(config): 635*61046927SAndroid Build Coastguard Worker with open(config, 'rb') as f: 636*61046927SAndroid Build Coastguard Worker data = tomllib.load(f) 637*61046927SAndroid Build Coastguard Worker project_configs = data.get('project_config') 638*61046927SAndroid Build Coastguard Worker base_config = data.get('base_project_config') 639*61046927SAndroid Build Coastguard Worker # global dependencies 640*61046927SAndroid Build Coastguard Worker for dep_name, targets in base_config.get('ext_dependencies').items(): 641*61046927SAndroid Build Coastguard Worker dep_targets = { 642*61046927SAndroid Build Coastguard Worker t.get('target_name'): t.get('target_type') for t in targets 643*61046927SAndroid Build Coastguard Worker } 644*61046927SAndroid Build Coastguard Worker external_dep[dep_name] = dep_targets 645*61046927SAndroid Build Coastguard Worker # project specific dependencies 646*61046927SAndroid Build Coastguard Worker for project_config in project_configs: 647*61046927SAndroid Build Coastguard Worker dependencies = project_config.get('ext_dependencies') 648*61046927SAndroid Build Coastguard Worker for dep_name, targets in dependencies.items(): 649*61046927SAndroid Build Coastguard Worker dep_targets = { 650*61046927SAndroid Build Coastguard Worker t.get('target_name'): t.get('target_type') for t in targets 651*61046927SAndroid Build Coastguard Worker } 652*61046927SAndroid Build Coastguard Worker external_dep[dep_name] = dep_targets 653*61046927SAndroid Build Coastguard Worker 654*61046927SAndroid Build Coastguard Worker 655*61046927SAndroid Build Coastguard Workerdef dependency(*names, required=True, version=''): 656*61046927SAndroid Build Coastguard Worker for name in names: 657*61046927SAndroid Build Coastguard Worker print('dependency: %s' % name) 658*61046927SAndroid Build Coastguard Worker if name == '': 659*61046927SAndroid Build Coastguard Worker return Dependency('null', version, found=False) 660*61046927SAndroid Build Coastguard Worker 661*61046927SAndroid Build Coastguard Worker if name in external_dep: 662*61046927SAndroid Build Coastguard Worker targets = external_dep.get(name) 663*61046927SAndroid Build Coastguard Worker return Dependency( 664*61046927SAndroid Build Coastguard Worker name, 665*61046927SAndroid Build Coastguard Worker targets=[ 666*61046927SAndroid Build Coastguard Worker DependencyTarget(t, DependencyTargetType(targets[t])) 667*61046927SAndroid Build Coastguard Worker for t in targets 668*61046927SAndroid Build Coastguard Worker ], 669*61046927SAndroid Build Coastguard Worker version=version, 670*61046927SAndroid Build Coastguard Worker found=True, 671*61046927SAndroid Build Coastguard Worker ) 672*61046927SAndroid Build Coastguard Worker # TODO(bpnguyen): Move these hardcoded dependencies to a global config 673*61046927SAndroid Build Coastguard Worker if ( 674*61046927SAndroid Build Coastguard Worker name == 'backtrace' 675*61046927SAndroid Build Coastguard Worker or name == 'curses' 676*61046927SAndroid Build Coastguard Worker or name == 'expat' 677*61046927SAndroid Build Coastguard Worker or name == 'libconfig' 678*61046927SAndroid Build Coastguard Worker or name == 'libmagma_virt' 679*61046927SAndroid Build Coastguard Worker or name == 'libva' 680*61046927SAndroid Build Coastguard Worker or name == 'libzstd' 681*61046927SAndroid Build Coastguard Worker or name == 'libdrm' 682*61046927SAndroid Build Coastguard Worker or name == 'libglvnd' 683*61046927SAndroid Build Coastguard Worker or name == 'libudev' 684*61046927SAndroid Build Coastguard Worker or name == 'libunwind' 685*61046927SAndroid Build Coastguard Worker or name == 'llvm' 686*61046927SAndroid Build Coastguard Worker or name == 'libxml-2.0' 687*61046927SAndroid Build Coastguard Worker or name == 'lua54' 688*61046927SAndroid Build Coastguard Worker or name == 'valgrind' 689*61046927SAndroid Build Coastguard Worker or name == 'wayland-scanner' 690*61046927SAndroid Build Coastguard Worker or name == 'SPIRV-Tools' 691*61046927SAndroid Build Coastguard Worker ): 692*61046927SAndroid Build Coastguard Worker return Dependency(name, version, found=False) 693*61046927SAndroid Build Coastguard Worker 694*61046927SAndroid Build Coastguard Worker if ( 695*61046927SAndroid Build Coastguard Worker name == 'libarchive' 696*61046927SAndroid Build Coastguard Worker or name == 'libelf' 697*61046927SAndroid Build Coastguard Worker or name == 'threads' 698*61046927SAndroid Build Coastguard Worker or name == 'vdpau' 699*61046927SAndroid Build Coastguard Worker ): 700*61046927SAndroid Build Coastguard Worker return Dependency(name, version, found=required) 701*61046927SAndroid Build Coastguard Worker 702*61046927SAndroid Build Coastguard Worker exit('Unhandled dependency: ' + name) 703*61046927SAndroid Build Coastguard Worker 704*61046927SAndroid Build Coastguard Worker 705*61046927SAndroid Build Coastguard Workerdef get_set_of_deps(deps, set_of_deps=set()): 706*61046927SAndroid Build Coastguard Worker for dep in deps: 707*61046927SAndroid Build Coastguard Worker if type(dep) is list: 708*61046927SAndroid Build Coastguard Worker set_of_deps = get_set_of_deps(dep, set_of_deps) 709*61046927SAndroid Build Coastguard Worker elif dep not in set_of_deps: 710*61046927SAndroid Build Coastguard Worker set_of_deps.add(dep) 711*61046927SAndroid Build Coastguard Worker set_of_deps = get_set_of_deps(dep.dependencies, set_of_deps) 712*61046927SAndroid Build Coastguard Worker return set_of_deps 713*61046927SAndroid Build Coastguard Worker 714*61046927SAndroid Build Coastguard Worker 715*61046927SAndroid Build Coastguard Workerdef get_include_dirs(paths) -> list[str]: 716*61046927SAndroid Build Coastguard Worker dir_list = [] 717*61046927SAndroid Build Coastguard Worker for path in paths: 718*61046927SAndroid Build Coastguard Worker if type(path) is list: 719*61046927SAndroid Build Coastguard Worker dir_list.extend(get_include_dirs(p for p in path)) 720*61046927SAndroid Build Coastguard Worker elif type(path) is IncludeDirectories: 721*61046927SAndroid Build Coastguard Worker dir_list.extend(path.dirs) 722*61046927SAndroid Build Coastguard Worker else: 723*61046927SAndroid Build Coastguard Worker assert type(path) is str 724*61046927SAndroid Build Coastguard Worker dir_list.append(get_relative_dir(path)) 725*61046927SAndroid Build Coastguard Worker return dir_list 726*61046927SAndroid Build Coastguard Worker 727*61046927SAndroid Build Coastguard Worker 728*61046927SAndroid Build Coastguard Workerdef get_include_directories(includes) -> list[IncludeDirectories]: 729*61046927SAndroid Build Coastguard Worker dirs = [] 730*61046927SAndroid Build Coastguard Worker if type(includes) is list: 731*61046927SAndroid Build Coastguard Worker for inc in includes: 732*61046927SAndroid Build Coastguard Worker dirs.extend(get_include_directories(inc)) 733*61046927SAndroid Build Coastguard Worker elif type(includes) is IncludeDirectories: 734*61046927SAndroid Build Coastguard Worker dirs.extend(includes) 735*61046927SAndroid Build Coastguard Worker else: 736*61046927SAndroid Build Coastguard Worker assert type(includes) is str 737*61046927SAndroid Build Coastguard Worker exit('get_include_directories got string: %s' % includes) 738*61046927SAndroid Build Coastguard Worker return dirs 739*61046927SAndroid Build Coastguard Worker 740*61046927SAndroid Build Coastguard Worker 741*61046927SAndroid Build Coastguard Workerdef get_static_libs(arg_list): 742*61046927SAndroid Build Coastguard Worker libs = [] 743*61046927SAndroid Build Coastguard Worker for arg in arg_list: 744*61046927SAndroid Build Coastguard Worker if type(arg) is list: 745*61046927SAndroid Build Coastguard Worker libs.extend(get_static_libs(arg)) 746*61046927SAndroid Build Coastguard Worker else: 747*61046927SAndroid Build Coastguard Worker assert type(arg) is StaticLibrary 748*61046927SAndroid Build Coastguard Worker libs.extend(get_static_libs(arg.link_with)) 749*61046927SAndroid Build Coastguard Worker libs.append(arg) 750*61046927SAndroid Build Coastguard Worker return libs 751*61046927SAndroid Build Coastguard Worker 752*61046927SAndroid Build Coastguard Worker 753*61046927SAndroid Build Coastguard Workerdef get_whole_static_libs(arg_list): 754*61046927SAndroid Build Coastguard Worker libs = [] 755*61046927SAndroid Build Coastguard Worker for arg in arg_list: 756*61046927SAndroid Build Coastguard Worker if type(arg) is list: 757*61046927SAndroid Build Coastguard Worker libs.extend(get_whole_static_libs(arg)) 758*61046927SAndroid Build Coastguard Worker else: 759*61046927SAndroid Build Coastguard Worker assert type(arg) is StaticLibrary 760*61046927SAndroid Build Coastguard Worker libs.extend(get_whole_static_libs(arg._link_whole)) 761*61046927SAndroid Build Coastguard Worker libs.append(arg) 762*61046927SAndroid Build Coastguard Worker return libs 763*61046927SAndroid Build Coastguard Worker 764*61046927SAndroid Build Coastguard Worker 765*61046927SAndroid Build Coastguard Workerdef get_list_of_relative_inputs(list_or_string): 766*61046927SAndroid Build Coastguard Worker if isinstance(list_or_string, list): 767*61046927SAndroid Build Coastguard Worker ret = [] 768*61046927SAndroid Build Coastguard Worker for item in list_or_string: 769*61046927SAndroid Build Coastguard Worker ret.extend(get_list_of_relative_inputs(item)) 770*61046927SAndroid Build Coastguard Worker return ret 771*61046927SAndroid Build Coastguard Worker 772*61046927SAndroid Build Coastguard Worker return [get_relative_dir(list_or_string)] 773*61046927SAndroid Build Coastguard Worker 774*61046927SAndroid Build Coastguard Worker 775*61046927SAndroid Build Coastguard Workerdef get_command_line_from_args(args: list): 776*61046927SAndroid Build Coastguard Worker command_line = '' 777*61046927SAndroid Build Coastguard Worker for arg in args: 778*61046927SAndroid Build Coastguard Worker command_line += ' ' + arg 779*61046927SAndroid Build Coastguard Worker # Escape angle brackets 780*61046927SAndroid Build Coastguard Worker command_line = re.sub(r'(<|>)', '\\\\\\\\\g<1>', command_line) 781*61046927SAndroid Build Coastguard Worker return command_line 782*61046927SAndroid Build Coastguard Worker 783*61046927SAndroid Build Coastguard Worker 784*61046927SAndroid Build Coastguard Workerdef replace_wrapped_input_with_target(args, python_script, python_script_target_name): 785*61046927SAndroid Build Coastguard Worker outargs = [] 786*61046927SAndroid Build Coastguard Worker for index, arg in enumerate(args): 787*61046927SAndroid Build Coastguard Worker pattern = '(.*?)(' + python_script + ')' 788*61046927SAndroid Build Coastguard Worker replace = '\g<1>' + python_script_target_name 789*61046927SAndroid Build Coastguard Worker outargs.append(re.sub(pattern, replace, arg)) 790*61046927SAndroid Build Coastguard Worker return outargs 791