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
72 ## Convert the class to a string
74 # Convert each member of the class to string
75 # Organize to a signle line format string
77 # @retval Rtn Formatted String
80 Rtn
= '\tTokenCName=' + str(self
.TokenCName
) + ', ' + \
81 'TokenSpaceGuidCName=' + str(self
.TokenSpaceGuidCName
) + ', ' + \
82 'Type=' + str(self
.Type
) + ', ' + \
83 'DatumType=' + str(self
.DatumType
) + ', ' + \
84 'DefaultValue=' + str(self
.DefaultValue
) + ', ' + \
85 'TokenValue=' + str(self
.TokenValue
) + ', ' + \
86 'MaxDatumSize=' + str(self
.MaxDatumSize
) + ', '
87 for Item
in self
.SkuInfoList
.values():
88 Rtn
= Rtn
+ 'SkuId=' + Item
.SkuId
+ ', ' + 'SkuIdName=' + Item
.SkuIdName
89 Rtn
= Rtn
+ ', IsOverrided=' + str(self
.IsOverrided
)
93 ## Override __eq__ function
95 # Check whether pcds are the same
97 # @retval False The two pcds are different
98 # @retval True The two pcds are the same
100 def __eq__(self
, Other
):
101 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
103 ## Override __hash__ function
105 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
107 # @retval truple() Key for hash table
110 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
112 class StructurePcd(PcdClassObject
):
113 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
):
114 if SkuInfoList
is None: SkuInfoList
={}
115 if validateranges
is None: validateranges
=[]
116 if validlists
is None: validlists
=[]
117 if expressions
is None : expressions
=[]
118 if Packages
is None : Packages
= []
119 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
120 self
.StructuredPcdIncludeFile
= [] if StructuredPcdIncludeFile
is None else StructuredPcdIncludeFile
121 self
.PackageDecs
= Packages
122 self
.DefaultStoreName
= [default_store
]
123 self
.DefaultValues
= collections
.OrderedDict({})
125 self
.SkuOverrideValues
= collections
.OrderedDict({})
126 self
.FlexibleFieldName
= None
127 self
.StructName
= None
128 self
.PcdDefineLineNo
= 0
130 self
.DefaultValueFromDec
= ""
131 self
.ValueChain
= dict()
135 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
136 if FieldName
in self
.DefaultValues
:
137 del self
.DefaultValues
[FieldName
]
138 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
139 return self
.DefaultValues
[FieldName
]
141 def SetDecDefaultValue(self
,DefaultValue
):
142 self
.DefaultValueFromDec
= DefaultValue
143 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
144 if SkuName
not in self
.SkuOverrideValues
:
145 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict({})
146 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
147 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict({})
148 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
149 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
150 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
151 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
153 def SetPcdMode (self
, PcdMode
):
154 self
.PcdMode
= PcdMode
156 def SetFlexibleFieldName (self
, FlexibleFieldName
):
157 self
.FlexibleFieldName
= FlexibleFieldName
159 def copy(self
, PcdObject
):
160 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
161 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
162 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
163 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
164 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
165 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
166 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
167 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
168 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
169 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
170 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
171 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
172 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
173 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
174 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
175 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
176 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
177 self
.DscRawValue
= PcdObject
.DscRawValue
if PcdObject
.DscRawValue
else self
.DscRawValue
178 if type(PcdObject
) is StructurePcd
:
179 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
180 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
181 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
182 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
183 self
.DefaultFromDSC
=None
184 self
.DefaultValueFromDec
= PcdObject
.DefaultValueFromDec
if PcdObject
.DefaultValueFromDec
else self
.DefaultValueFromDec
185 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
186 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
187 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
188 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
189 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
190 self
.ValueChain
= PcdObject
.ValueChain
if PcdObject
.ValueChain
else self
.ValueChain
192 ## LibraryClassObject
194 # This Class defines LibraryClassObject used in BuildDatabase
196 # @param object: Inherited from object class
197 # @param Name: Input value for LibraryClassName, default is None
198 # @param SupModList: Input value for SupModList, default is []
199 # @param Type: Input value for Type, default is None
201 # @var LibraryClass: To store value for LibraryClass
202 # @var SupModList: To store value for SupModList
203 # @var Type: To store value for Type
205 class LibraryClassObject(object):
206 def __init__(self
, Name
= None, SupModList
= [], Type
= None):
207 self
.LibraryClass
= Name
208 self
.SupModList
= SupModList
210 self
.SupModList
= CleanString(Type
).split(DataType
.TAB_SPACE_SPLIT
)
212 ## ModuleBuildClassObject
214 # This Class defines ModuleBuildClass
216 # @param object: Inherited from object class
218 # @var MetaFile: To store value for module meta file path
219 # @var BaseName: To store value for BaseName
220 # @var ModuleType: To store value for ModuleType
221 # @var Guid: To store value for Guid
222 # @var Version: To store value for Version
223 # @var PcdIsDriver: To store value for PcdIsDriver
224 # @var BinaryModule: To store value for BinaryModule
225 # @var CustomMakefile: To store value for CustomMakefile
226 # @var Specification: To store value for Specification
227 # @var Shadow To store value for Shadow
228 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
229 # [ LibraryClassObject, ...]
230 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
231 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
232 # @var ConstructorList: To store value for ConstructorList
233 # @var DestructorList: To store value for DestructorList
234 # @var Binaries: To store value for Binaries, it is a list structure as
235 # [ ModuleBinaryClassObject, ...]
236 # @var Sources: To store value for Sources, it is a list structure as
237 # [ ModuleSourceFilesClassObject, ... ]
238 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
239 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
240 # @var Protocols: To store value for Protocols, it is a list structure as
241 # [ ProtocolName, ... ]
242 # @var Ppis: To store value for Ppis, it is a list structure as
244 # @var Guids: To store value for Guids, it is a list structure as
246 # @var Includes: To store value for Includes, it is a list structure as
247 # [ IncludePath, ... ]
248 # @var Packages: To store value for Packages, it is a list structure as
249 # [ DecFileName, ... ]
250 # @var Pcds: To store value for Pcds, it is a set structure as
251 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
252 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
253 # { [BuildOptionKey] : BuildOptionValue}
254 # @var Depex: To store value for Depex
256 class ModuleBuildClassObject(object):
258 self
.AutoGenVersion
= 0
264 self
.PcdIsDriver
= ''
265 self
.BinaryModule
= ''
267 self
.SourceOverridePath
= ''
268 self
.CustomMakefile
= {}
269 self
.Specification
= {}
270 self
.LibraryClass
= []
271 self
.ModuleEntryPointList
= []
272 self
.ModuleUnloadImageList
= []
273 self
.ConstructorList
= []
274 self
.DestructorList
= []
278 self
.LibraryClasses
= sdict()
286 self
.BuildOptions
= {}
289 ## Convert the class to a string
291 # Convert member MetaFile of the class to a string
293 # @retval string Formatted String
296 return str(self
.MetaFile
)
298 ## Override __eq__ function
300 # Check whether ModuleBuildClassObjects are the same
302 # @retval False The two ModuleBuildClassObjects are different
303 # @retval True The two ModuleBuildClassObjects are the same
305 def __eq__(self
, Other
):
306 return self
.MetaFile
== Other
308 ## Override __hash__ function
310 # Use MetaFile as key in hash table
312 # @retval string Key for hash table
315 return hash(self
.MetaFile
)
317 ## PackageBuildClassObject
319 # This Class defines PackageBuildClass
321 # @param object: Inherited from object class
323 # @var MetaFile: To store value for package meta file path
324 # @var PackageName: To store value for PackageName
325 # @var Guid: To store value for Guid
326 # @var Version: To store value for Version
327 # @var Protocols: To store value for Protocols, it is a set structure as
328 # { [ProtocolName] : Protocol Guid, ... }
329 # @var Ppis: To store value for Ppis, it is a set structure as
330 # { [PpiName] : Ppi Guid, ... }
331 # @var Guids: To store value for Guids, it is a set structure as
332 # { [GuidName] : Guid, ... }
333 # @var Includes: To store value for Includes, it is a list structure as
334 # [ IncludePath, ... ]
335 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
336 # { [LibraryClassName] : LibraryClassInfFile }
337 # @var Pcds: To store value for Pcds, it is a set structure as
338 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
340 class PackageBuildClassObject(object):
343 self
.PackageName
= ''
351 self
.LibraryClasses
= {}
354 ## Convert the class to a string
356 # Convert member MetaFile of the class to a string
358 # @retval string Formatted String
361 return str(self
.MetaFile
)
363 ## Override __eq__ function
365 # Check whether PackageBuildClassObjects are the same
367 # @retval False The two PackageBuildClassObjects are different
368 # @retval True The two PackageBuildClassObjects are the same
370 def __eq__(self
, Other
):
371 return self
.MetaFile
== Other
373 ## Override __hash__ function
375 # Use MetaFile as key in hash table
377 # @retval string Key for hash table
380 return hash(self
.MetaFile
)
382 ## PlatformBuildClassObject
384 # This Class defines PlatformBuildClass
386 # @param object: Inherited from object class
388 # @var MetaFile: To store value for platform meta-file path
389 # @var PlatformName: To store value for PlatformName
390 # @var Guid: To store value for Guid
391 # @var Version: To store value for Version
392 # @var DscSpecification: To store value for DscSpecification
393 # @var OutputDirectory: To store value for OutputDirectory
394 # @var FlashDefinition: To store value for FlashDefinition
395 # @var BuildNumber: To store value for BuildNumber
396 # @var MakefileName: To store value for MakefileName
397 # @var SkuIds: To store value for SkuIds, it is a set structure as
398 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
399 # @var Modules: To store value for Modules, it is a list structure as
400 # [ InfFileName, ... ]
401 # @var Libraries: To store value for Libraries, it is a list structure as
402 # [ InfFileName, ... ]
403 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
404 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
405 # @var Pcds: To store value for Pcds, it is a set structure as
406 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
407 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
408 # { [BuildOptionKey] : BuildOptionValue }
410 class PlatformBuildClassObject(object):
413 self
.PlatformName
= ''
416 self
.DscSpecification
= ''
417 self
.OutputDirectory
= ''
418 self
.FlashDefinition
= ''
419 self
.BuildNumber
= ''
420 self
.MakefileName
= ''
424 self
.LibraryInstances
= []
425 self
.LibraryClasses
= {}
428 self
.BuildOptions
= {}
430 ## Convert the class to a string
432 # Convert member MetaFile of the class to a string
434 # @retval string Formatted String
437 return str(self
.MetaFile
)
439 ## Override __eq__ function
441 # Check whether PlatformBuildClassObjects are the same
443 # @retval False The two PlatformBuildClassObjects are different
444 # @retval True The two PlatformBuildClassObjects are the same
446 def __eq__(self
, Other
):
447 return self
.MetaFile
== Other
449 ## Override __hash__ function
451 # Use MetaFile as key in hash table
453 # @retval string Key for hash table
456 return hash(self
.MetaFile
)