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
69 self
.DscDefaultValue
= Value
71 ## Convert the class to a string
73 # Convert each member of the class to string
74 # Organize to a signle line format string
76 # @retval Rtn Formatted String
79 Rtn
= '\tTokenCName=' + str(self
.TokenCName
) + ', ' + \
80 'TokenSpaceGuidCName=' + str(self
.TokenSpaceGuidCName
) + ', ' + \
81 'Type=' + str(self
.Type
) + ', ' + \
82 'DatumType=' + str(self
.DatumType
) + ', ' + \
83 'DefaultValue=' + str(self
.DefaultValue
) + ', ' + \
84 'TokenValue=' + str(self
.TokenValue
) + ', ' + \
85 'MaxDatumSize=' + str(self
.MaxDatumSize
) + ', '
86 for Item
in self
.SkuInfoList
.values():
87 Rtn
= Rtn
+ 'SkuId=' + Item
.SkuId
+ ', ' + 'SkuIdName=' + Item
.SkuIdName
88 Rtn
= Rtn
+ ', IsOverrided=' + str(self
.IsOverrided
)
92 ## Override __eq__ function
94 # Check whether pcds are the same
96 # @retval False The two pcds are different
97 # @retval True The two pcds are the same
99 def __eq__(self
, Other
):
100 return Other
and self
.TokenCName
== Other
.TokenCName
and self
.TokenSpaceGuidCName
== Other
.TokenSpaceGuidCName
102 ## Override __hash__ function
104 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
106 # @retval truple() Key for hash table
109 return hash((self
.TokenCName
, self
.TokenSpaceGuidCName
))
111 class StructurePcd(PcdClassObject
):
112 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
):
113 if SkuInfoList
is None: SkuInfoList
={}
114 if validateranges
is None: validateranges
=[]
115 if validlists
is None: validlists
=[]
116 if expressions
is None : expressions
=[]
117 if Packages
is None : Packages
= []
118 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
119 self
.StructuredPcdIncludeFile
= [] if StructuredPcdIncludeFile
is None else StructuredPcdIncludeFile
120 self
.PackageDecs
= Packages
121 self
.DefaultStoreName
= [default_store
]
122 self
.DefaultValues
= collections
.OrderedDict({})
124 self
.SkuOverrideValues
= collections
.OrderedDict({})
125 self
.FlexibleFieldName
= None
126 self
.StructName
= None
127 self
.PcdDefineLineNo
= 0
129 self
.DefaultValueFromDec
= ""
133 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
134 if FieldName
in self
.DefaultValues
:
135 del self
.DefaultValues
[FieldName
]
136 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
137 return self
.DefaultValues
[FieldName
]
139 def SetDecDefaultValue(self
,DefaultValue
):
140 self
.DefaultValueFromDec
= DefaultValue
141 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
142 if SkuName
not in self
.SkuOverrideValues
:
143 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict({})
144 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
145 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict({})
146 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
147 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
148 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
149 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
151 def SetPcdMode (self
, PcdMode
):
152 self
.PcdMode
= PcdMode
154 def SetFlexibleFieldName (self
, FlexibleFieldName
):
155 self
.FlexibleFieldName
= FlexibleFieldName
157 def copy(self
, PcdObject
):
158 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
159 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
160 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
161 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
162 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
163 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
164 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
165 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
166 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
167 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
168 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
169 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
170 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
171 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
172 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
173 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
174 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
175 if type(PcdObject
) is StructurePcd
:
176 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
177 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
178 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
179 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
180 self
.DefaultFromDSC
=None
181 self
.DefaultValueFromDec
= PcdObject
.DefaultValueFromDec
if PcdObject
.DefaultValueFromDec
else self
.DefaultValueFromDec
182 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
183 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
184 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
185 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
186 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
188 ## LibraryClassObject
190 # This Class defines LibraryClassObject used in BuildDatabase
192 # @param object: Inherited from object class
193 # @param Name: Input value for LibraryClassName, default is None
194 # @param SupModList: Input value for SupModList, default is []
195 # @param Type: Input value for Type, default is None
197 # @var LibraryClass: To store value for LibraryClass
198 # @var SupModList: To store value for SupModList
199 # @var Type: To store value for Type
201 class LibraryClassObject(object):
202 def __init__(self
, Name
= None, SupModList
= [], Type
= None):
203 self
.LibraryClass
= Name
204 self
.SupModList
= SupModList
206 self
.SupModList
= CleanString(Type
).split(DataType
.TAB_SPACE_SPLIT
)
208 ## ModuleBuildClassObject
210 # This Class defines ModuleBuildClass
212 # @param object: Inherited from object class
214 # @var MetaFile: To store value for module meta file path
215 # @var BaseName: To store value for BaseName
216 # @var ModuleType: To store value for ModuleType
217 # @var Guid: To store value for Guid
218 # @var Version: To store value for Version
219 # @var PcdIsDriver: To store value for PcdIsDriver
220 # @var BinaryModule: To store value for BinaryModule
221 # @var CustomMakefile: To store value for CustomMakefile
222 # @var Specification: To store value for Specification
223 # @var Shadow To store value for Shadow
224 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
225 # [ LibraryClassObject, ...]
226 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
227 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
228 # @var ConstructorList: To store value for ConstructorList
229 # @var DestructorList: To store value for DestructorList
230 # @var Binaries: To store value for Binaries, it is a list structure as
231 # [ ModuleBinaryClassObject, ...]
232 # @var Sources: To store value for Sources, it is a list structure as
233 # [ ModuleSourceFilesClassObject, ... ]
234 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
235 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
236 # @var Protocols: To store value for Protocols, it is a list structure as
237 # [ ProtocolName, ... ]
238 # @var Ppis: To store value for Ppis, it is a list structure as
240 # @var Guids: To store value for Guids, it is a list structure as
242 # @var Includes: To store value for Includes, it is a list structure as
243 # [ IncludePath, ... ]
244 # @var Packages: To store value for Packages, it is a list structure as
245 # [ DecFileName, ... ]
246 # @var Pcds: To store value for Pcds, it is a set structure as
247 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
248 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
249 # { [BuildOptionKey] : BuildOptionValue}
250 # @var Depex: To store value for Depex
252 class ModuleBuildClassObject(object):
254 self
.AutoGenVersion
= 0
260 self
.PcdIsDriver
= ''
261 self
.BinaryModule
= ''
263 self
.SourceOverridePath
= ''
264 self
.CustomMakefile
= {}
265 self
.Specification
= {}
266 self
.LibraryClass
= []
267 self
.ModuleEntryPointList
= []
268 self
.ModuleUnloadImageList
= []
269 self
.ConstructorList
= []
270 self
.DestructorList
= []
274 self
.LibraryClasses
= sdict()
282 self
.BuildOptions
= {}
285 ## Convert the class to a string
287 # Convert member MetaFile of the class to a string
289 # @retval string Formatted String
292 return str(self
.MetaFile
)
294 ## Override __eq__ function
296 # Check whether ModuleBuildClassObjects are the same
298 # @retval False The two ModuleBuildClassObjects are different
299 # @retval True The two ModuleBuildClassObjects are the same
301 def __eq__(self
, Other
):
302 return self
.MetaFile
== Other
304 ## Override __hash__ function
306 # Use MetaFile as key in hash table
308 # @retval string Key for hash table
311 return hash(self
.MetaFile
)
313 ## PackageBuildClassObject
315 # This Class defines PackageBuildClass
317 # @param object: Inherited from object class
319 # @var MetaFile: To store value for package meta file path
320 # @var PackageName: To store value for PackageName
321 # @var Guid: To store value for Guid
322 # @var Version: To store value for Version
323 # @var Protocols: To store value for Protocols, it is a set structure as
324 # { [ProtocolName] : Protocol Guid, ... }
325 # @var Ppis: To store value for Ppis, it is a set structure as
326 # { [PpiName] : Ppi Guid, ... }
327 # @var Guids: To store value for Guids, it is a set structure as
328 # { [GuidName] : Guid, ... }
329 # @var Includes: To store value for Includes, it is a list structure as
330 # [ IncludePath, ... ]
331 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
332 # { [LibraryClassName] : LibraryClassInfFile }
333 # @var Pcds: To store value for Pcds, it is a set structure as
334 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
336 class PackageBuildClassObject(object):
339 self
.PackageName
= ''
347 self
.LibraryClasses
= {}
350 ## Convert the class to a string
352 # Convert member MetaFile of the class to a string
354 # @retval string Formatted String
357 return str(self
.MetaFile
)
359 ## Override __eq__ function
361 # Check whether PackageBuildClassObjects are the same
363 # @retval False The two PackageBuildClassObjects are different
364 # @retval True The two PackageBuildClassObjects are the same
366 def __eq__(self
, Other
):
367 return self
.MetaFile
== Other
369 ## Override __hash__ function
371 # Use MetaFile as key in hash table
373 # @retval string Key for hash table
376 return hash(self
.MetaFile
)
378 ## PlatformBuildClassObject
380 # This Class defines PlatformBuildClass
382 # @param object: Inherited from object class
384 # @var MetaFile: To store value for platform meta-file path
385 # @var PlatformName: To store value for PlatformName
386 # @var Guid: To store value for Guid
387 # @var Version: To store value for Version
388 # @var DscSpecification: To store value for DscSpecification
389 # @var OutputDirectory: To store value for OutputDirectory
390 # @var FlashDefinition: To store value for FlashDefinition
391 # @var BuildNumber: To store value for BuildNumber
392 # @var MakefileName: To store value for MakefileName
393 # @var SkuIds: To store value for SkuIds, it is a set structure as
394 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
395 # @var Modules: To store value for Modules, it is a list structure as
396 # [ InfFileName, ... ]
397 # @var Libraries: To store value for Libraries, it is a list structure as
398 # [ InfFileName, ... ]
399 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
400 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
401 # @var Pcds: To store value for Pcds, it is a set structure as
402 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
403 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
404 # { [BuildOptionKey] : BuildOptionValue }
406 class PlatformBuildClassObject(object):
409 self
.PlatformName
= ''
412 self
.DscSpecification
= ''
413 self
.OutputDirectory
= ''
414 self
.FlashDefinition
= ''
415 self
.BuildNumber
= ''
416 self
.MakefileName
= ''
420 self
.LibraryInstances
= []
421 self
.LibraryClasses
= {}
424 self
.BuildOptions
= {}
426 ## Convert the class to a string
428 # Convert member MetaFile of the class to a string
430 # @retval string Formatted String
433 return str(self
.MetaFile
)
435 ## Override __eq__ function
437 # Check whether PlatformBuildClassObjects are the same
439 # @retval False The two PlatformBuildClassObjects are different
440 # @retval True The two PlatformBuildClassObjects are the same
442 def __eq__(self
, Other
):
443 return self
.MetaFile
== Other
445 ## Override __hash__ function
447 # Use MetaFile as key in hash table
449 # @retval string Key for hash table
452 return hash(self
.MetaFile
)