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 import Common
.LongFilePathOs
as os
16 from collections
import OrderedDict
17 from Common
.Misc
import RealPath2
18 from Common
.BuildToolError
import *
19 from Common
.DataType
import *
24 # This Class is used for PcdObject
26 # @param object: Inherited from object class
27 # @param Name: Input value for Name of Pcd, default is None
28 # @param Guid: Input value for Guid of Pcd, default is None
29 # @param Type: Input value for Type of Pcd, default is None
30 # @param DatumType: Input value for DatumType of Pcd, default is None
31 # @param Value: Input value for Value of Pcd, default is None
32 # @param Token: Input value for Token of Pcd, default is None
33 # @param MaxDatumSize: Input value for MaxDatumSize of Pcd, default is None
34 # @param SkuInfoList: Input value for SkuInfoList of Pcd, default is {}
35 # @param IsOverrided: Input value for IsOverrided of Pcd, default is False
36 # @param GuidValue: Input value for TokenSpaceGuidValue of Pcd, default is None
38 # @var TokenCName: To store value for TokenCName
39 # @var TokenSpaceGuidCName: To store value for TokenSpaceGuidCName
40 # @var Type: To store value for Type
41 # @var DatumType: To store value for DatumType
42 # @var TokenValue: To store value for TokenValue
43 # @var MaxDatumSize: To store value for MaxDatumSize
44 # @var SkuInfoList: To store value for SkuInfoList
45 # @var IsOverrided: To store value for IsOverrided
46 # @var Phase: To store value for Phase, default is "DXE"
48 class PcdClassObject(object):
49 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):
50 self
.TokenCName
= Name
51 self
.TokenSpaceGuidCName
= Guid
52 self
.TokenSpaceGuidValue
= GuidValue
54 self
.DatumType
= DatumType
55 self
.DefaultValue
= Value
56 self
.TokenValue
= Token
57 self
.MaxDatumSize
= MaxDatumSize
58 self
.MaxSizeUserSet
= None
59 self
.SkuInfoList
= SkuInfoList
62 self
.IsOverrided
= IsOverrided
63 self
.IsFromBinaryInf
= False
64 self
.IsFromDsc
= False
65 self
.validateranges
= validateranges
66 self
.validlists
= validlists
67 self
.expressions
= expressions
68 self
.DscDefaultValue
= None
69 self
.DscRawValue
= None
71 self
.DscDefaultValue
= Value
72 self
.PcdValueFromComm
= ""
73 self
.DefinitionPosition
= ("","")
75 ## Convert the class to a string
77 # Convert each member of the class to string
78 # Organize to a signle line format string
80 # @retval Rtn Formatted String
83 Rtn
= '\tTokenCName=' + str(self
.TokenCName
) + ', ' + \
84 'TokenSpaceGuidCName=' + str(self
.TokenSpaceGuidCName
) + ', ' + \
85 'Type=' + str(self
.Type
) + ', ' + \
86 'DatumType=' + str(self
.DatumType
) + ', ' + \
87 'DefaultValue=' + str(self
.DefaultValue
) + ', ' + \
88 'TokenValue=' + str(self
.TokenValue
) + ', ' + \
89 'MaxDatumSize=' + str(self
.MaxDatumSize
) + ', '
90 for Item
in self
.SkuInfoList
.values():
91 Rtn
= Rtn
+ 'SkuId=' + Item
.SkuId
+ ', ' + 'SkuIdName=' + Item
.SkuIdName
92 Rtn
= Rtn
+ ', IsOverrided=' + str(self
.IsOverrided
)
96 ## Override __eq__ function
98 # Check whether pcds are the same
100 # @retval False The two pcds are different
101 # @retval True The two pcds are the same
103 def __eq__(self
, Other
):
104 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
106 ## Override __hash__ function
108 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
110 # @retval truple() Key for hash table
113 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
115 class StructurePcd(PcdClassObject
):
116 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
):
117 if SkuInfoList
is None: SkuInfoList
={}
118 if validateranges
is None: validateranges
=[]
119 if validlists
is None: validlists
=[]
120 if expressions
is None : expressions
=[]
121 if Packages
is None : Packages
= []
122 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
123 self
.StructuredPcdIncludeFile
= [] if StructuredPcdIncludeFile
is None else StructuredPcdIncludeFile
124 self
.PackageDecs
= Packages
125 self
.DefaultStoreName
= [default_store
]
126 self
.DefaultValues
= collections
.OrderedDict({})
128 self
.SkuOverrideValues
= collections
.OrderedDict({})
129 self
.FlexibleFieldName
= None
130 self
.StructName
= None
131 self
.PcdDefineLineNo
= 0
133 self
.DefaultValueFromDec
= ""
134 self
.ValueChain
= dict()
135 self
.PcdFieldValueFromComm
= collections
.OrderedDict({})
139 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
140 if FieldName
in self
.DefaultValues
:
141 del self
.DefaultValues
[FieldName
]
142 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
143 return self
.DefaultValues
[FieldName
]
145 def SetDecDefaultValue(self
,DefaultValue
):
146 self
.DefaultValueFromDec
= DefaultValue
147 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
148 if SkuName
not in self
.SkuOverrideValues
:
149 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict({})
150 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
151 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict({})
152 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
153 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
154 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
155 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
157 def SetPcdMode (self
, PcdMode
):
158 self
.PcdMode
= PcdMode
160 def SetFlexibleFieldName (self
, FlexibleFieldName
):
161 self
.FlexibleFieldName
= FlexibleFieldName
163 def copy(self
, PcdObject
):
164 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
165 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
166 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
167 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
168 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
169 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
170 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
171 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
172 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
173 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
174 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
175 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
176 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
177 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
178 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
179 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
180 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
181 self
.DscRawValue
= PcdObject
.DscRawValue
if PcdObject
.DscRawValue
else self
.DscRawValue
182 self
.PcdValueFromComm
= PcdObject
.PcdValueFromComm
if PcdObject
.PcdValueFromComm
else self
.PcdValueFromComm
183 self
.DefinitionPosition
= PcdObject
.DefinitionPosition
if PcdObject
.DefinitionPosition
else self
.DefinitionPosition
184 if type(PcdObject
) is StructurePcd
:
185 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
186 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
187 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
188 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
189 self
.DefaultFromDSC
=None
190 self
.DefaultValueFromDec
= PcdObject
.DefaultValueFromDec
if PcdObject
.DefaultValueFromDec
else self
.DefaultValueFromDec
191 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
192 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
193 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
194 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
195 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
196 self
.ValueChain
= PcdObject
.ValueChain
if PcdObject
.ValueChain
else self
.ValueChain
197 self
.PcdFieldValueFromComm
= PcdObject
.PcdFieldValueFromComm
if PcdObject
.PcdFieldValueFromComm
else self
.PcdFieldValueFromComm
199 ## LibraryClassObject
201 # This Class defines LibraryClassObject used in BuildDatabase
203 # @param object: Inherited from object class
204 # @param Name: Input value for LibraryClassName, default is None
205 # @param SupModList: Input value for SupModList, default is []
206 # @param Type: Input value for Type, default is None
208 # @var LibraryClass: To store value for LibraryClass
209 # @var SupModList: To store value for SupModList
210 # @var Type: To store value for Type
212 class LibraryClassObject(object):
213 def __init__(self
, Name
= None, SupModList
= [], Type
= None):
214 self
.LibraryClass
= Name
215 self
.SupModList
= SupModList
217 self
.SupModList
= CleanString(Type
).split(DataType
.TAB_SPACE_SPLIT
)
219 ## ModuleBuildClassObject
221 # This Class defines ModuleBuildClass
223 # @param object: Inherited from object class
225 # @var MetaFile: To store value for module meta file path
226 # @var BaseName: To store value for BaseName
227 # @var ModuleType: To store value for ModuleType
228 # @var Guid: To store value for Guid
229 # @var Version: To store value for Version
230 # @var PcdIsDriver: To store value for PcdIsDriver
231 # @var BinaryModule: To store value for BinaryModule
232 # @var CustomMakefile: To store value for CustomMakefile
233 # @var Specification: To store value for Specification
234 # @var Shadow To store value for Shadow
235 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
236 # [ LibraryClassObject, ...]
237 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
238 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
239 # @var ConstructorList: To store value for ConstructorList
240 # @var DestructorList: To store value for DestructorList
241 # @var Binaries: To store value for Binaries, it is a list structure as
242 # [ ModuleBinaryClassObject, ...]
243 # @var Sources: To store value for Sources, it is a list structure as
244 # [ ModuleSourceFilesClassObject, ... ]
245 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
246 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
247 # @var Protocols: To store value for Protocols, it is a list structure as
248 # [ ProtocolName, ... ]
249 # @var Ppis: To store value for Ppis, it is a list structure as
251 # @var Guids: To store value for Guids, it is a list structure as
253 # @var Includes: To store value for Includes, it is a list structure as
254 # [ IncludePath, ... ]
255 # @var Packages: To store value for Packages, it is a list structure as
256 # [ DecFileName, ... ]
257 # @var Pcds: To store value for Pcds, it is a set structure as
258 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
259 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
260 # { [BuildOptionKey] : BuildOptionValue}
261 # @var Depex: To store value for Depex
263 class ModuleBuildClassObject(object):
265 self
.AutoGenVersion
= 0
271 self
.PcdIsDriver
= ''
272 self
.BinaryModule
= ''
274 self
.SourceOverridePath
= ''
275 self
.CustomMakefile
= {}
276 self
.Specification
= {}
277 self
.LibraryClass
= []
278 self
.ModuleEntryPointList
= []
279 self
.ModuleUnloadImageList
= []
280 self
.ConstructorList
= []
281 self
.DestructorList
= []
285 self
.LibraryClasses
= OrderedDict()
293 self
.BuildOptions
= {}
296 ## Convert the class to a string
298 # Convert member MetaFile of the class to a string
300 # @retval string Formatted String
303 return str(self
.MetaFile
)
305 ## Override __eq__ function
307 # Check whether ModuleBuildClassObjects are the same
309 # @retval False The two ModuleBuildClassObjects are different
310 # @retval True The two ModuleBuildClassObjects are the same
312 def __eq__(self
, Other
):
313 return self
.MetaFile
== Other
315 ## Override __hash__ function
317 # Use MetaFile as key in hash table
319 # @retval string Key for hash table
322 return hash(self
.MetaFile
)
324 ## PackageBuildClassObject
326 # This Class defines PackageBuildClass
328 # @param object: Inherited from object class
330 # @var MetaFile: To store value for package meta file path
331 # @var PackageName: To store value for PackageName
332 # @var Guid: To store value for Guid
333 # @var Version: To store value for Version
334 # @var Protocols: To store value for Protocols, it is a set structure as
335 # { [ProtocolName] : Protocol Guid, ... }
336 # @var Ppis: To store value for Ppis, it is a set structure as
337 # { [PpiName] : Ppi Guid, ... }
338 # @var Guids: To store value for Guids, it is a set structure as
339 # { [GuidName] : Guid, ... }
340 # @var Includes: To store value for Includes, it is a list structure as
341 # [ IncludePath, ... ]
342 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
343 # { [LibraryClassName] : LibraryClassInfFile }
344 # @var Pcds: To store value for Pcds, it is a set structure as
345 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
347 class PackageBuildClassObject(object):
350 self
.PackageName
= ''
358 self
.LibraryClasses
= {}
361 ## Convert the class to a string
363 # Convert member MetaFile of the class to a string
365 # @retval string Formatted String
368 return str(self
.MetaFile
)
370 ## Override __eq__ function
372 # Check whether PackageBuildClassObjects are the same
374 # @retval False The two PackageBuildClassObjects are different
375 # @retval True The two PackageBuildClassObjects are the same
377 def __eq__(self
, Other
):
378 return self
.MetaFile
== Other
380 ## Override __hash__ function
382 # Use MetaFile as key in hash table
384 # @retval string Key for hash table
387 return hash(self
.MetaFile
)
389 ## PlatformBuildClassObject
391 # This Class defines PlatformBuildClass
393 # @param object: Inherited from object class
395 # @var MetaFile: To store value for platform meta-file path
396 # @var PlatformName: To store value for PlatformName
397 # @var Guid: To store value for Guid
398 # @var Version: To store value for Version
399 # @var DscSpecification: To store value for DscSpecification
400 # @var OutputDirectory: To store value for OutputDirectory
401 # @var FlashDefinition: To store value for FlashDefinition
402 # @var BuildNumber: To store value for BuildNumber
403 # @var MakefileName: To store value for MakefileName
404 # @var SkuIds: To store value for SkuIds, it is a set structure as
405 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
406 # @var Modules: To store value for Modules, it is a list structure as
407 # [ InfFileName, ... ]
408 # @var Libraries: To store value for Libraries, it is a list structure as
409 # [ InfFileName, ... ]
410 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
411 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
412 # @var Pcds: To store value for Pcds, it is a set structure as
413 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
414 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
415 # { [BuildOptionKey] : BuildOptionValue }
417 class PlatformBuildClassObject(object):
420 self
.PlatformName
= ''
423 self
.DscSpecification
= ''
424 self
.OutputDirectory
= ''
425 self
.FlashDefinition
= ''
426 self
.BuildNumber
= ''
427 self
.MakefileName
= ''
431 self
.LibraryInstances
= []
432 self
.LibraryClasses
= {}
435 self
.BuildOptions
= {}
437 ## Convert the class to a string
439 # Convert member MetaFile of the class to a string
441 # @retval string Formatted String
444 return str(self
.MetaFile
)
446 ## Override __eq__ function
448 # Check whether PlatformBuildClassObjects are the same
450 # @retval False The two PlatformBuildClassObjects are different
451 # @retval True The two PlatformBuildClassObjects are the same
453 def __eq__(self
, Other
):
454 return self
.MetaFile
== Other
456 ## Override __hash__ function
458 # Use MetaFile as key in hash table
460 # @retval string Key for hash table
463 return hash(self
.MetaFile
)