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
132 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
133 if FieldName
in self
.DefaultValues
:
134 del self
.DefaultValues
[FieldName
]
135 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
136 return self
.DefaultValues
[FieldName
]
138 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
139 if SkuName
not in self
.SkuOverrideValues
:
140 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict({})
141 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
142 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict({})
143 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
144 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
145 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
146 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
148 def SetPcdMode (self
, PcdMode
):
149 self
.PcdMode
= PcdMode
151 def SetFlexibleFieldName (self
, FlexibleFieldName
):
152 self
.FlexibleFieldName
= FlexibleFieldName
154 def copy(self
, PcdObject
):
155 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
156 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
157 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
158 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
159 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
160 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
161 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
162 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
163 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
164 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
165 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
166 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
167 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
168 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
169 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
170 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
171 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
172 if type(PcdObject
) is StructurePcd
:
173 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
174 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
175 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
176 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
177 self
.DefaultFromDSC
=None
178 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
179 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
180 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
181 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
182 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
184 ## LibraryClassObject
186 # This Class defines LibraryClassObject used in BuildDatabase
188 # @param object: Inherited from object class
189 # @param Name: Input value for LibraryClassName, default is None
190 # @param SupModList: Input value for SupModList, default is []
191 # @param Type: Input value for Type, default is None
193 # @var LibraryClass: To store value for LibraryClass
194 # @var SupModList: To store value for SupModList
195 # @var Type: To store value for Type
197 class LibraryClassObject(object):
198 def __init__(self
, Name
= None, SupModList
= [], Type
= None):
199 self
.LibraryClass
= Name
200 self
.SupModList
= SupModList
202 self
.SupModList
= CleanString(Type
).split(DataType
.TAB_SPACE_SPLIT
)
204 ## ModuleBuildClassObject
206 # This Class defines ModuleBuildClass
208 # @param object: Inherited from object class
210 # @var MetaFile: To store value for module meta file path
211 # @var BaseName: To store value for BaseName
212 # @var ModuleType: To store value for ModuleType
213 # @var Guid: To store value for Guid
214 # @var Version: To store value for Version
215 # @var PcdIsDriver: To store value for PcdIsDriver
216 # @var BinaryModule: To store value for BinaryModule
217 # @var CustomMakefile: To store value for CustomMakefile
218 # @var Specification: To store value for Specification
219 # @var Shadow To store value for Shadow
220 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
221 # [ LibraryClassObject, ...]
222 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
223 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
224 # @var ConstructorList: To store value for ConstructorList
225 # @var DestructorList: To store value for DestructorList
226 # @var Binaries: To store value for Binaries, it is a list structure as
227 # [ ModuleBinaryClassObject, ...]
228 # @var Sources: To store value for Sources, it is a list structure as
229 # [ ModuleSourceFilesClassObject, ... ]
230 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
231 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
232 # @var Protocols: To store value for Protocols, it is a list structure as
233 # [ ProtocolName, ... ]
234 # @var Ppis: To store value for Ppis, it is a list structure as
236 # @var Guids: To store value for Guids, it is a list structure as
238 # @var Includes: To store value for Includes, it is a list structure as
239 # [ IncludePath, ... ]
240 # @var Packages: To store value for Packages, it is a list structure as
241 # [ DecFileName, ... ]
242 # @var Pcds: To store value for Pcds, it is a set structure as
243 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
244 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
245 # { [BuildOptionKey] : BuildOptionValue}
246 # @var Depex: To store value for Depex
248 class ModuleBuildClassObject(object):
250 self
.AutoGenVersion
= 0
256 self
.PcdIsDriver
= ''
257 self
.BinaryModule
= ''
259 self
.SourceOverridePath
= ''
260 self
.CustomMakefile
= {}
261 self
.Specification
= {}
262 self
.LibraryClass
= []
263 self
.ModuleEntryPointList
= []
264 self
.ModuleUnloadImageList
= []
265 self
.ConstructorList
= []
266 self
.DestructorList
= []
270 self
.LibraryClasses
= sdict()
278 self
.BuildOptions
= {}
281 ## Convert the class to a string
283 # Convert member MetaFile of the class to a string
285 # @retval string Formatted String
288 return str(self
.MetaFile
)
290 ## Override __eq__ function
292 # Check whether ModuleBuildClassObjects are the same
294 # @retval False The two ModuleBuildClassObjects are different
295 # @retval True The two ModuleBuildClassObjects are the same
297 def __eq__(self
, Other
):
298 return self
.MetaFile
== Other
300 ## Override __hash__ function
302 # Use MetaFile as key in hash table
304 # @retval string Key for hash table
307 return hash(self
.MetaFile
)
309 ## PackageBuildClassObject
311 # This Class defines PackageBuildClass
313 # @param object: Inherited from object class
315 # @var MetaFile: To store value for package meta file path
316 # @var PackageName: To store value for PackageName
317 # @var Guid: To store value for Guid
318 # @var Version: To store value for Version
319 # @var Protocols: To store value for Protocols, it is a set structure as
320 # { [ProtocolName] : Protocol Guid, ... }
321 # @var Ppis: To store value for Ppis, it is a set structure as
322 # { [PpiName] : Ppi Guid, ... }
323 # @var Guids: To store value for Guids, it is a set structure as
324 # { [GuidName] : Guid, ... }
325 # @var Includes: To store value for Includes, it is a list structure as
326 # [ IncludePath, ... ]
327 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
328 # { [LibraryClassName] : LibraryClassInfFile }
329 # @var Pcds: To store value for Pcds, it is a set structure as
330 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
332 class PackageBuildClassObject(object):
335 self
.PackageName
= ''
343 self
.LibraryClasses
= {}
346 ## Convert the class to a string
348 # Convert member MetaFile of the class to a string
350 # @retval string Formatted String
353 return str(self
.MetaFile
)
355 ## Override __eq__ function
357 # Check whether PackageBuildClassObjects are the same
359 # @retval False The two PackageBuildClassObjects are different
360 # @retval True The two PackageBuildClassObjects are the same
362 def __eq__(self
, Other
):
363 return self
.MetaFile
== Other
365 ## Override __hash__ function
367 # Use MetaFile as key in hash table
369 # @retval string Key for hash table
372 return hash(self
.MetaFile
)
374 ## PlatformBuildClassObject
376 # This Class defines PlatformBuildClass
378 # @param object: Inherited from object class
380 # @var MetaFile: To store value for platform meta-file path
381 # @var PlatformName: To store value for PlatformName
382 # @var Guid: To store value for Guid
383 # @var Version: To store value for Version
384 # @var DscSpecification: To store value for DscSpecification
385 # @var OutputDirectory: To store value for OutputDirectory
386 # @var FlashDefinition: To store value for FlashDefinition
387 # @var BuildNumber: To store value for BuildNumber
388 # @var MakefileName: To store value for MakefileName
389 # @var SkuIds: To store value for SkuIds, it is a set structure as
390 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
391 # @var Modules: To store value for Modules, it is a list structure as
392 # [ InfFileName, ... ]
393 # @var Libraries: To store value for Libraries, it is a list structure as
394 # [ InfFileName, ... ]
395 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
396 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
397 # @var Pcds: To store value for Pcds, it is a set structure as
398 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
399 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
400 # { [BuildOptionKey] : BuildOptionValue }
402 class PlatformBuildClassObject(object):
405 self
.PlatformName
= ''
408 self
.DscSpecification
= ''
409 self
.OutputDirectory
= ''
410 self
.FlashDefinition
= ''
411 self
.BuildNumber
= ''
412 self
.MakefileName
= ''
416 self
.LibraryInstances
= []
417 self
.LibraryClasses
= {}
420 self
.BuildOptions
= {}
422 ## Convert the class to a string
424 # Convert member MetaFile of the class to a string
426 # @retval string Formatted String
429 return str(self
.MetaFile
)
431 ## Override __eq__ function
433 # Check whether PlatformBuildClassObjects are the same
435 # @retval False The two PlatformBuildClassObjects are different
436 # @retval True The two PlatformBuildClassObjects are the same
438 def __eq__(self
, Other
):
439 return self
.MetaFile
== Other
441 ## Override __hash__ function
443 # Use MetaFile as key in hash table
445 # @retval string Key for hash table
448 return hash(self
.MetaFile
)