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