]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Workspace/BuildClassObject.py
Revert BaseTools: PYTHON3 migration
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / BuildClassObject.py
1 ## @file
2 # This file is used to define each component of the build database
3 #
4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
5 # This program and the accompanying materials
6 # are licensed and made available under the terms and conditions of the BSD License
7 # which accompanies this distribution. The full text of the license may be found at
8 # http://opensource.org/licenses/bsd-license.php
9 #
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 #
13
14 from collections import OrderedDict, namedtuple
15 from Common.DataType import *
16 import collections
17 import re
18 from collections import OrderedDict
19 StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')
20 ArrayIndex = re.compile("\[\s*\d{0,1}\s*\]")
21 ## PcdClassObject
22 #
23 # This Class is used for PcdObject
24 #
25 # @param object: Inherited from object class
26 # @param Name: Input value for Name of Pcd, default is None
27 # @param Guid: Input value for Guid of Pcd, default is None
28 # @param Type: Input value for Type of Pcd, default is None
29 # @param DatumType: Input value for DatumType of Pcd, default is None
30 # @param Value: Input value for Value of Pcd, default is None
31 # @param Token: Input value for Token of Pcd, default is None
32 # @param MaxDatumSize: Input value for MaxDatumSize of Pcd, default is None
33 # @param SkuInfoList: Input value for SkuInfoList of Pcd, default is {}
34 # @param IsOverrided: Input value for IsOverrided of Pcd, default is False
35 # @param GuidValue: Input value for TokenSpaceGuidValue of Pcd, default is None
36 #
37 # @var TokenCName: To store value for TokenCName
38 # @var TokenSpaceGuidCName: To store value for TokenSpaceGuidCName
39 # @var Type: To store value for Type
40 # @var DatumType: To store value for DatumType
41 # @var TokenValue: To store value for TokenValue
42 # @var MaxDatumSize: To store value for MaxDatumSize
43 # @var SkuInfoList: To store value for SkuInfoList
44 # @var IsOverrided: To store value for IsOverrided
45 # @var Phase: To store value for Phase, default is "DXE"
46 #
47 class PcdClassObject(object):
48 def __init__(self, Name = None, Guid = None, Type = None, DatumType = None, Value = None, Token = None, MaxDatumSize = None, SkuInfoList = None, IsOverrided = False, GuidValue = None, validateranges = None, validlists = None, expressions = None, IsDsc = False, UserDefinedDefaultStoresFlag = False):
49 self.TokenCName = Name
50 self.TokenSpaceGuidCName = Guid
51 self.TokenSpaceGuidValue = GuidValue
52 self.Type = Type
53 self.DatumType = DatumType
54 self.DefaultValue = Value
55 self.TokenValue = Token
56 self.MaxDatumSize = MaxDatumSize
57 self.MaxSizeUserSet = None
58 self.SkuInfoList = SkuInfoList if SkuInfoList is not None else OrderedDict()
59 self.Phase = "DXE"
60 self.Pending = False
61 self.IsOverrided = IsOverrided
62 self.IsFromBinaryInf = False
63 self.IsFromDsc = False
64 self.validateranges = validateranges if validateranges is not None else []
65 self.validlists = validlists if validlists is not None else []
66 self.expressions = expressions if expressions is not None else []
67 self.DscDefaultValue = None
68 self.DscRawValue = {}
69 if IsDsc:
70 self.DscDefaultValue = Value
71 self.PcdValueFromComm = ""
72 self.PcdValueFromFdf = ""
73 self.CustomAttribute = {}
74 self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag
75
76 @staticmethod
77 def GetPcdMaxSizeWorker(PcdString, MaxSize):
78 if PcdString.startswith("{") and PcdString.endswith("}"):
79 return max([len(PcdString.split(",")),MaxSize])
80
81 if PcdString.startswith("\"") or PcdString.startswith("\'"):
82 return max([len(PcdString)-2+1,MaxSize])
83
84 if PcdString.startswith("L\""):
85 return max([2*(len(PcdString)-3+1),MaxSize])
86
87 return max([len(PcdString),MaxSize])
88
89 ## Get the maximum number of bytes
90 def GetPcdMaxSize(self):
91 if self.DatumType in TAB_PCD_NUMERIC_TYPES:
92 return MAX_SIZE_TYPE[self.DatumType]
93
94 MaxSize = int(self.MaxDatumSize, 10) if self.MaxDatumSize else 0
95 if self.PcdValueFromFdf:
96 MaxSize = self.GetPcdMaxSizeWorker(self.PcdValueFromFdf,MaxSize)
97 if self.PcdValueFromComm:
98 MaxSize = self.GetPcdMaxSizeWorker(self.PcdValueFromComm,MaxSize)
99 if hasattr(self, "DefaultValueFromDec"):
100 MaxSize = self.GetPcdMaxSizeWorker(self.DefaultValueFromDec,MaxSize)
101 return MaxSize
102
103 ## Get the number of bytes
104 def GetPcdSize(self):
105 if self.DatumType in TAB_PCD_NUMERIC_TYPES:
106 return MAX_SIZE_TYPE[self.DatumType]
107 if not self.DefaultValue:
108 return 1
109 elif self.DefaultValue[0] == 'L':
110 return (len(self.DefaultValue) - 2) * 2
111 elif self.DefaultValue[0] == '{':
112 return len(self.DefaultValue.split(','))
113 else:
114 return len(self.DefaultValue) - 1
115
116
117 ## Convert the class to a string
118 #
119 # Convert each member of the class to string
120 # Organize to a signle line format string
121 #
122 # @retval Rtn Formatted String
123 #
124 def __str__(self):
125 Rtn = '\tTokenCName=' + str(self.TokenCName) + ', ' + \
126 'TokenSpaceGuidCName=' + str(self.TokenSpaceGuidCName) + ', ' + \
127 'Type=' + str(self.Type) + ', ' + \
128 'DatumType=' + str(self.DatumType) + ', ' + \
129 'DefaultValue=' + str(self.DefaultValue) + ', ' + \
130 'TokenValue=' + str(self.TokenValue) + ', ' + \
131 'MaxDatumSize=' + str(self.MaxDatumSize) + ', '
132 for Item in self.SkuInfoList.values():
133 Rtn = Rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName
134 Rtn = Rtn + ', IsOverrided=' + str(self.IsOverrided)
135
136 return Rtn
137
138 ## Override __eq__ function
139 #
140 # Check whether pcds are the same
141 #
142 # @retval False The two pcds are different
143 # @retval True The two pcds are the same
144 #
145 def __eq__(self, Other):
146 return Other and self.TokenCName == Other.TokenCName and self.TokenSpaceGuidCName == Other.TokenSpaceGuidCName
147
148 ## Override __hash__ function
149 #
150 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
151 #
152 # @retval truple() Key for hash table
153 #
154 def __hash__(self):
155 return hash((self.TokenCName, self.TokenSpaceGuidCName))
156
157 class StructurePcd(PcdClassObject):
158 def __init__(self, StructuredPcdIncludeFile=None, Packages=None, Name=None, Guid=None, Type=None, DatumType=None, Value=None, Token=None, MaxDatumSize=None, SkuInfoList=None, IsOverrided=False, GuidValue=None, validateranges=None, validlists=None, expressions=None,default_store = TAB_DEFAULT_STORES_DEFAULT):
159 if SkuInfoList is None:
160 SkuInfoList = {}
161 if validateranges is None:
162 validateranges = []
163 if validlists is None:
164 validlists = []
165 if expressions is None:
166 expressions = []
167 if Packages is None:
168 Packages = []
169 super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions)
170 self.StructuredPcdIncludeFile = [] if StructuredPcdIncludeFile is None else StructuredPcdIncludeFile
171 self.PackageDecs = Packages
172 self.DefaultStoreName = [default_store]
173 self.DefaultValues = OrderedDict()
174 self.PcdMode = None
175 self.SkuOverrideValues = OrderedDict()
176 self.StructName = None
177 self.PcdDefineLineNo = 0
178 self.PkgPath = ""
179 self.DefaultValueFromDec = ""
180 self.ValueChain = set()
181 self.PcdFieldValueFromComm = OrderedDict()
182 self.PcdFieldValueFromFdf = OrderedDict()
183 def __repr__(self):
184 return self.TypeName
185
186 def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0):
187 if FieldName in self.DefaultValues:
188 del self.DefaultValues[FieldName]
189 self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo]
190 return self.DefaultValues[FieldName]
191
192 def SetDecDefaultValue(self, DefaultValue):
193 self.DefaultValueFromDec = DefaultValue
194 def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0):
195 if SkuName not in self.SkuOverrideValues:
196 self.SkuOverrideValues[SkuName] = OrderedDict()
197 if DefaultStoreName not in self.SkuOverrideValues[SkuName]:
198 self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict()
199 if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]:
200 del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]
201 self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = [Value.strip(), FileName, LineNo]
202 return self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]
203
204 def SetPcdMode (self, PcdMode):
205 self.PcdMode = PcdMode
206
207 def copy(self, PcdObject):
208 self.TokenCName = PcdObject.TokenCName if PcdObject.TokenCName else self.TokenCName
209 self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName
210 self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue
211 self.Type = PcdObject.Type if PcdObject.Type else self.Type
212 self.DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType
213 self.DefaultValue = PcdObject.DefaultValue if PcdObject.DefaultValue else self.DefaultValue
214 self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue
215 self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize
216 self.SkuInfoList = PcdObject.SkuInfoList if PcdObject.SkuInfoList else self.SkuInfoList
217 self.Phase = PcdObject.Phase if PcdObject.Phase else self.Phase
218 self.Pending = PcdObject.Pending if PcdObject.Pending else self.Pending
219 self.IsOverrided = PcdObject.IsOverrided if PcdObject.IsOverrided else self.IsOverrided
220 self.IsFromBinaryInf = PcdObject.IsFromBinaryInf if PcdObject.IsFromBinaryInf else self.IsFromBinaryInf
221 self.IsFromDsc = PcdObject.IsFromDsc if PcdObject.IsFromDsc else self.IsFromDsc
222 self.validateranges = PcdObject.validateranges if PcdObject.validateranges else self.validateranges
223 self.validlists = PcdObject.validlists if PcdObject.validlists else self.validlists
224 self.expressions = PcdObject.expressions if PcdObject.expressions else self.expressions
225 self.DscRawValue = PcdObject.DscRawValue if PcdObject.DscRawValue else self.DscRawValue
226 self.PcdValueFromComm = PcdObject.PcdValueFromComm if PcdObject.PcdValueFromComm else self.PcdValueFromComm
227 self.PcdValueFromFdf = PcdObject.PcdValueFromFdf if PcdObject.PcdValueFromFdf else self.PcdValueFromFdf
228 self.CustomAttribute = PcdObject.CustomAttribute if PcdObject.CustomAttribute else self.CustomAttribute
229 self.UserDefinedDefaultStoresFlag = PcdObject.UserDefinedDefaultStoresFlag if PcdObject.UserDefinedDefaultStoresFlag else self.UserDefinedDefaultStoresFlag
230 if isinstance(PcdObject, StructurePcd):
231 self.StructuredPcdIncludeFile = PcdObject.StructuredPcdIncludeFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdIncludeFile
232 self.PackageDecs = PcdObject.PackageDecs if PcdObject.PackageDecs else self.PackageDecs
233 self.DefaultValues = PcdObject.DefaultValues if PcdObject.DefaultValues else self.DefaultValues
234 self.PcdMode = PcdObject.PcdMode if PcdObject.PcdMode else self.PcdMode
235 self.DefaultFromDSC=None
236 self.DefaultValueFromDec = PcdObject.DefaultValueFromDec if PcdObject.DefaultValueFromDec else self.DefaultValueFromDec
237 self.SkuOverrideValues = PcdObject.SkuOverrideValues if PcdObject.SkuOverrideValues else self.SkuOverrideValues
238 self.StructName = PcdObject.DatumType if PcdObject.DatumType else self.StructName
239 self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo
240 self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath
241 self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain
242 self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm
243 self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf
244
245 LibraryClassObject = namedtuple('LibraryClassObject', ['LibraryClass','SupModList'], verbose=False)
246
247 ## ModuleBuildClassObject
248 #
249 # This Class defines ModuleBuildClass
250 #
251 # @param object: Inherited from object class
252 #
253 # @var MetaFile: To store value for module meta file path
254 # @var BaseName: To store value for BaseName
255 # @var ModuleType: To store value for ModuleType
256 # @var Guid: To store value for Guid
257 # @var Version: To store value for Version
258 # @var PcdIsDriver: To store value for PcdIsDriver
259 # @var BinaryModule: To store value for BinaryModule
260 # @var CustomMakefile: To store value for CustomMakefile
261 # @var Specification: To store value for Specification
262 # @var Shadow To store value for Shadow
263 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
264 # [ LibraryClassObject, ...]
265 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
266 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
267 # @var ConstructorList: To store value for ConstructorList
268 # @var DestructorList: To store value for DestructorList
269 # @var Binaries: To store value for Binaries, it is a list structure as
270 # [ ModuleBinaryClassObject, ...]
271 # @var Sources: To store value for Sources, it is a list structure as
272 # [ ModuleSourceFilesClassObject, ... ]
273 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
274 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
275 # @var Protocols: To store value for Protocols, it is a list structure as
276 # [ ProtocolName, ... ]
277 # @var Ppis: To store value for Ppis, it is a list structure as
278 # [ PpiName, ... ]
279 # @var Guids: To store value for Guids, it is a list structure as
280 # [ GuidName, ... ]
281 # @var Includes: To store value for Includes, it is a list structure as
282 # [ IncludePath, ... ]
283 # @var Packages: To store value for Packages, it is a list structure as
284 # [ DecFileName, ... ]
285 # @var Pcds: To store value for Pcds, it is a set structure as
286 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
287 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
288 # { [BuildOptionKey] : BuildOptionValue}
289 # @var Depex: To store value for Depex
290 #
291 class ModuleBuildClassObject(object):
292 def __init__(self):
293 self.AutoGenVersion = 0
294 self.MetaFile = ''
295 self.BaseName = ''
296 self.ModuleType = ''
297 self.Guid = ''
298 self.Version = ''
299 self.PcdIsDriver = ''
300 self.BinaryModule = ''
301 self.Shadow = ''
302 self.SourceOverridePath = ''
303 self.CustomMakefile = {}
304 self.Specification = {}
305 self.LibraryClass = []
306 self.ModuleEntryPointList = []
307 self.ModuleUnloadImageList = []
308 self.ConstructorList = []
309 self.DestructorList = []
310
311 self.Binaries = []
312 self.Sources = []
313 self.LibraryClasses = OrderedDict()
314 self.Libraries = []
315 self.Protocols = []
316 self.Ppis = []
317 self.Guids = []
318 self.Includes = []
319 self.Packages = []
320 self.Pcds = {}
321 self.BuildOptions = {}
322 self.Depex = {}
323
324 ## Convert the class to a string
325 #
326 # Convert member MetaFile of the class to a string
327 #
328 # @retval string Formatted String
329 #
330 def __str__(self):
331 return str(self.MetaFile)
332
333 ## Override __eq__ function
334 #
335 # Check whether ModuleBuildClassObjects are the same
336 #
337 # @retval False The two ModuleBuildClassObjects are different
338 # @retval True The two ModuleBuildClassObjects are the same
339 #
340 def __eq__(self, Other):
341 return self.MetaFile == Other
342
343 ## Override __hash__ function
344 #
345 # Use MetaFile as key in hash table
346 #
347 # @retval string Key for hash table
348 #
349 def __hash__(self):
350 return hash(self.MetaFile)
351
352 ## PackageBuildClassObject
353 #
354 # This Class defines PackageBuildClass
355 #
356 # @param object: Inherited from object class
357 #
358 # @var MetaFile: To store value for package meta file path
359 # @var PackageName: To store value for PackageName
360 # @var Guid: To store value for Guid
361 # @var Version: To store value for Version
362 # @var Protocols: To store value for Protocols, it is a set structure as
363 # { [ProtocolName] : Protocol Guid, ... }
364 # @var Ppis: To store value for Ppis, it is a set structure as
365 # { [PpiName] : Ppi Guid, ... }
366 # @var Guids: To store value for Guids, it is a set structure as
367 # { [GuidName] : Guid, ... }
368 # @var Includes: To store value for Includes, it is a list structure as
369 # [ IncludePath, ... ]
370 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
371 # { [LibraryClassName] : LibraryClassInfFile }
372 # @var Pcds: To store value for Pcds, it is a set structure as
373 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
374 #
375 class PackageBuildClassObject(object):
376 def __init__(self):
377 self.MetaFile = ''
378 self.PackageName = ''
379 self.Guid = ''
380 self.Version = ''
381
382 self.Protocols = {}
383 self.Ppis = {}
384 self.Guids = {}
385 self.Includes = []
386 self.LibraryClasses = {}
387 self.Pcds = {}
388
389 ## Convert the class to a string
390 #
391 # Convert member MetaFile of the class to a string
392 #
393 # @retval string Formatted String
394 #
395 def __str__(self):
396 return str(self.MetaFile)
397
398 ## Override __eq__ function
399 #
400 # Check whether PackageBuildClassObjects are the same
401 #
402 # @retval False The two PackageBuildClassObjects are different
403 # @retval True The two PackageBuildClassObjects are the same
404 #
405 def __eq__(self, Other):
406 return self.MetaFile == Other
407
408 ## Override __hash__ function
409 #
410 # Use MetaFile as key in hash table
411 #
412 # @retval string Key for hash table
413 #
414 def __hash__(self):
415 return hash(self.MetaFile)
416
417 ## PlatformBuildClassObject
418 #
419 # This Class defines PlatformBuildClass
420 #
421 # @param object: Inherited from object class
422 #
423 # @var MetaFile: To store value for platform meta-file path
424 # @var PlatformName: To store value for PlatformName
425 # @var Guid: To store value for Guid
426 # @var Version: To store value for Version
427 # @var DscSpecification: To store value for DscSpecification
428 # @var OutputDirectory: To store value for OutputDirectory
429 # @var FlashDefinition: To store value for FlashDefinition
430 # @var BuildNumber: To store value for BuildNumber
431 # @var MakefileName: To store value for MakefileName
432 # @var SkuIds: To store value for SkuIds, it is a set structure as
433 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
434 # @var Modules: To store value for Modules, it is a list structure as
435 # [ InfFileName, ... ]
436 # @var Libraries: To store value for Libraries, it is a list structure as
437 # [ InfFileName, ... ]
438 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
439 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
440 # @var Pcds: To store value for Pcds, it is a set structure as
441 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
442 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
443 # { [BuildOptionKey] : BuildOptionValue }
444 #
445 class PlatformBuildClassObject(object):
446 def __init__(self):
447 self.MetaFile = ''
448 self.PlatformName = ''
449 self.Guid = ''
450 self.Version = ''
451 self.DscSpecification = ''
452 self.OutputDirectory = ''
453 self.FlashDefinition = ''
454 self.BuildNumber = ''
455 self.MakefileName = ''
456
457 self.SkuIds = {}
458 self.Modules = []
459 self.LibraryInstances = []
460 self.LibraryClasses = {}
461 self.Libraries = {}
462 self.Pcds = {}
463 self.BuildOptions = {}
464
465 ## Convert the class to a string
466 #
467 # Convert member MetaFile of the class to a string
468 #
469 # @retval string Formatted String
470 #
471 def __str__(self):
472 return str(self.MetaFile)
473
474 ## Override __eq__ function
475 #
476 # Check whether PlatformBuildClassObjects are the same
477 #
478 # @retval False The two PlatformBuildClassObjects are different
479 # @retval True The two PlatformBuildClassObjects are the same
480 #
481 def __eq__(self, Other):
482 return self.MetaFile == Other
483
484 ## Override __hash__ function
485 #
486 # Use MetaFile as key in hash table
487 #
488 # @retval string Key for hash table
489 #
490 def __hash__(self):
491 return hash(self.MetaFile)