1# Copyright (c) 2020 The Linux Foundation
2#
3# SPDX-License-Identifier: Apache-2.0
4
5from enum import Enum
6
7
8class Codemodel:
9
10    def __init__(self):
11        super().__init__()
12
13        self.paths_source = ""
14        self.paths_build = ""
15        self.configurations = []
16
17    def __repr__(self):
18        return f"Codemodel: source {self.paths_source}, build {self.paths_build}"
19
20# A member of the codemodel configurations array
21class Config:
22
23    def __init__(self):
24        super().__init__()
25
26        self.name = ""
27        self.directories = []
28        self.projects = []
29        self.configTargets = []
30
31    def __repr__(self):
32        if self.name == "":
33            return "Config: [no name]"
34        else:
35            return f"Config: {self.name}"
36
37# A member of the configuration.directories array
38class ConfigDir:
39
40    def __init__(self):
41        super().__init__()
42
43        self.source = ""
44        self.build = ""
45        self.parentIndex = -1
46        self.childIndexes = []
47        self.projectIndex = -1
48        self.targetIndexes = []
49        self.minimumCMakeVersion = ""
50        self.hasInstallRule = False
51
52        # actual items, calculated from indices after loading
53        self.parent = None
54        self.children = []
55        self.project = None
56        self.targets = []
57
58    def __repr__(self):
59        return f"ConfigDir: source {self.source}, build {self.build}"
60
61# A member of the configuration.projects array
62class ConfigProject:
63
64    def __init__(self):
65        super().__init__()
66
67        self.name = ""
68        self.parentIndex = -1
69        self.childIndexes = []
70        self.directoryIndexes = []
71        self.targetIndexes = []
72
73        # actual items, calculated from indices after loading
74        self.parent = None
75        self.children = []
76        self.directories = []
77        self.targets = []
78
79    def __repr__(self):
80        return f"ConfigProject: {self.name}"
81
82# A member of the configuration.configTargets array
83class ConfigTarget:
84
85    def __init__(self):
86        super().__init__()
87
88        self.name = ""
89        self.id = ""
90        self.directoryIndex = -1
91        self.projectIndex = -1
92        self.jsonFile = ""
93
94        # actual target data, loaded from self.jsonFile
95        self.target = None
96
97        # actual items, calculated from indices after loading
98        self.directory = None
99        self.project = None
100
101    def __repr__(self):
102        return f"ConfigTarget: {self.name}"
103
104# The available values for Target.type
105class TargetType(Enum):
106    UNKNOWN = 0
107    EXECUTABLE = 1
108    STATIC_LIBRARY = 2
109    SHARED_LIBRARY = 3
110    MODULE_LIBRARY = 4
111    OBJECT_LIBRARY = 5
112    UTILITY = 6
113
114# A member of the target.install_destinations array
115class TargetInstallDestination:
116
117    def __init__(self):
118        super().__init__()
119
120        self.path = ""
121        self.backtrace = -1
122
123    def __repr__(self):
124        return f"TargetInstallDestination: {self.path}"
125
126# A member of the target.link_commandFragments and
127# archive_commandFragments array
128class TargetCommandFragment:
129
130    def __init__(self):
131        super().__init__()
132
133        self.fragment = ""
134        self.role = ""
135
136    def __repr__(self):
137        return f"TargetCommandFragment: {self.fragment}"
138
139# A member of the target.dependencies array
140class TargetDependency:
141
142    def __init__(self):
143        super().__init__()
144
145        self.id = ""
146        self.backtrace = -1
147
148    def __repr__(self):
149        return f"TargetDependency: {self.id}"
150
151# A member of the target.sources array
152class TargetSource:
153
154    def __init__(self):
155        super().__init__()
156
157        self.path = ""
158        self.compileGroupIndex = -1
159        self.sourceGroupIndex = -1
160        self.isGenerated = False
161        self.backtrace = -1
162
163        # actual items, calculated from indices after loading
164        self.compileGroup = None
165        self.sourceGroup = None
166
167    def __repr__(self):
168        return f"TargetSource: {self.path}"
169
170# A member of the target.sourceGroups array
171class TargetSourceGroup:
172
173    def __init__(self):
174        super().__init__()
175
176        self.name = ""
177        self.sourceIndexes = []
178
179        # actual items, calculated from indices after loading
180        self.sources = []
181
182    def __repr__(self):
183        return f"TargetSourceGroup: {self.name}"
184
185# A member of the target.compileGroups.includes array
186class TargetCompileGroupInclude:
187
188    def __init__(self):
189        super().__init__()
190
191        self.path = ""
192        self.isSystem = False
193        self.backtrace = -1
194
195    def __repr__(self):
196        return f"TargetCompileGroupInclude: {self.path}"
197
198# A member of the target.compileGroups.precompileHeaders array
199class TargetCompileGroupPrecompileHeader:
200
201    def __init__(self):
202        super().__init__()
203
204        self.header = ""
205        self.backtrace = -1
206
207    def __repr__(self):
208        return f"TargetCompileGroupPrecompileHeader: {self.header}"
209
210# A member of the target.compileGroups.defines array
211class TargetCompileGroupDefine:
212
213    def __init__(self):
214        super().__init__()
215
216        self.define = ""
217        self.backtrace = -1
218
219    def __repr__(self):
220        return f"TargetCompileGroupDefine: {self.define}"
221
222# A member of the target.compileGroups array
223class TargetCompileGroup:
224
225    def __init__(self):
226        super().__init__()
227
228        self.sourceIndexes = []
229        self.language = ""
230        self.compileCommandFragments = []
231        self.includes = []
232        self.precompileHeaders = []
233        self.defines = []
234        self.sysroot = ""
235
236        # actual items, calculated from indices after loading
237        self.sources = []
238
239    def __repr__(self):
240        return f"TargetCompileGroup: {self.sources}"
241
242# A member of the target.backtraceGraph_nodes array
243class TargetBacktraceGraphNode:
244
245    def __init__(self):
246        super().__init__()
247
248        self.file = -1
249        self.line = -1
250        self.command = -1
251        self.parent = -1
252
253    def __repr__(self):
254        return f"TargetBacktraceGraphNode: {self.command}"
255
256# Actual data in config.target.target, loaded from
257# config.target.jsonFile
258class Target:
259
260    def __init__(self):
261        super().__init__()
262
263        self.name = ""
264        self.id = ""
265        self.type = TargetType.UNKNOWN
266        self.backtrace = -1
267        self.folder = ""
268        self.paths_source = ""
269        self.paths_build = ""
270        self.nameOnDisk = ""
271        self.artifacts = []
272        self.isGeneratorProvided = False
273
274        # only if install rule is present
275        self.install_prefix = ""
276        self.install_destinations = []
277
278        # only for executables and shared library targets that link into
279        # a runtime binary
280        self.link_language = ""
281        self.link_commandFragments = []
282        self.link_lto = False
283        self.link_sysroot = ""
284
285        # only for static library targets
286        self.archive_commandFragments = []
287        self.archive_lto = False
288
289        # only if the target depends on other targets
290        self.dependencies = []
291
292        # corresponds to target's source files
293        self.sources = []
294
295        # only if sources are grouped together by source_group() or by default
296        self.sourceGroups = []
297
298        # only if target has sources that compile
299        self.compileGroups = []
300
301        # graph of backtraces referenced from elsewhere
302        self.backtraceGraph_nodes = []
303        self.backtraceGraph_commands = []
304        self.backtraceGraph_files = []
305
306    def __repr__(self):
307        return f"Target: {self.name}"
308