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