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