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
="", Packages
=None, Name
=None, Guid
=None, Type
=None, DatumType
=None, Value
=None, Token
=None, MaxDatumSize
=None, SkuInfoList
={}, IsOverrided
=False, GuidValue
=None, validateranges
=[], validlists
=[], expressions
=[],default_store
= TAB_DEFAULT_STORES_DEFAULT
):
113 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
114 self
.StructuredPcdIncludeFile
= StructuredPcdIncludeFile
115 self
.PackageDecs
= Packages
116 self
.DefaultStoreName
= [default_store
]
117 self
.DefaultValues
= collections
.OrderedDict({})
119 self
.SkuOverrideValues
= collections
.OrderedDict({})
120 self
.FlexibleFieldName
= None
121 self
.StructName
= None
122 self
.PcdDefineLineNo
= 0
127 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
128 if FieldName
in self
.DefaultValues
:
129 del self
.DefaultValues
[FieldName
]
130 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
131 return self
.DefaultValues
[FieldName
]
133 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
134 if SkuName
not in self
.SkuOverrideValues
:
135 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict({})
136 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
137 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict({})
138 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
139 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
140 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
141 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
143 def SetPcdMode (self
, PcdMode
):
144 self
.PcdMode
= PcdMode
146 def SetFlexibleFieldName (self
, FlexibleFieldName
):
147 self
.FlexibleFieldName
= FlexibleFieldName
149 def copy(self
, PcdObject
):
150 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
151 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
152 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
153 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
154 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
155 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
156 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
157 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
158 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
159 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
160 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
161 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
162 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
163 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
164 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
165 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
166 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
167 if type(PcdObject
) is StructurePcd
:
168 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
169 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
170 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
171 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
172 self
.DefaultFromDSC
=None
173 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
174 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
175 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
176 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
177 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
179 ## LibraryClassObject
181 # This Class defines LibraryClassObject used in BuildDatabase
183 # @param object: Inherited from object class
184 # @param Name: Input value for LibraryClassName, default is None
185 # @param SupModList: Input value for SupModList, default is []
186 # @param Type: Input value for Type, default is None
188 # @var LibraryClass: To store value for LibraryClass
189 # @var SupModList: To store value for SupModList
190 # @var Type: To store value for Type
192 class LibraryClassObject(object):
193 def __init__(self
, Name
= None, SupModList
= [], Type
= None):
194 self
.LibraryClass
= Name
195 self
.SupModList
= SupModList
197 self
.SupModList
= CleanString(Type
).split(DataType
.TAB_SPACE_SPLIT
)
199 ## ModuleBuildClassObject
201 # This Class defines ModuleBuildClass
203 # @param object: Inherited from object class
205 # @var MetaFile: To store value for module meta file path
206 # @var BaseName: To store value for BaseName
207 # @var ModuleType: To store value for ModuleType
208 # @var Guid: To store value for Guid
209 # @var Version: To store value for Version
210 # @var PcdIsDriver: To store value for PcdIsDriver
211 # @var BinaryModule: To store value for BinaryModule
212 # @var CustomMakefile: To store value for CustomMakefile
213 # @var Specification: To store value for Specification
214 # @var Shadow To store value for Shadow
215 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
216 # [ LibraryClassObject, ...]
217 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
218 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
219 # @var ConstructorList: To store value for ConstructorList
220 # @var DestructorList: To store value for DestructorList
221 # @var Binaries: To store value for Binaries, it is a list structure as
222 # [ ModuleBinaryClassObject, ...]
223 # @var Sources: To store value for Sources, it is a list structure as
224 # [ ModuleSourceFilesClassObject, ... ]
225 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
226 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
227 # @var Protocols: To store value for Protocols, it is a list structure as
228 # [ ProtocolName, ... ]
229 # @var Ppis: To store value for Ppis, it is a list structure as
231 # @var Guids: To store value for Guids, it is a list structure as
233 # @var Includes: To store value for Includes, it is a list structure as
234 # [ IncludePath, ... ]
235 # @var Packages: To store value for Packages, it is a list structure as
236 # [ DecFileName, ... ]
237 # @var Pcds: To store value for Pcds, it is a set structure as
238 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
239 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
240 # { [BuildOptionKey] : BuildOptionValue}
241 # @var Depex: To store value for Depex
243 class ModuleBuildClassObject(object):
245 self
.AutoGenVersion
= 0
251 self
.PcdIsDriver
= ''
252 self
.BinaryModule
= ''
254 self
.SourceOverridePath
= ''
255 self
.CustomMakefile
= {}
256 self
.Specification
= {}
257 self
.LibraryClass
= []
258 self
.ModuleEntryPointList
= []
259 self
.ModuleUnloadImageList
= []
260 self
.ConstructorList
= []
261 self
.DestructorList
= []
265 self
.LibraryClasses
= sdict()
273 self
.BuildOptions
= {}
276 ## Convert the class to a string
278 # Convert member MetaFile of the class to a string
280 # @retval string Formatted String
283 return str(self
.MetaFile
)
285 ## Override __eq__ function
287 # Check whether ModuleBuildClassObjects are the same
289 # @retval False The two ModuleBuildClassObjects are different
290 # @retval True The two ModuleBuildClassObjects are the same
292 def __eq__(self
, Other
):
293 return self
.MetaFile
== Other
295 ## Override __hash__ function
297 # Use MetaFile as key in hash table
299 # @retval string Key for hash table
302 return hash(self
.MetaFile
)
304 ## PackageBuildClassObject
306 # This Class defines PackageBuildClass
308 # @param object: Inherited from object class
310 # @var MetaFile: To store value for package meta file path
311 # @var PackageName: To store value for PackageName
312 # @var Guid: To store value for Guid
313 # @var Version: To store value for Version
314 # @var Protocols: To store value for Protocols, it is a set structure as
315 # { [ProtocolName] : Protocol Guid, ... }
316 # @var Ppis: To store value for Ppis, it is a set structure as
317 # { [PpiName] : Ppi Guid, ... }
318 # @var Guids: To store value for Guids, it is a set structure as
319 # { [GuidName] : Guid, ... }
320 # @var Includes: To store value for Includes, it is a list structure as
321 # [ IncludePath, ... ]
322 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
323 # { [LibraryClassName] : LibraryClassInfFile }
324 # @var Pcds: To store value for Pcds, it is a set structure as
325 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
327 class PackageBuildClassObject(object):
330 self
.PackageName
= ''
338 self
.LibraryClasses
= {}
341 ## Convert the class to a string
343 # Convert member MetaFile of the class to a string
345 # @retval string Formatted String
348 return str(self
.MetaFile
)
350 ## Override __eq__ function
352 # Check whether PackageBuildClassObjects are the same
354 # @retval False The two PackageBuildClassObjects are different
355 # @retval True The two PackageBuildClassObjects are the same
357 def __eq__(self
, Other
):
358 return self
.MetaFile
== Other
360 ## Override __hash__ function
362 # Use MetaFile as key in hash table
364 # @retval string Key for hash table
367 return hash(self
.MetaFile
)
369 ## PlatformBuildClassObject
371 # This Class defines PlatformBuildClass
373 # @param object: Inherited from object class
375 # @var MetaFile: To store value for platform meta-file path
376 # @var PlatformName: To store value for PlatformName
377 # @var Guid: To store value for Guid
378 # @var Version: To store value for Version
379 # @var DscSpecification: To store value for DscSpecification
380 # @var OutputDirectory: To store value for OutputDirectory
381 # @var FlashDefinition: To store value for FlashDefinition
382 # @var BuildNumber: To store value for BuildNumber
383 # @var MakefileName: To store value for MakefileName
384 # @var SkuIds: To store value for SkuIds, it is a set structure as
385 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
386 # @var Modules: To store value for Modules, it is a list structure as
387 # [ InfFileName, ... ]
388 # @var Libraries: To store value for Libraries, it is a list structure as
389 # [ InfFileName, ... ]
390 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
391 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
392 # @var Pcds: To store value for Pcds, it is a set structure as
393 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
394 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
395 # { [BuildOptionKey] : BuildOptionValue }
397 class PlatformBuildClassObject(object):
400 self
.PlatformName
= ''
403 self
.DscSpecification
= ''
404 self
.OutputDirectory
= ''
405 self
.FlashDefinition
= ''
406 self
.BuildNumber
= ''
407 self
.MakefileName
= ''
411 self
.LibraryInstances
= []
412 self
.LibraryClasses
= {}
415 self
.BuildOptions
= {}
417 ## Convert the class to a string
419 # Convert member MetaFile of the class to a string
421 # @retval string Formatted String
424 return str(self
.MetaFile
)
426 ## Override __eq__ function
428 # Check whether PlatformBuildClassObjects are the same
430 # @retval False The two PlatformBuildClassObjects are different
431 # @retval True The two PlatformBuildClassObjects are the same
433 def __eq__(self
, Other
):
434 return self
.MetaFile
== Other
436 ## Override __hash__ function
438 # Use MetaFile as key in hash table
440 # @retval string Key for hash table
443 return hash(self
.MetaFile
)