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