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, UserDefinedDefaultStoresFlag
= 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
= ("","")
70 self
.UserDefinedDefaultStoresFlag
= UserDefinedDefaultStoresFlag
73 def GetPcdMaxSizeWorker(PcdString
, MaxSize
):
74 if PcdString
.startswith("{") and PcdString
.endswith("}"):
75 return max([len(PcdString
.split(",")),MaxSize
])
77 if PcdString
.startswith("\"") or PcdString
.startswith("\'"):
78 return max([len(PcdString
)-2+1,MaxSize
])
80 if PcdString
.startswith("L\""):
81 return max([2*(len(PcdString
)-3+1),MaxSize
])
83 return max([len(PcdString
),MaxSize
])
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
]
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
)
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
:
105 elif self
.DefaultValue
[0] == 'L':
106 return (len(self
.DefaultValue
) - 2) * 2
107 elif self
.DefaultValue
[0] == '{':
108 return len(self
.DefaultValue
.split(','))
110 return len(self
.DefaultValue
) - 1
113 ## Convert the class to a string
115 # Convert each member of the class to string
116 # Organize to a signle line format string
118 # @retval Rtn Formatted String
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
)
134 ## Override __eq__ function
136 # Check whether pcds are the same
138 # @retval False The two pcds are different
139 # @retval True The two pcds are the same
141 def __eq__(self
, Other
):
142 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
144 ## Override __hash__ function
146 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
148 # @retval truple() Key for hash table
151 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
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:
157 if validateranges
is None:
159 if validlists
is None:
161 if expressions
is None:
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()
171 self
.SkuOverrideValues
= collections
.OrderedDict()
172 self
.FlexibleFieldName
= None
173 self
.StructName
= None
174 self
.PcdDefineLineNo
= 0
176 self
.DefaultValueFromDec
= ""
177 self
.ValueChain
= set()
178 self
.PcdFieldValueFromComm
= collections
.OrderedDict()
179 self
.PcdFieldValueFromFdf
= collections
.OrderedDict()
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
]
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
]
201 def SetPcdMode (self
, PcdMode
):
202 self
.PcdMode
= PcdMode
204 def SetFlexibleFieldName (self
, FlexibleFieldName
):
205 self
.FlexibleFieldName
= FlexibleFieldName
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
246 ## LibraryClassObject
248 # This Class defines LibraryClassObject used in BuildDatabase
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 []
254 # @var LibraryClass: To store value for LibraryClass
255 # @var SupModList: To store value for SupModList
257 class LibraryClassObject(object):
258 def __init__(self
, Name
= None, SupModList
= []):
259 self
.LibraryClass
= Name
260 self
.SupModList
= SupModList
262 ## ModuleBuildClassObject
264 # This Class defines ModuleBuildClass
266 # @param object: Inherited from object class
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
294 # @var Guids: To store value for Guids, it is a list structure as
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
306 class ModuleBuildClassObject(object):
308 self
.AutoGenVersion
= 0
314 self
.PcdIsDriver
= ''
315 self
.BinaryModule
= ''
317 self
.SourceOverridePath
= ''
318 self
.CustomMakefile
= {}
319 self
.Specification
= {}
320 self
.LibraryClass
= []
321 self
.ModuleEntryPointList
= []
322 self
.ModuleUnloadImageList
= []
323 self
.ConstructorList
= []
324 self
.DestructorList
= []
328 self
.LibraryClasses
= collections
.OrderedDict()
336 self
.BuildOptions
= {}
339 ## Convert the class to a string
341 # Convert member MetaFile of the class to a string
343 # @retval string Formatted String
346 return str(self
.MetaFile
)
348 ## Override __eq__ function
350 # Check whether ModuleBuildClassObjects are the same
352 # @retval False The two ModuleBuildClassObjects are different
353 # @retval True The two ModuleBuildClassObjects are the same
355 def __eq__(self
, Other
):
356 return self
.MetaFile
== Other
358 ## Override __hash__ function
360 # Use MetaFile as key in hash table
362 # @retval string Key for hash table
365 return hash(self
.MetaFile
)
367 ## PackageBuildClassObject
369 # This Class defines PackageBuildClass
371 # @param object: Inherited from object class
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}
390 class PackageBuildClassObject(object):
393 self
.PackageName
= ''
401 self
.LibraryClasses
= {}
404 ## Convert the class to a string
406 # Convert member MetaFile of the class to a string
408 # @retval string Formatted String
411 return str(self
.MetaFile
)
413 ## Override __eq__ function
415 # Check whether PackageBuildClassObjects are the same
417 # @retval False The two PackageBuildClassObjects are different
418 # @retval True The two PackageBuildClassObjects are the same
420 def __eq__(self
, Other
):
421 return self
.MetaFile
== Other
423 ## Override __hash__ function
425 # Use MetaFile as key in hash table
427 # @retval string Key for hash table
430 return hash(self
.MetaFile
)
432 ## PlatformBuildClassObject
434 # This Class defines PlatformBuildClass
436 # @param object: Inherited from object class
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 }
460 class PlatformBuildClassObject(object):
463 self
.PlatformName
= ''
466 self
.DscSpecification
= ''
467 self
.OutputDirectory
= ''
468 self
.FlashDefinition
= ''
469 self
.BuildNumber
= ''
470 self
.MakefileName
= ''
474 self
.LibraryInstances
= []
475 self
.LibraryClasses
= {}
478 self
.BuildOptions
= {}
480 ## Convert the class to a string
482 # Convert member MetaFile of the class to a string
484 # @retval string Formatted String
487 return str(self
.MetaFile
)
489 ## Override __eq__ function
491 # Check whether PlatformBuildClassObjects are the same
493 # @retval False The two PlatformBuildClassObjects are different
494 # @retval True The two PlatformBuildClassObjects are the same
496 def __eq__(self
, Other
):
497 return self
.MetaFile
== Other
499 ## Override __hash__ function
501 # Use MetaFile as key in hash table
503 # @retval string Key for hash table
506 return hash(self
.MetaFile
)