2 # This file is used to define each component of the build database
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
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.
14 from Common
.DataType
import *
19 # This Class is used for PcdObject
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
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"
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):
45 self
.TokenCName
= Name
46 self
.TokenSpaceGuidCName
= Guid
47 self
.TokenSpaceGuidValue
= GuidValue
49 self
.DatumType
= DatumType
50 self
.DefaultValue
= Value
51 self
.TokenValue
= Token
52 self
.MaxDatumSize
= MaxDatumSize
53 self
.MaxSizeUserSet
= None
54 self
.SkuInfoList
= SkuInfoList
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
66 self
.DscDefaultValue
= Value
67 self
.PcdValueFromComm
= ""
68 self
.PcdValueFromFdf
= ""
69 self
.DefinitionPosition
= ("","")
71 ## Get the maximum number of bytes
72 def GetPcdMaxSize(self
):
73 if self
.DatumType
in TAB_PCD_NUMERIC_TYPES
:
74 return MAX_SIZE_TYPE
[self
.DatumType
]
76 MaxSize
= int(self
.MaxDatumSize
, 10) if self
.MaxDatumSize
else 0
77 if self
.PcdValueFromFdf
:
78 if self
.PcdValueFromFdf
.startswith("{") and self
.PcdValueFromFdf
.endswith("}"):
79 MaxSize
= max([len(self
.PcdValueFromFdf
.split(",")),MaxSize
])
80 elif self
.PcdValueFromFdf
.startswith("\"") or self
.PcdValueFromFdf
.startswith("\'"):
81 MaxSize
= max([len(self
.PcdValueFromFdf
)-2+1,MaxSize
])
82 elif self
.PcdValueFromFdf
.startswith("L\""):
83 MaxSize
= max([2*(len(self
.PcdValueFromFdf
)-3+1),MaxSize
])
85 MaxSize
= max([len(self
.PcdValueFromFdf
),MaxSize
])
87 if self
.PcdValueFromComm
:
88 if self
.PcdValueFromComm
.startswith("{") and self
.PcdValueFromComm
.endswith("}"):
89 return max([len(self
.PcdValueFromComm
.split(",")), MaxSize
])
90 elif self
.PcdValueFromComm
.startswith("\"") or self
.PcdValueFromComm
.startswith("\'"):
91 return max([len(self
.PcdValueFromComm
)-2+1, MaxSize
])
92 elif self
.PcdValueFromComm
.startswith("L\""):
93 return max([2*(len(self
.PcdValueFromComm
)-3+1), MaxSize
])
95 return max([len(self
.PcdValueFromComm
), MaxSize
])
98 ## Get the number of bytes
100 if self
.DatumType
in TAB_PCD_NUMERIC_TYPES
:
101 return MAX_SIZE_TYPE
[self
.DatumType
]
102 if not self
.DefaultValue
:
104 elif self
.DefaultValue
[0] == 'L':
105 return (len(self
.DefaultValue
) - 2) * 2
106 elif self
.DefaultValue
[0] == '{':
107 return len(self
.DefaultValue
.split(','))
109 return len(self
.DefaultValue
) - 1
112 ## Convert the class to a string
114 # Convert each member of the class to string
115 # Organize to a signle line format string
117 # @retval Rtn Formatted String
120 Rtn
= '\tTokenCName=' + str(self
.TokenCName
) + ', ' + \
121 'TokenSpaceGuidCName=' + str(self
.TokenSpaceGuidCName
) + ', ' + \
122 'Type=' + str(self
.Type
) + ', ' + \
123 'DatumType=' + str(self
.DatumType
) + ', ' + \
124 'DefaultValue=' + str(self
.DefaultValue
) + ', ' + \
125 'TokenValue=' + str(self
.TokenValue
) + ', ' + \
126 'MaxDatumSize=' + str(self
.MaxDatumSize
) + ', '
127 for Item
in self
.SkuInfoList
.values():
128 Rtn
= Rtn
+ 'SkuId=' + Item
.SkuId
+ ', ' + 'SkuIdName=' + Item
.SkuIdName
129 Rtn
= Rtn
+ ', IsOverrided=' + str(self
.IsOverrided
)
133 ## Override __eq__ function
135 # Check whether pcds are the same
137 # @retval False The two pcds are different
138 # @retval True The two pcds are the same
140 def __eq__(self
, Other
):
141 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
143 ## Override __hash__ function
145 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
147 # @retval truple() Key for hash table
150 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
152 class StructurePcd(PcdClassObject
):
153 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
):
154 if SkuInfoList
is None:
156 if validateranges
is None:
158 if validlists
is None:
160 if expressions
is None:
164 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
165 self
.StructuredPcdIncludeFile
= [] if StructuredPcdIncludeFile
is None else StructuredPcdIncludeFile
166 self
.PackageDecs
= Packages
167 self
.DefaultStoreName
= [default_store
]
168 self
.DefaultValues
= collections
.OrderedDict()
170 self
.SkuOverrideValues
= collections
.OrderedDict()
171 self
.FlexibleFieldName
= None
172 self
.StructName
= None
173 self
.PcdDefineLineNo
= 0
175 self
.DefaultValueFromDec
= ""
176 self
.ValueChain
= set()
177 self
.PcdFieldValueFromComm
= collections
.OrderedDict()
178 self
.PcdFieldValueFromFdf
= collections
.OrderedDict()
182 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
183 if FieldName
in self
.DefaultValues
:
184 del self
.DefaultValues
[FieldName
]
185 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
186 return self
.DefaultValues
[FieldName
]
188 def SetDecDefaultValue(self
, DefaultValue
):
189 self
.DefaultValueFromDec
= DefaultValue
190 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
191 if SkuName
not in self
.SkuOverrideValues
:
192 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict()
193 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
194 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict()
195 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
196 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
197 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
198 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
200 def SetPcdMode (self
, PcdMode
):
201 self
.PcdMode
= PcdMode
203 def SetFlexibleFieldName (self
, FlexibleFieldName
):
204 self
.FlexibleFieldName
= FlexibleFieldName
206 def copy(self
, PcdObject
):
207 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
208 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
209 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
210 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
211 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
212 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
213 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
214 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
215 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
216 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
217 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
218 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
219 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
220 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
221 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
222 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
223 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
224 self
.DscRawValue
= PcdObject
.DscRawValue
if PcdObject
.DscRawValue
else self
.DscRawValue
225 self
.PcdValueFromComm
= PcdObject
.PcdValueFromComm
if PcdObject
.PcdValueFromComm
else self
.PcdValueFromComm
226 self
.PcdValueFromFdf
= PcdObject
.PcdValueFromFdf
if PcdObject
.PcdValueFromFdf
else self
.PcdValueFromFdf
227 self
.DefinitionPosition
= PcdObject
.DefinitionPosition
if PcdObject
.DefinitionPosition
else self
.DefinitionPosition
228 if isinstance(PcdObject
, StructurePcd
):
229 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
230 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
231 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
232 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
233 self
.DefaultFromDSC
=None
234 self
.DefaultValueFromDec
= PcdObject
.DefaultValueFromDec
if PcdObject
.DefaultValueFromDec
else self
.DefaultValueFromDec
235 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
236 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
237 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
238 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
239 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
240 self
.ValueChain
= PcdObject
.ValueChain
if PcdObject
.ValueChain
else self
.ValueChain
241 self
.PcdFieldValueFromComm
= PcdObject
.PcdFieldValueFromComm
if PcdObject
.PcdFieldValueFromComm
else self
.PcdFieldValueFromComm
242 self
.PcdFieldValueFromFdf
= PcdObject
.PcdFieldValueFromFdf
if PcdObject
.PcdFieldValueFromFdf
else self
.PcdFieldValueFromFdf
244 ## LibraryClassObject
246 # This Class defines LibraryClassObject used in BuildDatabase
248 # @param object: Inherited from object class
249 # @param Name: Input value for LibraryClassName, default is None
250 # @param SupModList: Input value for SupModList, default is []
252 # @var LibraryClass: To store value for LibraryClass
253 # @var SupModList: To store value for SupModList
255 class LibraryClassObject(object):
256 def __init__(self
, Name
= None, SupModList
= []):
257 self
.LibraryClass
= Name
258 self
.SupModList
= SupModList
260 ## ModuleBuildClassObject
262 # This Class defines ModuleBuildClass
264 # @param object: Inherited from object class
266 # @var MetaFile: To store value for module meta file path
267 # @var BaseName: To store value for BaseName
268 # @var ModuleType: To store value for ModuleType
269 # @var Guid: To store value for Guid
270 # @var Version: To store value for Version
271 # @var PcdIsDriver: To store value for PcdIsDriver
272 # @var BinaryModule: To store value for BinaryModule
273 # @var CustomMakefile: To store value for CustomMakefile
274 # @var Specification: To store value for Specification
275 # @var Shadow To store value for Shadow
276 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
277 # [ LibraryClassObject, ...]
278 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
279 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
280 # @var ConstructorList: To store value for ConstructorList
281 # @var DestructorList: To store value for DestructorList
282 # @var Binaries: To store value for Binaries, it is a list structure as
283 # [ ModuleBinaryClassObject, ...]
284 # @var Sources: To store value for Sources, it is a list structure as
285 # [ ModuleSourceFilesClassObject, ... ]
286 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
287 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
288 # @var Protocols: To store value for Protocols, it is a list structure as
289 # [ ProtocolName, ... ]
290 # @var Ppis: To store value for Ppis, it is a list structure as
292 # @var Guids: To store value for Guids, it is a list structure as
294 # @var Includes: To store value for Includes, it is a list structure as
295 # [ IncludePath, ... ]
296 # @var Packages: To store value for Packages, it is a list structure as
297 # [ DecFileName, ... ]
298 # @var Pcds: To store value for Pcds, it is a set structure as
299 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
300 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
301 # { [BuildOptionKey] : BuildOptionValue}
302 # @var Depex: To store value for Depex
304 class ModuleBuildClassObject(object):
306 self
.AutoGenVersion
= 0
312 self
.PcdIsDriver
= ''
313 self
.BinaryModule
= ''
315 self
.SourceOverridePath
= ''
316 self
.CustomMakefile
= {}
317 self
.Specification
= {}
318 self
.LibraryClass
= []
319 self
.ModuleEntryPointList
= []
320 self
.ModuleUnloadImageList
= []
321 self
.ConstructorList
= []
322 self
.DestructorList
= []
326 self
.LibraryClasses
= collections
.OrderedDict()
334 self
.BuildOptions
= {}
337 ## Convert the class to a string
339 # Convert member MetaFile of the class to a string
341 # @retval string Formatted String
344 return str(self
.MetaFile
)
346 ## Override __eq__ function
348 # Check whether ModuleBuildClassObjects are the same
350 # @retval False The two ModuleBuildClassObjects are different
351 # @retval True The two ModuleBuildClassObjects are the same
353 def __eq__(self
, Other
):
354 return self
.MetaFile
== Other
356 ## Override __hash__ function
358 # Use MetaFile as key in hash table
360 # @retval string Key for hash table
363 return hash(self
.MetaFile
)
365 ## PackageBuildClassObject
367 # This Class defines PackageBuildClass
369 # @param object: Inherited from object class
371 # @var MetaFile: To store value for package meta file path
372 # @var PackageName: To store value for PackageName
373 # @var Guid: To store value for Guid
374 # @var Version: To store value for Version
375 # @var Protocols: To store value for Protocols, it is a set structure as
376 # { [ProtocolName] : Protocol Guid, ... }
377 # @var Ppis: To store value for Ppis, it is a set structure as
378 # { [PpiName] : Ppi Guid, ... }
379 # @var Guids: To store value for Guids, it is a set structure as
380 # { [GuidName] : Guid, ... }
381 # @var Includes: To store value for Includes, it is a list structure as
382 # [ IncludePath, ... ]
383 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
384 # { [LibraryClassName] : LibraryClassInfFile }
385 # @var Pcds: To store value for Pcds, it is a set structure as
386 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
388 class PackageBuildClassObject(object):
391 self
.PackageName
= ''
399 self
.LibraryClasses
= {}
402 ## Convert the class to a string
404 # Convert member MetaFile of the class to a string
406 # @retval string Formatted String
409 return str(self
.MetaFile
)
411 ## Override __eq__ function
413 # Check whether PackageBuildClassObjects are the same
415 # @retval False The two PackageBuildClassObjects are different
416 # @retval True The two PackageBuildClassObjects are the same
418 def __eq__(self
, Other
):
419 return self
.MetaFile
== Other
421 ## Override __hash__ function
423 # Use MetaFile as key in hash table
425 # @retval string Key for hash table
428 return hash(self
.MetaFile
)
430 ## PlatformBuildClassObject
432 # This Class defines PlatformBuildClass
434 # @param object: Inherited from object class
436 # @var MetaFile: To store value for platform meta-file path
437 # @var PlatformName: To store value for PlatformName
438 # @var Guid: To store value for Guid
439 # @var Version: To store value for Version
440 # @var DscSpecification: To store value for DscSpecification
441 # @var OutputDirectory: To store value for OutputDirectory
442 # @var FlashDefinition: To store value for FlashDefinition
443 # @var BuildNumber: To store value for BuildNumber
444 # @var MakefileName: To store value for MakefileName
445 # @var SkuIds: To store value for SkuIds, it is a set structure as
446 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
447 # @var Modules: To store value for Modules, it is a list structure as
448 # [ InfFileName, ... ]
449 # @var Libraries: To store value for Libraries, it is a list structure as
450 # [ InfFileName, ... ]
451 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
452 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
453 # @var Pcds: To store value for Pcds, it is a set structure as
454 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
455 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
456 # { [BuildOptionKey] : BuildOptionValue }
458 class PlatformBuildClassObject(object):
461 self
.PlatformName
= ''
464 self
.DscSpecification
= ''
465 self
.OutputDirectory
= ''
466 self
.FlashDefinition
= ''
467 self
.BuildNumber
= ''
468 self
.MakefileName
= ''
472 self
.LibraryInstances
= []
473 self
.LibraryClasses
= {}
476 self
.BuildOptions
= {}
478 ## Convert the class to a string
480 # Convert member MetaFile of the class to a string
482 # @retval string Formatted String
485 return str(self
.MetaFile
)
487 ## Override __eq__ function
489 # Check whether PlatformBuildClassObjects are the same
491 # @retval False The two PlatformBuildClassObjects are different
492 # @retval True The two PlatformBuildClassObjects are the same
494 def __eq__(self
, Other
):
495 return self
.MetaFile
== Other
497 ## Override __hash__ function
499 # Use MetaFile as key in hash table
501 # @retval string Key for hash table
504 return hash(self
.MetaFile
)