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 super(StructurePcd
, self
).__init
__(Name
, Guid
, Type
, DatumType
, Value
, Token
, MaxDatumSize
, SkuInfoList
, IsOverrided
, GuidValue
, validateranges
, validlists
, expressions
)
118 self
.StructuredPcdIncludeFile
= StructuredPcdIncludeFile
119 self
.PackageDecs
= Packages
120 self
.DefaultStoreName
= [default_store
]
121 self
.DefaultValues
= collections
.OrderedDict({})
123 self
.SkuOverrideValues
= collections
.OrderedDict({})
124 self
.FlexibleFieldName
= None
125 self
.StructName
= None
126 self
.PcdDefineLineNo
= 0
131 def AddDefaultValue (self
, FieldName
, Value
, FileName
="", LineNo
=0):
132 if FieldName
in self
.DefaultValues
:
133 del self
.DefaultValues
[FieldName
]
134 self
.DefaultValues
[FieldName
] = [Value
.strip(), FileName
, LineNo
]
135 return self
.DefaultValues
[FieldName
]
137 def AddOverrideValue (self
, FieldName
, Value
, SkuName
, DefaultStoreName
, FileName
="", LineNo
=0):
138 if SkuName
not in self
.SkuOverrideValues
:
139 self
.SkuOverrideValues
[SkuName
] = collections
.OrderedDict({})
140 if DefaultStoreName
not in self
.SkuOverrideValues
[SkuName
]:
141 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
] = collections
.OrderedDict({})
142 if FieldName
in self
.SkuOverrideValues
[SkuName
][DefaultStoreName
]:
143 del self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
144 self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
] = [Value
.strip(), FileName
, LineNo
]
145 return self
.SkuOverrideValues
[SkuName
][DefaultStoreName
][FieldName
]
147 def SetPcdMode (self
, PcdMode
):
148 self
.PcdMode
= PcdMode
150 def SetFlexibleFieldName (self
, FlexibleFieldName
):
151 self
.FlexibleFieldName
= FlexibleFieldName
153 def copy(self
, PcdObject
):
154 self
.TokenCName
= PcdObject
.TokenCName
if PcdObject
.TokenCName
else self
.TokenCName
155 self
.TokenSpaceGuidCName
= PcdObject
.TokenSpaceGuidCName
if PcdObject
.TokenSpaceGuidCName
else PcdObject
.TokenSpaceGuidCName
156 self
.TokenSpaceGuidValue
= PcdObject
.TokenSpaceGuidValue
if PcdObject
.TokenSpaceGuidValue
else self
.TokenSpaceGuidValue
157 self
.Type
= PcdObject
.Type
if PcdObject
.Type
else self
.Type
158 self
.DatumType
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.DatumType
159 self
.DefaultValue
= PcdObject
.DefaultValue
if PcdObject
.DefaultValue
else self
.DefaultValue
160 self
.TokenValue
= PcdObject
.TokenValue
if PcdObject
.TokenValue
else self
.TokenValue
161 self
.MaxDatumSize
= PcdObject
.MaxDatumSize
if PcdObject
.MaxDatumSize
else self
.MaxDatumSize
162 self
.SkuInfoList
= PcdObject
.SkuInfoList
if PcdObject
.SkuInfoList
else self
.SkuInfoList
163 self
.Phase
= PcdObject
.Phase
if PcdObject
.Phase
else self
.Phase
164 self
.Pending
= PcdObject
.Pending
if PcdObject
.Pending
else self
.Pending
165 self
.IsOverrided
= PcdObject
.IsOverrided
if PcdObject
.IsOverrided
else self
.IsOverrided
166 self
.IsFromBinaryInf
= PcdObject
.IsFromBinaryInf
if PcdObject
.IsFromBinaryInf
else self
.IsFromBinaryInf
167 self
.IsFromDsc
= PcdObject
.IsFromDsc
if PcdObject
.IsFromDsc
else self
.IsFromDsc
168 self
.validateranges
= PcdObject
.validateranges
if PcdObject
.validateranges
else self
.validateranges
169 self
.validlists
= PcdObject
.validlists
if PcdObject
.validlists
else self
.validlists
170 self
.expressions
= PcdObject
.expressions
if PcdObject
.expressions
else self
.expressions
171 if type(PcdObject
) is StructurePcd
:
172 self
.StructuredPcdIncludeFile
= PcdObject
.StructuredPcdIncludeFile
if PcdObject
.StructuredPcdIncludeFile
else self
.StructuredPcdIncludeFile
173 self
.PackageDecs
= PcdObject
.PackageDecs
if PcdObject
.PackageDecs
else self
.PackageDecs
174 self
.DefaultValues
= PcdObject
.DefaultValues
if PcdObject
.DefaultValues
else self
.DefaultValues
175 self
.PcdMode
= PcdObject
.PcdMode
if PcdObject
.PcdMode
else self
.PcdMode
176 self
.DefaultFromDSC
=None
177 self
.SkuOverrideValues
= PcdObject
.SkuOverrideValues
if PcdObject
.SkuOverrideValues
else self
.SkuOverrideValues
178 self
.FlexibleFieldName
= PcdObject
.FlexibleFieldName
if PcdObject
.FlexibleFieldName
else self
.FlexibleFieldName
179 self
.StructName
= PcdObject
.DatumType
if PcdObject
.DatumType
else self
.StructName
180 self
.PcdDefineLineNo
= PcdObject
.PcdDefineLineNo
if PcdObject
.PcdDefineLineNo
else self
.PcdDefineLineNo
181 self
.PkgPath
= PcdObject
.PkgPath
if PcdObject
.PkgPath
else self
.PkgPath
183 ## LibraryClassObject
185 # This Class defines LibraryClassObject used in BuildDatabase
187 # @param object: Inherited from object class
188 # @param Name: Input value for LibraryClassName, default is None
189 # @param SupModList: Input value for SupModList, default is []
190 # @param Type: Input value for Type, default is None
192 # @var LibraryClass: To store value for LibraryClass
193 # @var SupModList: To store value for SupModList
194 # @var Type: To store value for Type
196 class LibraryClassObject(object):
197 def __init__(self
, Name
= None, SupModList
= [], Type
= None):
198 self
.LibraryClass
= Name
199 self
.SupModList
= SupModList
201 self
.SupModList
= CleanString(Type
).split(DataType
.TAB_SPACE_SPLIT
)
203 ## ModuleBuildClassObject
205 # This Class defines ModuleBuildClass
207 # @param object: Inherited from object class
209 # @var MetaFile: To store value for module meta file path
210 # @var BaseName: To store value for BaseName
211 # @var ModuleType: To store value for ModuleType
212 # @var Guid: To store value for Guid
213 # @var Version: To store value for Version
214 # @var PcdIsDriver: To store value for PcdIsDriver
215 # @var BinaryModule: To store value for BinaryModule
216 # @var CustomMakefile: To store value for CustomMakefile
217 # @var Specification: To store value for Specification
218 # @var Shadow To store value for Shadow
219 # @var LibraryClass: To store value for LibraryClass, it is a list structure as
220 # [ LibraryClassObject, ...]
221 # @var ModuleEntryPointList: To store value for ModuleEntryPointList
222 # @var ModuleUnloadImageList: To store value for ModuleUnloadImageList
223 # @var ConstructorList: To store value for ConstructorList
224 # @var DestructorList: To store value for DestructorList
225 # @var Binaries: To store value for Binaries, it is a list structure as
226 # [ ModuleBinaryClassObject, ...]
227 # @var Sources: To store value for Sources, it is a list structure as
228 # [ ModuleSourceFilesClassObject, ... ]
229 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
230 # { [LibraryClassName, ModuleType] : LibraryClassInfFile }
231 # @var Protocols: To store value for Protocols, it is a list structure as
232 # [ ProtocolName, ... ]
233 # @var Ppis: To store value for Ppis, it is a list structure as
235 # @var Guids: To store value for Guids, it is a list structure as
237 # @var Includes: To store value for Includes, it is a list structure as
238 # [ IncludePath, ... ]
239 # @var Packages: To store value for Packages, it is a list structure as
240 # [ DecFileName, ... ]
241 # @var Pcds: To store value for Pcds, it is a set structure as
242 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
243 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
244 # { [BuildOptionKey] : BuildOptionValue}
245 # @var Depex: To store value for Depex
247 class ModuleBuildClassObject(object):
249 self
.AutoGenVersion
= 0
255 self
.PcdIsDriver
= ''
256 self
.BinaryModule
= ''
258 self
.SourceOverridePath
= ''
259 self
.CustomMakefile
= {}
260 self
.Specification
= {}
261 self
.LibraryClass
= []
262 self
.ModuleEntryPointList
= []
263 self
.ModuleUnloadImageList
= []
264 self
.ConstructorList
= []
265 self
.DestructorList
= []
269 self
.LibraryClasses
= sdict()
277 self
.BuildOptions
= {}
280 ## Convert the class to a string
282 # Convert member MetaFile of the class to a string
284 # @retval string Formatted String
287 return str(self
.MetaFile
)
289 ## Override __eq__ function
291 # Check whether ModuleBuildClassObjects are the same
293 # @retval False The two ModuleBuildClassObjects are different
294 # @retval True The two ModuleBuildClassObjects are the same
296 def __eq__(self
, Other
):
297 return self
.MetaFile
== Other
299 ## Override __hash__ function
301 # Use MetaFile as key in hash table
303 # @retval string Key for hash table
306 return hash(self
.MetaFile
)
308 ## PackageBuildClassObject
310 # This Class defines PackageBuildClass
312 # @param object: Inherited from object class
314 # @var MetaFile: To store value for package meta file path
315 # @var PackageName: To store value for PackageName
316 # @var Guid: To store value for Guid
317 # @var Version: To store value for Version
318 # @var Protocols: To store value for Protocols, it is a set structure as
319 # { [ProtocolName] : Protocol Guid, ... }
320 # @var Ppis: To store value for Ppis, it is a set structure as
321 # { [PpiName] : Ppi Guid, ... }
322 # @var Guids: To store value for Guids, it is a set structure as
323 # { [GuidName] : Guid, ... }
324 # @var Includes: To store value for Includes, it is a list structure as
325 # [ IncludePath, ... ]
326 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
327 # { [LibraryClassName] : LibraryClassInfFile }
328 # @var Pcds: To store value for Pcds, it is a set structure as
329 # { [(PcdCName, PcdGuidCName)] : PcdClassObject}
331 class PackageBuildClassObject(object):
334 self
.PackageName
= ''
342 self
.LibraryClasses
= {}
345 ## Convert the class to a string
347 # Convert member MetaFile of the class to a string
349 # @retval string Formatted String
352 return str(self
.MetaFile
)
354 ## Override __eq__ function
356 # Check whether PackageBuildClassObjects are the same
358 # @retval False The two PackageBuildClassObjects are different
359 # @retval True The two PackageBuildClassObjects are the same
361 def __eq__(self
, Other
):
362 return self
.MetaFile
== Other
364 ## Override __hash__ function
366 # Use MetaFile as key in hash table
368 # @retval string Key for hash table
371 return hash(self
.MetaFile
)
373 ## PlatformBuildClassObject
375 # This Class defines PlatformBuildClass
377 # @param object: Inherited from object class
379 # @var MetaFile: To store value for platform meta-file path
380 # @var PlatformName: To store value for PlatformName
381 # @var Guid: To store value for Guid
382 # @var Version: To store value for Version
383 # @var DscSpecification: To store value for DscSpecification
384 # @var OutputDirectory: To store value for OutputDirectory
385 # @var FlashDefinition: To store value for FlashDefinition
386 # @var BuildNumber: To store value for BuildNumber
387 # @var MakefileName: To store value for MakefileName
388 # @var SkuIds: To store value for SkuIds, it is a set structure as
389 # { 'SkuName' : SkuId, '!include' : includefilename, ...}
390 # @var Modules: To store value for Modules, it is a list structure as
391 # [ InfFileName, ... ]
392 # @var Libraries: To store value for Libraries, it is a list structure as
393 # [ InfFileName, ... ]
394 # @var LibraryClasses: To store value for LibraryClasses, it is a set structure as
395 # { (LibraryClassName, ModuleType) : LibraryClassInfFile }
396 # @var Pcds: To store value for Pcds, it is a set structure as
397 # { [(PcdCName, PcdGuidCName)] : PcdClassObject }
398 # @var BuildOptions: To store value for BuildOptions, it is a set structure as
399 # { [BuildOptionKey] : BuildOptionValue }
401 class PlatformBuildClassObject(object):
404 self
.PlatformName
= ''
407 self
.DscSpecification
= ''
408 self
.OutputDirectory
= ''
409 self
.FlashDefinition
= ''
410 self
.BuildNumber
= ''
411 self
.MakefileName
= ''
415 self
.LibraryInstances
= []
416 self
.LibraryClasses
= {}
419 self
.BuildOptions
= {}
421 ## Convert the class to a string
423 # Convert member MetaFile of the class to a string
425 # @retval string Formatted String
428 return str(self
.MetaFile
)
430 ## Override __eq__ function
432 # Check whether PlatformBuildClassObjects are the same
434 # @retval False The two PlatformBuildClassObjects are different
435 # @retval True The two PlatformBuildClassObjects are the same
437 def __eq__(self
, Other
):
438 return self
.MetaFile
== Other
440 ## Override __hash__ function
442 # Use MetaFile as key in hash table
444 # @retval string Key for hash table
447 return hash(self
.MetaFile
)