1## @file
2# This file is used to define each component of the build database
3#
4# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
5# SPDX-License-Identifier: BSD-2-Clause-Patent
6#
7
8from collections import OrderedDict, namedtuple
9from Common.DataType import *
10import collections
11import re
12from collections import OrderedDict
13from Common.Misc import CopyDict,ArrayIndex
14import copy
15import Common.EdkLogger as EdkLogger
16from Common.BuildToolError import OPTION_VALUE_INVALID
17StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_\[\]]*$')
18
19## PcdClassObject
20#
21# This Class is used for PcdObject
22#
23# @param object:             Inherited from object class
24# @param Name:               Input value for Name of Pcd, default is None
25# @param Guid:               Input value for Guid of Pcd, default is None
26# @param Type:               Input value for Type of Pcd, default is None
27# @param DatumType:          Input value for DatumType of Pcd, default is None
28# @param Value:              Input value for Value of Pcd, default is None
29# @param Token:              Input value for Token of Pcd, default is None
30# @param MaxDatumSize:       Input value for MaxDatumSize of Pcd, default is None
31# @param SkuInfoList:        Input value for SkuInfoList of Pcd, default is {}
32# @param IsOverrided:        Input value for IsOverrided of Pcd, default is False
33# @param GuidValue:          Input value for TokenSpaceGuidValue of Pcd, default is None
34#
35# @var TokenCName:           To store value for TokenCName
36# @var TokenSpaceGuidCName:  To store value for TokenSpaceGuidCName
37# @var Type:                 To store value for Type
38# @var DatumType:            To store value for DatumType
39# @var TokenValue:           To store value for TokenValue
40# @var MaxDatumSize:         To store value for MaxDatumSize
41# @var SkuInfoList:          To store value for SkuInfoList
42# @var IsOverrided:          To store value for IsOverrided
43# @var Phase:                To store value for Phase, default is "DXE"
44#
45class PcdClassObject(object):
46    def __init__(self, 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, IsDsc = False, UserDefinedDefaultStoresFlag = False):
47        self.TokenCName = Name
48        self.TokenSpaceGuidCName = Guid
49        self.TokenSpaceGuidValue = GuidValue
50        self.Type = Type
51        self._DatumType = DatumType
52        self.DefaultValue = Value
53        self.TokenValue = Token
54        self.MaxDatumSize = MaxDatumSize
55        self.MaxSizeUserSet = None
56        self.SkuInfoList = SkuInfoList if SkuInfoList is not None else OrderedDict()
57        self.Phase = "DXE"
58        self.Pending = False
59        self.IsOverrided = IsOverrided
60        self.IsFromBinaryInf = False
61        self.IsFromDsc = False
62        self.validateranges = validateranges if validateranges is not None else []
63        self.validlists = validlists if validlists is not None else []
64        self.expressions = expressions if expressions is not None else []
65        self.DscDefaultValue = None
66        self.DscRawValue = {}
67        self.DscRawValueInfo = {}
68        if IsDsc:
69            self.DscDefaultValue = Value
70        self.PcdValueFromComm = ""
71        self.PcdValueFromFdf = ""
72        self.CustomAttribute = {}
73        self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag
74        self._Capacity = None
75
76    @property
77    def Capacity(self):
78        if self._Capacity is None:
79            self._Capacity = []
80            dimension = ArrayIndex.findall(self._DatumType)
81            for item in dimension:
82                maxsize = item.lstrip("[").rstrip("]").strip()
83                if not maxsize:
84                    maxsize = "-1"
85                maxsize = str(int(maxsize,16)) if maxsize.startswith(("0x","0X")) else maxsize
86                self._Capacity.append(maxsize)
87            if hasattr(self, "SkuOverrideValues"):
88                for sku in self.SkuOverrideValues:
89                    for defaultstore in self.SkuOverrideValues[sku]:
90                        fields = self.SkuOverrideValues[sku][defaultstore]
91                        for demesionattr in fields:
92                            fieldinfo = fields[demesionattr]
93                            deme = ArrayIndex.findall(demesionattr)
94                            for i in range(len(deme)):
95                                if int(deme[i].lstrip("[").rstrip("]").strip()) >= int(self._Capacity[i]):
96                                    if self._Capacity[i] != "-1":
97                                        firstfieldinfo = list(fieldinfo.values())[0]
98                                        EdkLogger.error('Build', OPTION_VALUE_INVALID, "For Pcd %s, Array Index exceed the Array size. From %s Line %s \n " %
99                                    (".".join((self.TokenSpaceGuidCName, self.TokenCName)), firstfieldinfo[1],firstfieldinfo[2] ))
100            if hasattr(self,"DefaultValues"):
101                for demesionattr in self.DefaultValues:
102                    fieldinfo = self.DefaultValues[demesionattr]
103                    deme = ArrayIndex.findall(demesionattr)
104                    for i in range(len(deme)):
105                        if int(deme[i].lstrip("[").rstrip("]").strip()) >= int(self._Capacity[i]):
106                            if self._Capacity[i] != "-1":
107                                firstfieldinfo = list(fieldinfo.values())[0]
108                                EdkLogger.error('Build', OPTION_VALUE_INVALID, "For Pcd %s, Array Index exceed the Array size. From %s Line %s \n " %
109                                    (".".join((self.TokenSpaceGuidCName, self.TokenCName)), firstfieldinfo[1],firstfieldinfo[2] ))
110        return self._Capacity
111
112    def PcdArraySize(self):
113        if self.Capacity[-1] == "-1":
114            return -1
115        size = 1
116        for de in self.Capacity:
117            size = size * int(de)
118        return size
119    @property
120    def DatumType(self):
121        return self._DatumType
122
123    @DatumType.setter
124    def DatumType(self,DataType):
125        self._DatumType = DataType
126        self._Capacity = None
127
128    @property
129    def BaseDatumType(self):
130        if self.IsArray():
131            return self._DatumType[:self._DatumType.index("[")]
132        else:
133            return self._DatumType
134    def IsArray(self):
135        return True if len(self.Capacity) else False
136
137    def IsAggregateDatumType(self):
138        if self.DatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:
139            return False
140        if self.IsArray() or StructPattern.match(self.DatumType):
141            return True
142        return False
143
144    def IsSimpleTypeArray(self):
145        if self.IsArray() and self.BaseDatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, "BOOLEAN"]:
146            return True
147        return False
148
149    @staticmethod
150    def GetPcdMaxSizeWorker(PcdString, MaxSize):
151        if PcdString.startswith("{") and PcdString.endswith("}"):
152            return  max([len(PcdString.split(",")),MaxSize])
153
154        if PcdString.startswith("\"") or PcdString.startswith("\'"):
155            return  max([len(PcdString)-2+1,MaxSize])
156
157        if PcdString.startswith("L\""):
158            return  max([2*(len(PcdString)-3+1),MaxSize])
159
160        return max([len(PcdString),MaxSize])
161
162    ## Get the maximum number of bytes
163    def GetPcdMaxSize(self):
164        if self.DatumType in TAB_PCD_NUMERIC_TYPES:
165            return MAX_SIZE_TYPE[self.DatumType]
166
167        MaxSize = int(self.MaxDatumSize, 10) if self.MaxDatumSize else 0
168        if self.PcdValueFromFdf:
169            MaxSize = self.GetPcdMaxSizeWorker(self.PcdValueFromFdf,MaxSize)
170        if self.PcdValueFromComm:
171            MaxSize = self.GetPcdMaxSizeWorker(self.PcdValueFromComm,MaxSize)
172        if hasattr(self, "DefaultValueFromDec"):
173            MaxSize = self.GetPcdMaxSizeWorker(self.DefaultValueFromDec,MaxSize)
174        return MaxSize
175
176    ## Get the number of bytes
177    def GetPcdSize(self):
178        if self.DatumType in TAB_PCD_NUMERIC_TYPES:
179            return MAX_SIZE_TYPE[self.DatumType]
180        if not self.DefaultValue:
181            return 1
182        elif self.DefaultValue[0] == 'L':
183            return (len(self.DefaultValue) - 2) * 2
184        elif self.DefaultValue[0] == '{':
185            return len(self.DefaultValue.split(','))
186        else:
187            return len(self.DefaultValue) - 1
188
189
190    ## Convert the class to a string
191    #
192    #  Convert each member of the class to string
193    #  Organize to a single line format string
194    #
195    #  @retval Rtn Formatted String
196    #
197    def __str__(self):
198        Rtn = '\tTokenCName=' + str(self.TokenCName) + ', ' + \
199              'TokenSpaceGuidCName=' + str(self.TokenSpaceGuidCName) + ', ' + \
200              'Type=' + str(self.Type) + ', ' + \
201              'DatumType=' + str(self.DatumType) + ', ' + \
202              'DefaultValue=' + str(self.DefaultValue) + ', ' + \
203              'TokenValue=' + str(self.TokenValue) + ', ' + \
204              'MaxDatumSize=' + str(self.MaxDatumSize) + ', '
205        for Item in self.SkuInfoList.values():
206            Rtn = Rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName
207        Rtn = Rtn + ', IsOverrided=' + str(self.IsOverrided)
208
209        return Rtn
210
211    ## Override __eq__ function
212    #
213    # Check whether pcds are the same
214    #
215    # @retval False The two pcds are different
216    # @retval True  The two pcds are the same
217    #
218    def __eq__(self, Other):
219        return Other and self.TokenCName == Other.TokenCName and self.TokenSpaceGuidCName == Other.TokenSpaceGuidCName
220
221    ## Override __hash__ function
222    #
223    # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
224    #
225    # @retval truple() Key for hash table
226    #
227    def __hash__(self):
228        return hash((self.TokenCName, self.TokenSpaceGuidCName))
229
230    def sharedcopy(self,new_pcd):
231        new_pcd.TokenCName = self.TokenCName
232        new_pcd.TokenSpaceGuidCName = self.TokenSpaceGuidCName
233        new_pcd.TokenSpaceGuidValue = self.TokenSpaceGuidValue
234        new_pcd.Type = self.Type
235        new_pcd.DatumType = self.DatumType
236        new_pcd.DefaultValue = self.DefaultValue
237        new_pcd.TokenValue = self.TokenValue
238        new_pcd.MaxDatumSize = self.MaxDatumSize
239        new_pcd.MaxSizeUserSet = self.MaxSizeUserSet
240
241        new_pcd.Phase = self.Phase
242        new_pcd.Pending = self.Pending
243        new_pcd.IsOverrided = self.IsOverrided
244        new_pcd.IsFromBinaryInf = self.IsFromBinaryInf
245        new_pcd.IsFromDsc = self.IsFromDsc
246        new_pcd.PcdValueFromComm = self.PcdValueFromComm
247        new_pcd.PcdValueFromFdf = self.PcdValueFromFdf
248        new_pcd.UserDefinedDefaultStoresFlag = self.UserDefinedDefaultStoresFlag
249        new_pcd.DscRawValue = self.DscRawValue
250        new_pcd.DscRawValueInfo = self.DscRawValueInfo
251        new_pcd.CustomAttribute = self.CustomAttribute
252        new_pcd.validateranges = [item for item in self.validateranges]
253        new_pcd.validlists = [item for item in self.validlists]
254        new_pcd.expressions = [item for item in self.expressions]
255        new_pcd.SkuInfoList = {key: copy.deepcopy(skuobj) for key,skuobj in self.SkuInfoList.items()}
256        return new_pcd
257
258    def __deepcopy__(self,memo):
259        new_pcd = PcdClassObject()
260        self.sharedcopy(new_pcd)
261        return new_pcd
262
263class StructurePcd(PcdClassObject):
264    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):
265        if SkuInfoList is None:
266            SkuInfoList = {}
267        if validateranges is None:
268            validateranges = []
269        if validlists is None:
270            validlists = []
271        if expressions is None:
272            expressions = []
273        if Packages is None:
274            Packages = []
275        super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions)
276        self.StructuredPcdIncludeFile = [] if StructuredPcdIncludeFile is None else StructuredPcdIncludeFile
277        self.PackageDecs = Packages
278        self.DefaultStoreName = [default_store]
279        self.DefaultValues = OrderedDict()
280        self.PcdMode = None
281        self.SkuOverrideValues = OrderedDict()
282        self.StructName = None
283        self.PcdDefineLineNo = 0
284        self.PkgPath = ""
285        self.DefaultValueFromDec = ""
286        self.DefaultValueFromDecInfo = None
287        self.ValueChain = set()
288        self.PcdFieldValueFromComm = OrderedDict()
289        self.PcdFieldValueFromFdf = OrderedDict()
290        self.DefaultFromDSC=None
291    def __repr__(self):
292        return self.TypeName
293
294    def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0,DimensionAttr ="-1"):
295        if DimensionAttr not in self.DefaultValues:
296            self.DefaultValues[DimensionAttr] = collections.OrderedDict()
297        if FieldName in self.DefaultValues[DimensionAttr]:
298            del self.DefaultValues[DimensionAttr][FieldName]
299        self.DefaultValues[DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]
300        return self.DefaultValues[DimensionAttr][FieldName]
301
302    def SetDecDefaultValue(self, DefaultValue,decpath=None,lineno=None):
303        self.DefaultValueFromDec = DefaultValue
304        self.DefaultValueFromDecInfo = (decpath,lineno)
305    def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0, DimensionAttr = '-1'):
306        if SkuName not in self.SkuOverrideValues:
307            self.SkuOverrideValues[SkuName] = OrderedDict()
308        if DefaultStoreName not in self.SkuOverrideValues[SkuName]:
309            self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict()
310        if DimensionAttr not in self.SkuOverrideValues[SkuName][DefaultStoreName]:
311            self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr] = collections.OrderedDict()
312        if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]:
313            del self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName]
314        self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]
315        return self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName]
316
317    def SetPcdMode (self, PcdMode):
318        self.PcdMode = PcdMode
319
320    def copy(self, PcdObject):
321        self.TokenCName = PcdObject.TokenCName if PcdObject.TokenCName else self.TokenCName
322        self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName
323        self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue
324        self.Type = PcdObject.Type if PcdObject.Type else self.Type
325        self._DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType
326        self.DefaultValue = PcdObject.DefaultValue if  PcdObject.DefaultValue else self.DefaultValue
327        self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue
328        self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize
329        self.SkuInfoList = PcdObject.SkuInfoList if PcdObject.SkuInfoList else self.SkuInfoList
330        self.Phase = PcdObject.Phase if PcdObject.Phase else self.Phase
331        self.Pending = PcdObject.Pending if PcdObject.Pending else self.Pending
332        self.IsOverrided = PcdObject.IsOverrided if PcdObject.IsOverrided else self.IsOverrided
333        self.IsFromBinaryInf = PcdObject.IsFromBinaryInf if PcdObject.IsFromBinaryInf else self.IsFromBinaryInf
334        self.IsFromDsc = PcdObject.IsFromDsc if PcdObject.IsFromDsc else self.IsFromDsc
335        self.validateranges = PcdObject.validateranges if PcdObject.validateranges else self.validateranges
336        self.validlists = PcdObject.validlists if PcdObject.validlists else self.validlists
337        self.expressions = PcdObject.expressions if PcdObject.expressions else self.expressions
338        self.DscRawValue = PcdObject.DscRawValue if PcdObject.DscRawValue else self.DscRawValue
339        self.DscRawValueInfo = PcdObject.DscRawValueInfo if PcdObject.DscRawValueInfo else self.DscRawValueInfo
340        self.PcdValueFromComm = PcdObject.PcdValueFromComm if PcdObject.PcdValueFromComm else self.PcdValueFromComm
341        self.PcdValueFromFdf = PcdObject.PcdValueFromFdf if PcdObject.PcdValueFromFdf else self.PcdValueFromFdf
342        self.CustomAttribute = PcdObject.CustomAttribute if PcdObject.CustomAttribute else self.CustomAttribute
343        self.UserDefinedDefaultStoresFlag = PcdObject.UserDefinedDefaultStoresFlag if PcdObject.UserDefinedDefaultStoresFlag else self.UserDefinedDefaultStoresFlag
344        if isinstance(PcdObject, StructurePcd):
345            self.StructuredPcdIncludeFile = PcdObject.StructuredPcdIncludeFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdIncludeFile
346            self.PackageDecs = PcdObject.PackageDecs if PcdObject.PackageDecs else self.PackageDecs
347            self.DefaultValues = PcdObject.DefaultValues if PcdObject.DefaultValues else self.DefaultValues
348            self.PcdMode = PcdObject.PcdMode if PcdObject.PcdMode else self.PcdMode
349            self.DefaultValueFromDec = PcdObject.DefaultValueFromDec if PcdObject.DefaultValueFromDec else self.DefaultValueFromDec
350            self.DefaultValueFromDecInfo = PcdObject.DefaultValueFromDecInfo if PcdObject.DefaultValueFromDecInfo else self.DefaultValueFromDecInfo
351            self.SkuOverrideValues = PcdObject.SkuOverrideValues if PcdObject.SkuOverrideValues else self.SkuOverrideValues
352            self.StructName = PcdObject.DatumType if PcdObject.DatumType else self.StructName
353            self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo
354            self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath
355            self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain
356            self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm
357            self.PcdFieldValueFromFdf = PcdObject.PcdFieldValueFromFdf if PcdObject.PcdFieldValueFromFdf else self.PcdFieldValueFromFdf
358
359    def __deepcopy__(self,memo):
360        new_pcd = StructurePcd()
361        self.sharedcopy(new_pcd)
362
363        new_pcd.DefaultValueFromDec = self.DefaultValueFromDec
364        new_pcd.DefaultValueFromDecInfo = self.DefaultValueFromDecInfo
365        new_pcd.PcdMode = self.PcdMode
366        new_pcd.StructName = self.DatumType
367        new_pcd.PcdDefineLineNo = self.PcdDefineLineNo
368        new_pcd.PkgPath = self.PkgPath
369        new_pcd.StructuredPcdIncludeFile = [item for item in self.StructuredPcdIncludeFile]
370        new_pcd.PackageDecs = [item for item in self.PackageDecs]
371        new_pcd.DefaultValues = CopyDict(self.DefaultValues)
372        new_pcd.DefaultFromDSC=CopyDict(self.DefaultFromDSC)
373        new_pcd.SkuOverrideValues = CopyDict(self.SkuOverrideValues)
374        new_pcd.PcdFieldValueFromComm = CopyDict(self.PcdFieldValueFromComm)
375        new_pcd.PcdFieldValueFromFdf = CopyDict(self.PcdFieldValueFromFdf)
376        new_pcd.ValueChain = {item for item in self.ValueChain}
377        return new_pcd
378
379LibraryClassObject = namedtuple('LibraryClassObject', ['LibraryClass','SupModList'])
380
381## ModuleBuildClassObject
382#
383# This Class defines ModuleBuildClass
384#
385# @param object:               Inherited from object class
386#
387# @var MetaFile:              To store value for module meta file path
388# @var BaseName:               To store value for BaseName
389# @var ModuleType:             To store value for ModuleType
390# @var Guid:                   To store value for Guid
391# @var Version:                To store value for Version
392# @var PcdIsDriver:            To store value for PcdIsDriver
393# @var BinaryModule:           To store value for BinaryModule
394# @var CustomMakefile:         To store value for CustomMakefile
395# @var Specification:          To store value for Specification
396# @var Shadow                  To store value for Shadow
397# @var LibraryClass:           To store value for LibraryClass, it is a list structure as
398#                              [ LibraryClassObject, ...]
399# @var ModuleEntryPointList:   To store value for ModuleEntryPointList
400# @var ModuleUnloadImageList:  To store value for ModuleUnloadImageList
401# @var ConstructorList:        To store value for ConstructorList
402# @var DestructorList:         To store value for DestructorList
403# @var Binaries:               To store value for Binaries, it is a list structure as
404#                              [ ModuleBinaryClassObject, ...]
405# @var Sources:                To store value for Sources, it is a list structure as
406#                              [ ModuleSourceFilesClassObject, ... ]
407# @var LibraryClasses:         To store value for LibraryClasses, it is a set structure as
408#                              { [LibraryClassName, ModuleType] : LibraryClassInfFile }
409# @var Protocols:              To store value for Protocols, it is a list structure as
410#                              [ ProtocolName, ... ]
411# @var Ppis:                   To store value for Ppis, it is a list structure as
412#                              [ PpiName, ... ]
413# @var Guids:                  To store value for Guids, it is a list structure as
414#                              [ GuidName, ... ]
415# @var Includes:               To store value for Includes, it is a list structure as
416#                              [ IncludePath, ... ]
417# @var Packages:               To store value for Packages, it is a list structure as
418#                              [ DecFileName, ... ]
419# @var Pcds:                   To store value for Pcds, it is a set structure as
420#                              { [(PcdCName, PcdGuidCName)] : PcdClassObject}
421# @var BuildOptions:           To store value for BuildOptions, it is a set structure as
422#                              { [BuildOptionKey] : BuildOptionValue}
423# @var Depex:                  To store value for Depex
424#
425class ModuleBuildClassObject(object):
426    def __init__(self):
427        self.AutoGenVersion          = 0
428        self.MetaFile                = ''
429        self.BaseName                = ''
430        self.ModuleType              = ''
431        self.Guid                    = ''
432        self.Version                 = ''
433        self.PcdIsDriver             = ''
434        self.BinaryModule            = ''
435        self.Shadow                  = ''
436        self.CustomMakefile          = {}
437        self.Specification           = {}
438        self.LibraryClass            = []
439        self.ModuleEntryPointList    = []
440        self.ModuleUnloadImageList   = []
441        self.ConstructorList         = []
442        self.DestructorList          = []
443
444        self.Binaries                = []
445        self.Sources                 = []
446        self.LibraryClasses          = OrderedDict()
447        self.Libraries               = []
448        self.Protocols               = []
449        self.Ppis                    = []
450        self.Guids                   = []
451        self.Includes                = []
452        self.Packages                = []
453        self.Pcds                    = {}
454        self.BuildOptions            = {}
455        self.Depex                   = {}
456
457    ## Convert the class to a string
458    #
459    #  Convert member MetaFile of the class to a string
460    #
461    #  @retval string Formatted String
462    #
463    def __str__(self):
464        return str(self.MetaFile)
465
466    ## Override __eq__ function
467    #
468    # Check whether ModuleBuildClassObjects are the same
469    #
470    # @retval False The two ModuleBuildClassObjects are different
471    # @retval True  The two ModuleBuildClassObjects are the same
472    #
473    def __eq__(self, Other):
474        return self.MetaFile == Other
475
476    ## Override __hash__ function
477    #
478    # Use MetaFile as key in hash table
479    #
480    # @retval string Key for hash table
481    #
482    def __hash__(self):
483        return hash(self.MetaFile)
484
485## PackageBuildClassObject
486#
487# This Class defines PackageBuildClass
488#
489# @param object:        Inherited from object class
490#
491# @var MetaFile:       To store value for package meta file path
492# @var PackageName:     To store value for PackageName
493# @var Guid:            To store value for Guid
494# @var Version:         To store value for Version
495# @var Protocols:       To store value for Protocols, it is a set structure as
496#                       { [ProtocolName] : Protocol Guid, ... }
497# @var Ppis:            To store value for Ppis, it is a set structure as
498#                       { [PpiName] : Ppi Guid, ... }
499# @var Guids:           To store value for Guids, it is a set structure as
500#                       { [GuidName] : Guid, ... }
501# @var Includes:        To store value for Includes, it is a list structure as
502#                       [ IncludePath, ... ]
503# @var LibraryClasses:  To store value for LibraryClasses, it is a set structure as
504#                       { [LibraryClassName] : LibraryClassInfFile }
505# @var Pcds:            To store value for Pcds, it is a set structure as
506#                       { [(PcdCName, PcdGuidCName)] : PcdClassObject}
507#
508class PackageBuildClassObject(object):
509    def __init__(self):
510        self.MetaFile                = ''
511        self.PackageName             = ''
512        self.Guid                    = ''
513        self.Version                 = ''
514
515        self.Protocols               = {}
516        self.Ppis                    = {}
517        self.Guids                   = {}
518        self.Includes                = []
519        self.LibraryClasses          = {}
520        self.Pcds                    = {}
521
522    ## Convert the class to a string
523    #
524    #  Convert member MetaFile of the class to a string
525    #
526    #  @retval string Formatted String
527    #
528    def __str__(self):
529        return str(self.MetaFile)
530
531    ## Override __eq__ function
532    #
533    # Check whether PackageBuildClassObjects are the same
534    #
535    # @retval False The two PackageBuildClassObjects are different
536    # @retval True  The two PackageBuildClassObjects are the same
537    #
538    def __eq__(self, Other):
539        return self.MetaFile == Other
540
541    ## Override __hash__ function
542    #
543    # Use MetaFile as key in hash table
544    #
545    # @retval string Key for hash table
546    #
547    def __hash__(self):
548        return hash(self.MetaFile)
549
550## PlatformBuildClassObject
551#
552# This Class defines PlatformBuildClass
553#
554# @param object:          Inherited from object class
555#
556# @var MetaFile:         To store value for platform meta-file path
557# @var PlatformName:      To store value for PlatformName
558# @var Guid:              To store value for Guid
559# @var Version:           To store value for Version
560# @var DscSpecification:  To store value for DscSpecification
561# @var OutputDirectory:   To store value for OutputDirectory
562# @var FlashDefinition:   To store value for FlashDefinition
563# @var BuildNumber:       To store value for BuildNumber
564# @var MakefileName:      To store value for MakefileName
565# @var SkuIds:            To store value for SkuIds, it is a set structure as
566#                         { 'SkuName' : SkuId, '!include' : includefilename, ...}
567# @var Modules:           To store value for Modules, it is a list structure as
568#                         [ InfFileName, ... ]
569# @var Libraries:         To store value for Libraries, it is a list structure as
570#                         [ InfFileName, ... ]
571# @var LibraryClasses:    To store value for LibraryClasses, it is a set structure as
572#                         { (LibraryClassName, ModuleType) : LibraryClassInfFile }
573# @var Pcds:              To store value for Pcds, it is a set structure as
574#                         { [(PcdCName, PcdGuidCName)] : PcdClassObject }
575# @var BuildOptions:      To store value for BuildOptions, it is a set structure as
576#                         { [BuildOptionKey] : BuildOptionValue }
577#
578class PlatformBuildClassObject(object):
579    def __init__(self):
580        self.MetaFile                = ''
581        self.PlatformName            = ''
582        self.Guid                    = ''
583        self.Version                 = ''
584        self.DscSpecification        = ''
585        self.OutputDirectory         = ''
586        self.FlashDefinition         = ''
587        self.BuildNumber             = ''
588        self.MakefileName            = ''
589
590        self.SkuIds                  = {}
591        self.Modules                 = []
592        self.LibraryInstances        = []
593        self.LibraryClasses          = {}
594        self.Libraries               = {}
595        self.Pcds                    = {}
596        self.BuildOptions            = {}
597
598    ## Convert the class to a string
599    #
600    #  Convert member MetaFile of the class to a string
601    #
602    #  @retval string Formatted String
603    #
604    def __str__(self):
605        return str(self.MetaFile)
606
607    ## Override __eq__ function
608    #
609    # Check whether PlatformBuildClassObjects are the same
610    #
611    # @retval False The two PlatformBuildClassObjects are different
612    # @retval True  The two PlatformBuildClassObjects are the same
613    #
614    def __eq__(self, Other):
615        return self.MetaFile == Other
616
617    ## Override __hash__ function
618    #
619    # Use MetaFile as key in hash table
620    #
621    # @retval string Key for hash table
622    #
623    def __hash__(self):
624        return hash(self.MetaFile)
625