xref: /aosp_15_r20/external/mesa3d/meson_to_hermetic/meson_impl.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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