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
.UserDefinedDefaultStoresFlag
= UserDefinedDefaultStoresFlag
76 def GetPcdMaxSizeWorker(PcdString
, MaxSize
):
77 if PcdString
.startswith("{") and PcdString
.endswith("}"):
78 return max([len(PcdString
.split(",")),MaxSize
])
80 if PcdString
.startswith("\"") or PcdString
.startswith("\'"):
81 return max([len(PcdString
)-2+1,MaxSize
])
83 if PcdString
.startswith("L\""):
84 return max([2*(len(PcdString
)-3+1),MaxSize
])
86 return max([len(PcdString
),MaxSize
])
88 ## Get the maximum number of bytes
89 def GetPcdMaxSize(self
):
90 if self
.DatumType
in TAB_PCD_NUMERIC_TYPES
:
91 return MAX_SIZE_TYPE
[self
.DatumType
]
93 MaxSize
= int(self
.MaxDatumSize
, 10) if self
.MaxDatumSize
else 0
94 if self
.PcdValueFromFdf
:
95 MaxSize
= self
.GetPcdMaxSizeWorker(self
.PcdValueFromFdf
,MaxSize
)
96 if self
.PcdValueFromComm
:
97 MaxSize
= self
.GetPcdMaxSizeWorker(self
.PcdValueFromComm
,MaxSize
)
98 if hasattr(self
, "DefaultValueFromDec"):
99 MaxSize
= self
.GetPcdMaxSizeWorker(self
.DefaultValueFromDec
,MaxSize
)
102 ## Get the number of bytes
103 def GetPcdSize(self
):
104 if self
.DatumType
in TAB_PCD_NUMERIC_TYPES
:
105 return MAX_SIZE_TYPE
[self
.DatumType
]
106 if not self
.DefaultValue
:
108 elif self
.DefaultValue
[0] == 'L':
109 return (len(self
.DefaultValue
) - 2) * 2
110 elif self
.DefaultValue
[0] == '{':
111 return len(self
.DefaultValue
.split(','))
113 return len(self
.DefaultValue
) - 1
116 ## Convert the class to a string
118 # Convert each member of the class to string
119 # Organize to a signle line format string
121 # @retval Rtn Formatted String
124 Rtn
= '\tTokenCName=' + str(self
.TokenCName
) + ', ' + \
125 'TokenSpaceGuidCName=' + str(self
.TokenSpaceGuidCName
) + ', ' + \
126 'Type=' + str(self
.Type
) + ', ' + \
127 'DatumType=' + str(self
.DatumType
) + ', ' + \
128 'DefaultValue=' + str(self
.DefaultValue
) + ', ' + \
129 'TokenValue=' + str(self
.TokenValue
) + ', ' + \
130 'MaxDatumSize=' + str(self
.MaxDatumSize
) + ', '
131 for Item
in self
.SkuInfoList
.values():
132 Rtn
= Rtn
+ 'SkuId=' + Item
.SkuId
+ ', ' + 'SkuIdName=' + Item
.SkuIdName
133 Rtn
= Rtn
+ ', IsOverrided=' + str(self
.IsOverrided
)
137 ## Override __eq__ function
139 # Check whether pcds are the same
141 # @retval False The two pcds are different
142 # @retval True The two pcds are the same
144 def __eq__(self
, Other
):
145 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
147 ## Override __hash__ function
149 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
151 # @retval truple() Key for hash table
154 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
156 class StructurePcd(PcdClassObject
):
157 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
):
158 if SkuInfoList
is None:
160 if validateranges
is None:
162 if validlists
is None:
164 if expressions
is None:
168 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
169 self
.StructuredPcdIncludeFile
= [] if StructuredPcdIncludeFile
is None else StructuredPcdIncludeFile
170 self
.PackageDecs
= Packages
171 self
.DefaultStoreName
= [default_store
]
172 self
.DefaultValues
= OrderedDict()
174 self
.SkuOverrideValues
= OrderedDict()
175 self
.StructName
= None
176 self
.PcdDefineLineNo
= 0
178 self
.DefaultValueFromDec
= ""
179 self
.ValueChain
= set()
180 self
.PcdFieldValueFromComm
= OrderedDict()
181 self
.PcdFieldValueFromFdf
= OrderedDict()
185 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
186 if FieldName
in self
.DefaultValues
:
187 del self
.DefaultValues
[FieldName
]
188 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
189 return self
.DefaultValues
[FieldName
]
191 def SetDecDefaultValue(self
, DefaultValue
):
192 self
.DefaultValueFromDec
= DefaultValue
193 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
194 if SkuName
not in self
.SkuOverrideValues
:
195 self
.SkuOverrideValues
[SkuName
] = OrderedDict()
196 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
197 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = OrderedDict()
198 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
199 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
200 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
201 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
203 def SetPcdMode (self
, PcdMode
):
204 self
.PcdMode
= PcdMode
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
.UserDefinedDefaultStoresFlag
= PcdObject
.UserDefinedDefaultStoresFlag
if PcdObject
.UserDefinedDefaultStoresFlag
else self
.UserDefinedDefaultStoresFlag
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
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
237 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
238 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
239 self
.ValueChain
= PcdObject
.ValueChain
if PcdObject
.ValueChain
else self
.ValueChain
240 self
.PcdFieldValueFromComm
= PcdObject
.PcdFieldValueFromComm
if PcdObject
.PcdFieldValueFromComm
else self
.PcdFieldValueFromComm
241 self
.PcdFieldValueFromFdf
= PcdObject
.PcdFieldValueFromFdf
if PcdObject
.PcdFieldValueFromFdf
else self
.PcdFieldValueFromFdf
243 LibraryClassObject
= namedtuple('LibraryClassObject', ['LibraryClass','SupModList'], verbose
=False)
245 ## ModuleBuildClassObject
247 # This Class defines ModuleBuildClass
249 # @param object: Inherited from object class
251 # @var MetaFile: To store value for module meta file path
252 # @var BaseName: To store value for BaseName
253 # @var ModuleType: To store value for ModuleType
254 # @var Guid: To store value for Guid
255 # @var Version: To store value for Version
256 # @var PcdIsDriver: To store value for PcdIsDriver
257 # @var BinaryModule: To store value for BinaryModule
258 # @var CustomMakefile: To store value for CustomMakefile
259 # @var Specification: To store value for Specification
260 # @var Shadow To store value for Shadow
261 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
262 # [ LibraryClassObject, ...]
263 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
264 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
265 # @var ConstructorList: To store value for ConstructorList
266 # @var DestructorList: To store value for DestructorList
267 # @var Binaries: To store value for Binaries, it is a list structure as
268 # [ ModuleBinaryClassObject, ...]
269 # @var Sources: To store value for Sources, it is a list structure as
270 # [ ModuleSourceFilesClassObject, ... ]
271 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
272 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
273 # @var Protocols: To store value for Protocols, it is a list structure as
274 # [ ProtocolName, ... ]
275 # @var Ppis: To store value for Ppis, it is a list structure as
277 # @var Guids: To store value for Guids, it is a list structure as
279 # @var Includes: To store value for Includes, it is a list structure as
280 # [ IncludePath, ... ]
281 # @var Packages: To store value for Packages, it is a list structure as
282 # [ DecFileName, ... ]
283 # @var Pcds: To store value for Pcds, it is a set structure as
284 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
285 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
286 # { [BuildOptionKey] : BuildOptionValue}
287 # @var Depex: To store value for Depex
289 class ModuleBuildClassObject(object):
291 self
.AutoGenVersion
= 0
297 self
.PcdIsDriver
= ''
298 self
.BinaryModule
= ''
300 self
.SourceOverridePath
= ''
301 self
.CustomMakefile
= {}
302 self
.Specification
= {}
303 self
.LibraryClass
= []
304 self
.ModuleEntryPointList
= []
305 self
.ModuleUnloadImageList
= []
306 self
.ConstructorList
= []
307 self
.DestructorList
= []
311 self
.LibraryClasses
= OrderedDict()
319 self
.BuildOptions
= {}
322 ## Convert the class to a string
324 # Convert member MetaFile of the class to a string
326 # @retval string Formatted String
329 return str(self
.MetaFile
)
331 ## Override __eq__ function
333 # Check whether ModuleBuildClassObjects are the same
335 # @retval False The two ModuleBuildClassObjects are different
336 # @retval True The two ModuleBuildClassObjects are the same
338 def __eq__(self
, Other
):
339 return self
.MetaFile
== Other
341 ## Override __hash__ function
343 # Use MetaFile as key in hash table
345 # @retval string Key for hash table
348 return hash(self
.MetaFile
)
350 ## PackageBuildClassObject
352 # This Class defines PackageBuildClass
354 # @param object: Inherited from object class
356 # @var MetaFile: To store value for package meta file path
357 # @var PackageName: To store value for PackageName
358 # @var Guid: To store value for Guid
359 # @var Version: To store value for Version
360 # @var Protocols: To store value for Protocols, it is a set structure as
361 # { [ProtocolName] : Protocol Guid, ... }
362 # @var Ppis: To store value for Ppis, it is a set structure as
363 # { [PpiName] : Ppi Guid, ... }
364 # @var Guids: To store value for Guids, it is a set structure as
365 # { [GuidName] : Guid, ... }
366 # @var Includes: To store value for Includes, it is a list structure as
367 # [ IncludePath, ... ]
368 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
369 # { [LibraryClassName] : LibraryClassInfFile }
370 # @var Pcds: To store value for Pcds, it is a set structure as
371 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
373 class PackageBuildClassObject(object):
376 self
.PackageName
= ''
384 self
.LibraryClasses
= {}
387 ## Convert the class to a string
389 # Convert member MetaFile of the class to a string
391 # @retval string Formatted String
394 return str(self
.MetaFile
)
396 ## Override __eq__ function
398 # Check whether PackageBuildClassObjects are the same
400 # @retval False The two PackageBuildClassObjects are different
401 # @retval True The two PackageBuildClassObjects are the same
403 def __eq__(self
, Other
):
404 return self
.MetaFile
== Other
406 ## Override __hash__ function
408 # Use MetaFile as key in hash table
410 # @retval string Key for hash table
413 return hash(self
.MetaFile
)
415 ## PlatformBuildClassObject
417 # This Class defines PlatformBuildClass
419 # @param object: Inherited from object class
421 # @var MetaFile: To store value for platform meta-file path
422 # @var PlatformName: To store value for PlatformName
423 # @var Guid: To store value for Guid
424 # @var Version: To store value for Version
425 # @var DscSpecification: To store value for DscSpecification
426 # @var OutputDirectory: To store value for OutputDirectory
427 # @var FlashDefinition: To store value for FlashDefinition
428 # @var BuildNumber: To store value for BuildNumber
429 # @var MakefileName: To store value for MakefileName
430 # @var SkuIds: To store value for SkuIds, it is a set structure as
431 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
432 # @var Modules: To store value for Modules, it is a list structure as
433 # [ InfFileName, ... ]
434 # @var Libraries: To store value for Libraries, it is a list structure as
435 # [ InfFileName, ... ]
436 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
437 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
438 # @var Pcds: To store value for Pcds, it is a set structure as
439 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
440 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
441 # { [BuildOptionKey] : BuildOptionValue }
443 class PlatformBuildClassObject(object):
446 self
.PlatformName
= ''
449 self
.DscSpecification
= ''
450 self
.OutputDirectory
= ''
451 self
.FlashDefinition
= ''
452 self
.BuildNumber
= ''
453 self
.MakefileName
= ''
457 self
.LibraryInstances
= []
458 self
.LibraryClasses
= {}
461 self
.BuildOptions
= {}
463 ## Convert the class to a string
465 # Convert member MetaFile of the class to a string
467 # @retval string Formatted String
470 return str(self
.MetaFile
)
472 ## Override __eq__ function
474 # Check whether PlatformBuildClassObjects are the same
476 # @retval False The two PlatformBuildClassObjects are different
477 # @retval True The two PlatformBuildClassObjects are the same
479 def __eq__(self
, Other
):
480 return self
.MetaFile
== Other
482 ## Override __hash__ function
484 # Use MetaFile as key in hash table
486 # @retval string Key for hash table
489 return hash(self
.MetaFile
)