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 collections
import OrderedDict
, namedtuple
15 from Common
.DataType
import *
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*\]")
23 # This Class is used for PcdObject
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
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"
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
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()
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
70 self
.DscDefaultValue
= Value
71 self
.PcdValueFromComm
= ""
72 self
.PcdValueFromFdf
= ""
73 self
.CustomAttribute
= {}
74 self
.UserDefinedDefaultStoresFlag
= UserDefinedDefaultStoresFlag
77 def GetPcdMaxSizeWorker(PcdString
, MaxSize
):
78 if PcdString
.startswith("{") and PcdString
.endswith("}"):
79 return max([len(PcdString
.split(",")),MaxSize
])
81 if PcdString
.startswith("\"") or PcdString
.startswith("\'"):
82 return max([len(PcdString
)-2+1,MaxSize
])
84 if PcdString
.startswith("L\""):
85 return max([2*(len(PcdString
)-3+1),MaxSize
])
87 return max([len(PcdString
),MaxSize
])
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
]
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
)
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
:
109 elif self
.DefaultValue
[0] == 'L':
110 return (len(self
.DefaultValue
) - 2) * 2
111 elif self
.DefaultValue
[0] == '{':
112 return len(self
.DefaultValue
.split(','))
114 return len(self
.DefaultValue
) - 1
117 ## Convert the class to a string
119 # Convert each member of the class to string
120 # Organize to a signle line format string
122 # @retval Rtn Formatted String
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
)
138 ## Override __eq__ function
140 # Check whether pcds are the same
142 # @retval False The two pcds are different
143 # @retval True The two pcds are the same
145 def __eq__(self
, Other
):
146 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
148 ## Override __hash__ function
150 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
152 # @retval truple() Key for hash table
155 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
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:
161 if validateranges
is None:
163 if validlists
is None:
165 if expressions
is None:
169 super().__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()
175 self
.SkuOverrideValues
= OrderedDict()
176 self
.StructName
= None
177 self
.PcdDefineLineNo
= 0
179 self
.DefaultValueFromDec
= ""
180 self
.ValueChain
= set()
181 self
.PcdFieldValueFromComm
= OrderedDict()
182 self
.PcdFieldValueFromFdf
= OrderedDict()
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
]
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
]
204 def SetPcdMode (self
, PcdMode
):
205 self
.PcdMode
= PcdMode
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
245 LibraryClassObject
= namedtuple('LibraryClassObject', ['LibraryClass','SupModList'])
247 ## ModuleBuildClassObject
249 # This Class defines ModuleBuildClass
251 # @param object: Inherited from object class
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
279 # @var Guids: To store value for Guids, it is a list structure as
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
291 class ModuleBuildClassObject(object):
293 self
.AutoGenVersion
= 0
299 self
.PcdIsDriver
= ''
300 self
.BinaryModule
= ''
302 self
.SourceOverridePath
= ''
303 self
.CustomMakefile
= {}
304 self
.Specification
= {}
305 self
.LibraryClass
= []
306 self
.ModuleEntryPointList
= []
307 self
.ModuleUnloadImageList
= []
308 self
.ConstructorList
= []
309 self
.DestructorList
= []
313 self
.LibraryClasses
= OrderedDict()
321 self
.BuildOptions
= {}
324 ## Convert the class to a string
326 # Convert member MetaFile of the class to a string
328 # @retval string Formatted String
331 return str(self
.MetaFile
)
333 ## Override __eq__ function
335 # Check whether ModuleBuildClassObjects are the same
337 # @retval False The two ModuleBuildClassObjects are different
338 # @retval True The two ModuleBuildClassObjects are the same
340 def __eq__(self
, Other
):
341 return self
.MetaFile
== Other
343 ## Override __hash__ function
345 # Use MetaFile as key in hash table
347 # @retval string Key for hash table
350 return hash(self
.MetaFile
)
352 ## PackageBuildClassObject
354 # This Class defines PackageBuildClass
356 # @param object: Inherited from object class
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}
375 class PackageBuildClassObject(object):
378 self
.PackageName
= ''
386 self
.LibraryClasses
= {}
389 ## Convert the class to a string
391 # Convert member MetaFile of the class to a string
393 # @retval string Formatted String
396 return str(self
.MetaFile
)
398 ## Override __eq__ function
400 # Check whether PackageBuildClassObjects are the same
402 # @retval False The two PackageBuildClassObjects are different
403 # @retval True The two PackageBuildClassObjects are the same
405 def __eq__(self
, Other
):
406 return self
.MetaFile
== Other
408 ## Override __hash__ function
410 # Use MetaFile as key in hash table
412 # @retval string Key for hash table
415 return hash(self
.MetaFile
)
417 ## PlatformBuildClassObject
419 # This Class defines PlatformBuildClass
421 # @param object: Inherited from object class
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 }
445 class PlatformBuildClassObject(object):
448 self
.PlatformName
= ''
451 self
.DscSpecification
= ''
452 self
.OutputDirectory
= ''
453 self
.FlashDefinition
= ''
454 self
.BuildNumber
= ''
455 self
.MakefileName
= ''
459 self
.LibraryInstances
= []
460 self
.LibraryClasses
= {}
463 self
.BuildOptions
= {}
465 ## Convert the class to a string
467 # Convert member MetaFile of the class to a string
469 # @retval string Formatted String
472 return str(self
.MetaFile
)
474 ## Override __eq__ function
476 # Check whether PlatformBuildClassObjects are the same
478 # @retval False The two PlatformBuildClassObjects are different
479 # @retval True The two PlatformBuildClassObjects are the same
481 def __eq__(self
, Other
):
482 return self
.MetaFile
== Other
484 ## Override __hash__ function
486 # Use MetaFile as key in hash table
488 # @retval string Key for hash table
491 return hash(self
.MetaFile
)