2 # This file is used to define each component of the build database
4 # Copyright (c) 2007 - 2017, 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 Common
.Misc
import sdict
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
.SkuInfoList
= SkuInfoList
61 self
.IsOverrided
= IsOverrided
62 self
.IsFromBinaryInf
= False
63 self
.IsFromDsc
= False
64 self
.validateranges
= validateranges
65 self
.validlists
= validlists
66 self
.expressions
= expressions
67 self
.DscDefaultValue
= None
68 self
.DscRawValue
= None
70 self
.DscDefaultValue
= Value
71 self
.PcdValueFromComm
= ""
72 self
.DefinitionPosition
= ("","")
74 ## Convert the class to a string
76 # Convert each member of the class to string
77 # Organize to a signle line format string
79 # @retval Rtn Formatted String
82 Rtn
= '\tTokenCName=' + str(self
.TokenCName
) + ', ' + \
83 'TokenSpaceGuidCName=' + str(self
.TokenSpaceGuidCName
) + ', ' + \
84 'Type=' + str(self
.Type
) + ', ' + \
85 'DatumType=' + str(self
.DatumType
) + ', ' + \
86 'DefaultValue=' + str(self
.DefaultValue
) + ', ' + \
87 'TokenValue=' + str(self
.TokenValue
) + ', ' + \
88 'MaxDatumSize=' + str(self
.MaxDatumSize
) + ', '
89 for Item
in self
.SkuInfoList
.values():
90 Rtn
= Rtn
+ 'SkuId=' + Item
.SkuId
+ ', ' + 'SkuIdName=' + Item
.SkuIdName
91 Rtn
= Rtn
+ ', IsOverrided=' + str(self
.IsOverrided
)
95 ## Override __eq__ function
97 # Check whether pcds are the same
99 # @retval False The two pcds are different
100 # @retval True The two pcds are the same
102 def __eq__(self
, Other
):
103 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
105 ## Override __hash__ function
107 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
109 # @retval truple() Key for hash table
112 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
114 class StructurePcd(PcdClassObject
):
115 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
):
116 if SkuInfoList
is None: SkuInfoList
={}
117 if validateranges
is None: validateranges
=[]
118 if validlists
is None: validlists
=[]
119 if expressions
is None : expressions
=[]
120 if Packages
is None : Packages
= []
121 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
122 self
.StructuredPcdIncludeFile
= [] if StructuredPcdIncludeFile
is None else StructuredPcdIncludeFile
123 self
.PackageDecs
= Packages
124 self
.DefaultStoreName
= [default_store
]
125 self
.DefaultValues
= collections
.OrderedDict({})
127 self
.SkuOverrideValues
= collections
.OrderedDict({})
128 self
.FlexibleFieldName
= None
129 self
.StructName
= None
130 self
.PcdDefineLineNo
= 0
132 self
.DefaultValueFromDec
= ""
133 self
.ValueChain
= dict()
134 self
.PcdFieldValueFromComm
= collections
.OrderedDict({})
138 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
139 if FieldName
in self
.DefaultValues
:
140 del self
.DefaultValues
[FieldName
]
141 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
142 return self
.DefaultValues
[FieldName
]
144 def SetDecDefaultValue(self
,DefaultValue
):
145 self
.DefaultValueFromDec
= DefaultValue
146 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
147 if SkuName
not in self
.SkuOverrideValues
:
148 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict({})
149 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
150 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict({})
151 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
152 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
153 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
154 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
156 def SetPcdMode (self
, PcdMode
):
157 self
.PcdMode
= PcdMode
159 def SetFlexibleFieldName (self
, FlexibleFieldName
):
160 self
.FlexibleFieldName
= FlexibleFieldName
162 def copy(self
, PcdObject
):
163 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
164 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
165 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
166 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
167 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
168 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
169 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
170 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
171 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
172 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
173 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
174 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
175 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
176 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
177 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
178 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
179 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
180 self
.DscRawValue
= PcdObject
.DscRawValue
if PcdObject
.DscRawValue
else self
.DscRawValue
181 self
.PcdValueFromComm
= PcdObject
.PcdValueFromComm
if PcdObject
.PcdValueFromComm
else self
.PcdValueFromComm
182 self
.DefinitionPosition
= PcdObject
.DefinitionPosition
if PcdObject
.DefinitionPosition
else self
.DefinitionPosition
183 if type(PcdObject
) is StructurePcd
:
184 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
185 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
186 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
187 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
188 self
.DefaultFromDSC
=None
189 self
.DefaultValueFromDec
= PcdObject
.DefaultValueFromDec
if PcdObject
.DefaultValueFromDec
else self
.DefaultValueFromDec
190 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
191 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
192 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
193 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
194 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
195 self
.ValueChain
= PcdObject
.ValueChain
if PcdObject
.ValueChain
else self
.ValueChain
196 self
.PcdFieldValueFromComm
= PcdObject
.PcdFieldValueFromComm
if PcdObject
.PcdFieldValueFromComm
else self
.PcdFieldValueFromComm
198 ## LibraryClassObject
200 # This Class defines LibraryClassObject used in BuildDatabase
202 # @param object: Inherited from object class
203 # @param Name: Input value for LibraryClassName, default is None
204 # @param SupModList: Input value for SupModList, default is []
205 # @param Type: Input value for Type, default is None
207 # @var LibraryClass: To store value for LibraryClass
208 # @var SupModList: To store value for SupModList
209 # @var Type: To store value for Type
211 class LibraryClassObject(object):
212 def __init__(self
, Name
= None, SupModList
= [], Type
= None):
213 self
.LibraryClass
= Name
214 self
.SupModList
= SupModList
216 self
.SupModList
= CleanString(Type
).split(DataType
.TAB_SPACE_SPLIT
)
218 ## ModuleBuildClassObject
220 # This Class defines ModuleBuildClass
222 # @param object: Inherited from object class
224 # @var MetaFile: To store value for module meta file path
225 # @var BaseName: To store value for BaseName
226 # @var ModuleType: To store value for ModuleType
227 # @var Guid: To store value for Guid
228 # @var Version: To store value for Version
229 # @var PcdIsDriver: To store value for PcdIsDriver
230 # @var BinaryModule: To store value for BinaryModule
231 # @var CustomMakefile: To store value for CustomMakefile
232 # @var Specification: To store value for Specification
233 # @var Shadow To store value for Shadow
234 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
235 # [ LibraryClassObject, ...]
236 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
237 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
238 # @var ConstructorList: To store value for ConstructorList
239 # @var DestructorList: To store value for DestructorList
240 # @var Binaries: To store value for Binaries, it is a list structure as
241 # [ ModuleBinaryClassObject, ...]
242 # @var Sources: To store value for Sources, it is a list structure as
243 # [ ModuleSourceFilesClassObject, ... ]
244 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
245 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
246 # @var Protocols: To store value for Protocols, it is a list structure as
247 # [ ProtocolName, ... ]
248 # @var Ppis: To store value for Ppis, it is a list structure as
250 # @var Guids: To store value for Guids, it is a list structure as
252 # @var Includes: To store value for Includes, it is a list structure as
253 # [ IncludePath, ... ]
254 # @var Packages: To store value for Packages, it is a list structure as
255 # [ DecFileName, ... ]
256 # @var Pcds: To store value for Pcds, it is a set structure as
257 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
258 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
259 # { [BuildOptionKey] : BuildOptionValue}
260 # @var Depex: To store value for Depex
262 class ModuleBuildClassObject(object):
264 self
.AutoGenVersion
= 0
270 self
.PcdIsDriver
= ''
271 self
.BinaryModule
= ''
273 self
.SourceOverridePath
= ''
274 self
.CustomMakefile
= {}
275 self
.Specification
= {}
276 self
.LibraryClass
= []
277 self
.ModuleEntryPointList
= []
278 self
.ModuleUnloadImageList
= []
279 self
.ConstructorList
= []
280 self
.DestructorList
= []
284 self
.LibraryClasses
= sdict()
292 self
.BuildOptions
= {}
295 ## Convert the class to a string
297 # Convert member MetaFile of the class to a string
299 # @retval string Formatted String
302 return str(self
.MetaFile
)
304 ## Override __eq__ function
306 # Check whether ModuleBuildClassObjects are the same
308 # @retval False The two ModuleBuildClassObjects are different
309 # @retval True The two ModuleBuildClassObjects are the same
311 def __eq__(self
, Other
):
312 return self
.MetaFile
== Other
314 ## Override __hash__ function
316 # Use MetaFile as key in hash table
318 # @retval string Key for hash table
321 return hash(self
.MetaFile
)
323 ## PackageBuildClassObject
325 # This Class defines PackageBuildClass
327 # @param object: Inherited from object class
329 # @var MetaFile: To store value for package meta file path
330 # @var PackageName: To store value for PackageName
331 # @var Guid: To store value for Guid
332 # @var Version: To store value for Version
333 # @var Protocols: To store value for Protocols, it is a set structure as
334 # { [ProtocolName] : Protocol Guid, ... }
335 # @var Ppis: To store value for Ppis, it is a set structure as
336 # { [PpiName] : Ppi Guid, ... }
337 # @var Guids: To store value for Guids, it is a set structure as
338 # { [GuidName] : Guid, ... }
339 # @var Includes: To store value for Includes, it is a list structure as
340 # [ IncludePath, ... ]
341 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
342 # { [LibraryClassName] : LibraryClassInfFile }
343 # @var Pcds: To store value for Pcds, it is a set structure as
344 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
346 class PackageBuildClassObject(object):
349 self
.PackageName
= ''
357 self
.LibraryClasses
= {}
360 ## Convert the class to a string
362 # Convert member MetaFile of the class to a string
364 # @retval string Formatted String
367 return str(self
.MetaFile
)
369 ## Override __eq__ function
371 # Check whether PackageBuildClassObjects are the same
373 # @retval False The two PackageBuildClassObjects are different
374 # @retval True The two PackageBuildClassObjects are the same
376 def __eq__(self
, Other
):
377 return self
.MetaFile
== Other
379 ## Override __hash__ function
381 # Use MetaFile as key in hash table
383 # @retval string Key for hash table
386 return hash(self
.MetaFile
)
388 ## PlatformBuildClassObject
390 # This Class defines PlatformBuildClass
392 # @param object: Inherited from object class
394 # @var MetaFile: To store value for platform meta-file path
395 # @var PlatformName: To store value for PlatformName
396 # @var Guid: To store value for Guid
397 # @var Version: To store value for Version
398 # @var DscSpecification: To store value for DscSpecification
399 # @var OutputDirectory: To store value for OutputDirectory
400 # @var FlashDefinition: To store value for FlashDefinition
401 # @var BuildNumber: To store value for BuildNumber
402 # @var MakefileName: To store value for MakefileName
403 # @var SkuIds: To store value for SkuIds, it is a set structure as
404 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
405 # @var Modules: To store value for Modules, it is a list structure as
406 # [ InfFileName, ... ]
407 # @var Libraries: To store value for Libraries, it is a list structure as
408 # [ InfFileName, ... ]
409 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
410 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
411 # @var Pcds: To store value for Pcds, it is a set structure as
412 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
413 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
414 # { [BuildOptionKey] : BuildOptionValue }
416 class PlatformBuildClassObject(object):
419 self
.PlatformName
= ''
422 self
.DscSpecification
= ''
423 self
.OutputDirectory
= ''
424 self
.FlashDefinition
= ''
425 self
.BuildNumber
= ''
426 self
.MakefileName
= ''
430 self
.LibraryInstances
= []
431 self
.LibraryClasses
= {}
434 self
.BuildOptions
= {}
436 ## Convert the class to a string
438 # Convert member MetaFile of the class to a string
440 # @retval string Formatted String
443 return str(self
.MetaFile
)
445 ## Override __eq__ function
447 # Check whether PlatformBuildClassObjects are the same
449 # @retval False The two PlatformBuildClassObjects are different
450 # @retval True The two PlatformBuildClassObjects are the same
452 def __eq__(self
, Other
):
453 return self
.MetaFile
== Other
455 ## Override __hash__ function
457 # Use MetaFile as key in hash table
459 # @retval string Key for hash table
462 return hash(self
.MetaFile
)