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