]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/BuildClassObject.py
BaseTools: Support Structure PCD value assignment in DEC/DSC
[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
cc71d8b7 4# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
40d841f6 5# This program and the accompanying materials\r
30fdf114
LG
6# are licensed and made available under the terms and conditions of the BSD License\r
7# which accompanies this distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
1be2ed90 14import Common.LongFilePathOs as os\r
30fdf114
LG
15\r
16from Common.Misc import sdict\r
17from Common.Misc import RealPath2\r
18from Common.BuildToolError import *\r
ae7b6df8 19import collections\r
30fdf114
LG
20\r
21## PcdClassObject\r
22#\r
23# This Class is used for PcdObject\r
24#\r
25# @param object: Inherited from object class\r
26# @param Name: Input value for Name of Pcd, default is None\r
27# @param Guid: Input value for Guid of Pcd, default is None\r
28# @param Type: Input value for Type of Pcd, default is None\r
29# @param DatumType: Input value for DatumType of Pcd, default is None\r
30# @param Value: Input value for Value of Pcd, default is None\r
31# @param Token: Input value for Token of Pcd, default is None\r
32# @param MaxDatumSize: Input value for MaxDatumSize of Pcd, default is None\r
33# @param SkuInfoList: Input value for SkuInfoList of Pcd, default is {}\r
34# @param IsOverrided: Input value for IsOverrided of Pcd, default is False\r
e56468c0 35# @param GuidValue: Input value for TokenSpaceGuidValue of Pcd, default is None\r
30fdf114
LG
36#\r
37# @var TokenCName: To store value for TokenCName\r
38# @var TokenSpaceGuidCName: To store value for TokenSpaceGuidCName\r
39# @var Type: To store value for Type\r
40# @var DatumType: To store value for DatumType\r
41# @var TokenValue: To store value for TokenValue\r
42# @var MaxDatumSize: To store value for MaxDatumSize\r
43# @var SkuInfoList: To store value for SkuInfoList\r
44# @var IsOverrided: To store value for IsOverrided\r
45# @var Phase: To store value for Phase, default is "DXE"\r
46#\r
47class PcdClassObject(object):\r
cc71d8b7 48 def __init__(self, Name = None, Guid = None, Type = None, DatumType = None, Value = None, Token = None, MaxDatumSize = None, SkuInfoList = {}, IsOverrided = False, GuidValue = None, validateranges = [], validlists = [], expressions = [], IsDsc = False):\r
30fdf114
LG
49 self.TokenCName = Name\r
50 self.TokenSpaceGuidCName = Guid\r
51 self.TokenSpaceGuidValue = GuidValue\r
52 self.Type = Type\r
53 self.DatumType = DatumType\r
54 self.DefaultValue = Value\r
55 self.TokenValue = Token\r
56 self.MaxDatumSize = MaxDatumSize\r
57 self.SkuInfoList = SkuInfoList\r
58 self.Phase = "DXE"\r
59 self.Pending = False\r
e56468c0 60 self.IsOverrided = IsOverrided\r
a0a2cd1e
FB
61 self.IsFromBinaryInf = False\r
62 self.IsFromDsc = False\r
82a6a960
BF
63 self.validateranges = validateranges\r
64 self.validlists = validlists\r
65 self.expressions = expressions\r
cc71d8b7
YZ
66 self.DscDefaultValue = None\r
67 if IsDsc:\r
68 self.DscDefaultValue = Value\r
e56468c0 69 \r
30fdf114
LG
70 ## Convert the class to a string\r
71 #\r
72 # Convert each member of the class to string\r
73 # Organize to a signle line format string\r
74 #\r
75 # @retval Rtn Formatted String\r
76 #\r
77 def __str__(self):\r
78 Rtn = '\tTokenCName=' + str(self.TokenCName) + ', ' + \\r
79 'TokenSpaceGuidCName=' + str(self.TokenSpaceGuidCName) + ', ' + \\r
80 'Type=' + str(self.Type) + ', ' + \\r
81 'DatumType=' + str(self.DatumType) + ', ' + \\r
82 'DefaultValue=' + str(self.DefaultValue) + ', ' + \\r
83 'TokenValue=' + str(self.TokenValue) + ', ' + \\r
84 'MaxDatumSize=' + str(self.MaxDatumSize) + ', '\r
85 for Item in self.SkuInfoList.values():\r
86 Rtn = Rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName\r
e56468c0 87 Rtn = Rtn + ', IsOverrided=' + str(self.IsOverrided)\r
30fdf114
LG
88\r
89 return Rtn\r
90\r
91 ## Override __eq__ function\r
92 #\r
93 # Check whether pcds are the same\r
94 #\r
95 # @retval False The two pcds are different\r
96 # @retval True The two pcds are the same\r
97 #\r
98 def __eq__(self, Other):\r
99 return Other and self.TokenCName == Other.TokenCName and self.TokenSpaceGuidCName == Other.TokenSpaceGuidCName\r
100\r
101 ## Override __hash__ function\r
102 #\r
103 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table\r
104 #\r
105 # @retval truple() Key for hash table\r
106 #\r
107 def __hash__(self):\r
108 return hash((self.TokenCName, self.TokenSpaceGuidCName))\r
109\r
ae7b6df8
LG
110class StructurePcd(PcdClassObject):\r
111 def __init__(self, StructuredPcdIncludeFile="", Packages=None, Name=None, Guid=None, Type=None, DatumType=None, Value=None, Token=None, MaxDatumSize=None, SkuInfoList={}, IsOverrided=False, GuidValue=None, validateranges=[], validlists=[], expressions=[]):\r
112 super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions)\r
113 self.StructuredPcdIncludeFile = StructuredPcdIncludeFile\r
114 self.PackageDecs = Packages\r
115 self.DefaultStoreName = ['STANDARD']\r
116 self.DefaultValues = collections.OrderedDict({})\r
117 self.PcdMode = None\r
118 self.SkuOverrideValues = collections.OrderedDict({})\r
119 self.FlexibleFieldName = None\r
120\r
121 def __repr__(self):\r
122 return self.TypeName\r
123\r
124 def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0):\r
125 self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo]\r
126 return self.DefaultValues[FieldName]\r
127\r
128 def AddOverrideValue (self, FieldName, Value, SkuName, FileName="", LineNo=0):\r
129 if SkuName not in self.SkuOverrideValues:\r
130 self.SkuOverrideValues[SkuName] = collections.OrderedDict({})\r
131 self.SkuOverrideValues[SkuName][FieldName] = [Value.strip(), FileName, LineNo]\r
132 return self.SkuOverrideValues[SkuName][FieldName]\r
133\r
134 def SetPcdMode (self, PcdMode):\r
135 self.PcdMode = PcdMode\r
136\r
137 def SetFlexibleFieldName (self, FlexibleFieldName):\r
138 self.FlexibleFieldName = FlexibleFieldName\r
139\r
140 def copy(self, PcdObject):\r
141 self.TokenCName = PcdObject.TokenCName if PcdObject.TokenCName else self.TokenCName\r
142 self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName\r
143 self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue\r
144 self.Type = PcdObject.Type if PcdObject.Type else self.Type\r
145 self.DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType\r
146 self.DefaultValue = PcdObject.DefaultValue if PcdObject.DefaultValue else self.DefaultValue\r
147 self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue\r
148 self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize\r
149 self.SkuInfoList = PcdObject.SkuInfoList if PcdObject.SkuInfoList else self.SkuInfoList\r
150 self.Phase = PcdObject.Phase if PcdObject.Phase else self.Phase\r
151 self.Pending = PcdObject.Pending if PcdObject.Pending else self.Pending\r
152 self.IsOverrided = PcdObject.IsOverrided if PcdObject.IsOverrided else self.IsOverrided\r
153 self.IsFromBinaryInf = PcdObject.IsFromBinaryInf if PcdObject.IsFromBinaryInf else self.IsFromBinaryInf\r
154 self.IsFromDsc = PcdObject.IsFromDsc if PcdObject.IsFromDsc else self.IsFromDsc\r
155 self.validateranges = PcdObject.validateranges if PcdObject.validateranges else self.validateranges\r
156 self.validlists = PcdObject.validlists if PcdObject.validlists else self.validlists\r
157 self.expressions = PcdObject.expressions if PcdObject.expressions else self.expressions\r
158 if type(PcdObject) is StructurePcd:\r
159 self.StructuredPcdIncludeFile = PcdObject.StructuredPcdIncludeFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdIncludeFile\r
160 self.PackageDecs = PcdObject.PackageDecs if PcdObject.PackageDecs else self.PackageDecs\r
161 self.DefaultValues = PcdObject.DefaultValues if PcdObject.DefaultValues else self.DefaultValues\r
162 self.PcdMode = PcdObject.PcdMode if PcdObject.PcdMode else self.PcdMode\r
163 self.DefaultFromDSC=None\r
164 self.OverrideValues = PcdObject.SkuOverrideValues if PcdObject.SkuOverrideValues else self.SkuOverrideValues\r
165 self.FlexibleFieldName = PcdObject.FlexibleFieldName if PcdObject.FlexibleFieldName else self.FlexibleFieldName\r
166\r
30fdf114
LG
167## LibraryClassObject\r
168#\r
169# This Class defines LibraryClassObject used in BuildDatabase\r
170#\r
171# @param object: Inherited from object class\r
172# @param Name: Input value for LibraryClassName, default is None\r
173# @param SupModList: Input value for SupModList, default is []\r
174# @param Type: Input value for Type, default is None\r
175#\r
176# @var LibraryClass: To store value for LibraryClass\r
177# @var SupModList: To store value for SupModList\r
178# @var Type: To store value for Type\r
179#\r
180class LibraryClassObject(object):\r
181 def __init__(self, Name = None, SupModList = [], Type = None):\r
182 self.LibraryClass = Name\r
183 self.SupModList = SupModList\r
184 if Type != None:\r
185 self.SupModList = CleanString(Type).split(DataType.TAB_SPACE_SPLIT)\r
186\r
187## ModuleBuildClassObject\r
188#\r
189# This Class defines ModuleBuildClass\r
190#\r
191# @param object: Inherited from object class\r
192#\r
193# @var MetaFile: To store value for module meta file path\r
194# @var BaseName: To store value for BaseName\r
195# @var ModuleType: To store value for ModuleType\r
196# @var Guid: To store value for Guid\r
197# @var Version: To store value for Version\r
198# @var PcdIsDriver: To store value for PcdIsDriver\r
199# @var BinaryModule: To store value for BinaryModule\r
200# @var CustomMakefile: To store value for CustomMakefile\r
201# @var Specification: To store value for Specification\r
202# @var Shadow To store value for Shadow\r
203# @var LibraryClass: To store value for LibraryClass, it is a list structure as\r
204# [ LibraryClassObject, ...]\r
205# @var ModuleEntryPointList: To store value for ModuleEntryPointList\r
206# @var ModuleUnloadImageList: To store value for ModuleUnloadImageList\r
207# @var ConstructorList: To store value for ConstructorList\r
208# @var DestructorList: To store value for DestructorList\r
209# @var Binaries: To store value for Binaries, it is a list structure as\r
210# [ ModuleBinaryClassObject, ...]\r
211# @var Sources: To store value for Sources, it is a list structure as\r
212# [ ModuleSourceFilesClassObject, ... ]\r
213# @var LibraryClasses: To store value for LibraryClasses, it is a set structure as\r
214# { [LibraryClassName, ModuleType] : LibraryClassInfFile }\r
215# @var Protocols: To store value for Protocols, it is a list structure as\r
216# [ ProtocolName, ... ]\r
217# @var Ppis: To store value for Ppis, it is a list structure as\r
218# [ PpiName, ... ]\r
219# @var Guids: To store value for Guids, it is a list structure as\r
220# [ GuidName, ... ]\r
221# @var Includes: To store value for Includes, it is a list structure as\r
222# [ IncludePath, ... ]\r
223# @var Packages: To store value for Packages, it is a list structure as\r
224# [ DecFileName, ... ]\r
225# @var Pcds: To store value for Pcds, it is a set structure as\r
226# { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
227# @var BuildOptions: To store value for BuildOptions, it is a set structure as\r
228# { [BuildOptionKey] : BuildOptionValue}\r
229# @var Depex: To store value for Depex\r
230#\r
231class ModuleBuildClassObject(object):\r
232 def __init__(self):\r
233 self.AutoGenVersion = 0\r
234 self.MetaFile = ''\r
235 self.BaseName = ''\r
236 self.ModuleType = ''\r
237 self.Guid = ''\r
238 self.Version = ''\r
239 self.PcdIsDriver = ''\r
240 self.BinaryModule = ''\r
241 self.Shadow = ''\r
242 self.SourceOverridePath = ''\r
243 self.CustomMakefile = {}\r
244 self.Specification = {}\r
245 self.LibraryClass = []\r
246 self.ModuleEntryPointList = []\r
247 self.ModuleUnloadImageList = []\r
248 self.ConstructorList = []\r
249 self.DestructorList = []\r
250\r
251 self.Binaries = []\r
252 self.Sources = []\r
253 self.LibraryClasses = sdict()\r
254 self.Libraries = []\r
255 self.Protocols = []\r
256 self.Ppis = []\r
257 self.Guids = []\r
258 self.Includes = []\r
259 self.Packages = []\r
260 self.Pcds = {}\r
261 self.BuildOptions = {}\r
262 self.Depex = {}\r
263\r
264 ## Convert the class to a string\r
265 #\r
266 # Convert member MetaFile of the class to a string\r
267 #\r
268 # @retval string Formatted String\r
269 #\r
270 def __str__(self):\r
271 return str(self.MetaFile)\r
272\r
273 ## Override __eq__ function\r
274 #\r
275 # Check whether ModuleBuildClassObjects are the same\r
276 #\r
277 # @retval False The two ModuleBuildClassObjects are different\r
278 # @retval True The two ModuleBuildClassObjects are the same\r
279 #\r
280 def __eq__(self, Other):\r
281 return self.MetaFile == Other\r
282\r
283 ## Override __hash__ function\r
284 #\r
285 # Use MetaFile as key in hash table\r
286 #\r
287 # @retval string Key for hash table\r
288 #\r
289 def __hash__(self):\r
290 return hash(self.MetaFile)\r
291\r
292## PackageBuildClassObject\r
293#\r
294# This Class defines PackageBuildClass\r
295#\r
296# @param object: Inherited from object class\r
297#\r
298# @var MetaFile: To store value for package meta file path\r
299# @var PackageName: To store value for PackageName\r
300# @var Guid: To store value for Guid\r
301# @var Version: To store value for Version\r
302# @var Protocols: To store value for Protocols, it is a set structure as\r
303# { [ProtocolName] : Protocol Guid, ... }\r
304# @var Ppis: To store value for Ppis, it is a set structure as\r
305# { [PpiName] : Ppi Guid, ... }\r
306# @var Guids: To store value for Guids, it is a set structure as\r
307# { [GuidName] : Guid, ... }\r
308# @var Includes: To store value for Includes, it is a list structure as\r
309# [ IncludePath, ... ]\r
310# @var LibraryClasses: To store value for LibraryClasses, it is a set structure as\r
311# { [LibraryClassName] : LibraryClassInfFile }\r
312# @var Pcds: To store value for Pcds, it is a set structure as\r
313# { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
314#\r
315class PackageBuildClassObject(object):\r
316 def __init__(self):\r
317 self.MetaFile = ''\r
318 self.PackageName = ''\r
319 self.Guid = ''\r
320 self.Version = ''\r
321\r
322 self.Protocols = {}\r
323 self.Ppis = {}\r
324 self.Guids = {}\r
325 self.Includes = []\r
326 self.LibraryClasses = {}\r
327 self.Pcds = {}\r
328\r
329 ## Convert the class to a string\r
330 #\r
331 # Convert member MetaFile of the class to a string\r
332 #\r
333 # @retval string Formatted String\r
334 #\r
335 def __str__(self):\r
336 return str(self.MetaFile)\r
337\r
338 ## Override __eq__ function\r
339 #\r
340 # Check whether PackageBuildClassObjects are the same\r
341 #\r
342 # @retval False The two PackageBuildClassObjects are different\r
343 # @retval True The two PackageBuildClassObjects are the same\r
344 #\r
345 def __eq__(self, Other):\r
346 return self.MetaFile == Other\r
347\r
348 ## Override __hash__ function\r
349 #\r
350 # Use MetaFile as key in hash table\r
351 #\r
352 # @retval string Key for hash table\r
353 #\r
354 def __hash__(self):\r
355 return hash(self.MetaFile)\r
356\r
357## PlatformBuildClassObject\r
358#\r
359# This Class defines PlatformBuildClass\r
360#\r
361# @param object: Inherited from object class\r
362#\r
363# @var MetaFile: To store value for platform meta-file path\r
364# @var PlatformName: To store value for PlatformName\r
365# @var Guid: To store value for Guid\r
366# @var Version: To store value for Version\r
367# @var DscSpecification: To store value for DscSpecification\r
368# @var OutputDirectory: To store value for OutputDirectory\r
369# @var FlashDefinition: To store value for FlashDefinition\r
370# @var BuildNumber: To store value for BuildNumber\r
371# @var MakefileName: To store value for MakefileName\r
372# @var SkuIds: To store value for SkuIds, it is a set structure as\r
373# { 'SkuName' : SkuId, '!include' : includefilename, ...}\r
374# @var Modules: To store value for Modules, it is a list structure as\r
375# [ InfFileName, ... ]\r
376# @var Libraries: To store value for Libraries, it is a list structure as\r
377# [ InfFileName, ... ]\r
378# @var LibraryClasses: To store value for LibraryClasses, it is a set structure as\r
379# { (LibraryClassName, ModuleType) : LibraryClassInfFile }\r
380# @var Pcds: To store value for Pcds, it is a set structure as\r
381# { [(PcdCName, PcdGuidCName)] : PcdClassObject }\r
382# @var BuildOptions: To store value for BuildOptions, it is a set structure as\r
383# { [BuildOptionKey] : BuildOptionValue }\r
384#\r
385class PlatformBuildClassObject(object):\r
386 def __init__(self):\r
387 self.MetaFile = ''\r
388 self.PlatformName = ''\r
389 self.Guid = ''\r
390 self.Version = ''\r
391 self.DscSpecification = ''\r
392 self.OutputDirectory = ''\r
393 self.FlashDefinition = ''\r
394 self.BuildNumber = ''\r
395 self.MakefileName = ''\r
396\r
397 self.SkuIds = {}\r
398 self.Modules = []\r
399 self.LibraryInstances = []\r
400 self.LibraryClasses = {}\r
401 self.Libraries = {}\r
402 self.Pcds = {}\r
403 self.BuildOptions = {}\r
404\r
405 ## Convert the class to a string\r
406 #\r
407 # Convert member MetaFile of the class to a string\r
408 #\r
409 # @retval string Formatted String\r
410 #\r
411 def __str__(self):\r
412 return str(self.MetaFile)\r
413\r
414 ## Override __eq__ function\r
415 #\r
416 # Check whether PlatformBuildClassObjects are the same\r
417 #\r
418 # @retval False The two PlatformBuildClassObjects are different\r
419 # @retval True The two PlatformBuildClassObjects are the same\r
420 #\r
421 def __eq__(self, Other):\r
422 return self.MetaFile == Other\r
423\r
424 ## Override __hash__ function\r
425 #\r
426 # Use MetaFile as key in hash table\r
427 #\r
428 # @retval string Key for hash table\r
429 #\r
430 def __hash__(self):\r
431 return hash(self.MetaFile)\r
432\r