BaseTools: Workspace - refactor a dict
[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
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 15\r
6e6d767e 16from collections import OrderedDict\r
30fdf114
LG
17from Common.Misc import RealPath2\r
18from Common.BuildToolError import *\r
8518bf0b 19from Common.DataType import *\r
ae7b6df8 20import collections\r
30fdf114
LG
21\r
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
cc71d8b7 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):\r
30fdf114
LG
50 self.TokenCName = Name\r
51 self.TokenSpaceGuidCName = Guid\r
52 self.TokenSpaceGuidValue = GuidValue\r
53 self.Type = Type\r
54 self.DatumType = DatumType\r
55 self.DefaultValue = Value\r
56 self.TokenValue = Token\r
57 self.MaxDatumSize = MaxDatumSize\r
c33081c9 58 self.MaxSizeUserSet = None\r
30fdf114
LG
59 self.SkuInfoList = SkuInfoList\r
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
82a6a960
BF
65 self.validateranges = validateranges\r
66 self.validlists = validlists\r
67 self.expressions = expressions\r
cc71d8b7 68 self.DscDefaultValue = None\r
f3b31433 69 self.DscRawValue = None\r
cc71d8b7
YZ
70 if IsDsc:\r
71 self.DscDefaultValue = Value\r
0f228f19 72 self.PcdValueFromComm = ""\r
065a7d40 73 self.DefinitionPosition = ("","")\r
9904222d 74\r
30fdf114
LG
75 ## Convert the class to a string\r
76 #\r
77 # Convert each member of the class to string\r
78 # Organize to a signle line format string\r
79 #\r
80 # @retval Rtn Formatted String\r
81 #\r
82 def __str__(self):\r
83 Rtn = '\tTokenCName=' + str(self.TokenCName) + ', ' + \\r
84 'TokenSpaceGuidCName=' + str(self.TokenSpaceGuidCName) + ', ' + \\r
85 'Type=' + str(self.Type) + ', ' + \\r
86 'DatumType=' + str(self.DatumType) + ', ' + \\r
87 'DefaultValue=' + str(self.DefaultValue) + ', ' + \\r
88 'TokenValue=' + str(self.TokenValue) + ', ' + \\r
89 'MaxDatumSize=' + str(self.MaxDatumSize) + ', '\r
90 for Item in self.SkuInfoList.values():\r
91 Rtn = Rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName\r
e56468c0 92 Rtn = Rtn + ', IsOverrided=' + str(self.IsOverrided)\r
30fdf114
LG
93\r
94 return Rtn\r
95\r
96 ## Override __eq__ function\r
97 #\r
98 # Check whether pcds are the same\r
99 #\r
100 # @retval False The two pcds are different\r
101 # @retval True The two pcds are the same\r
102 #\r
103 def __eq__(self, Other):\r
104 return Other and self.TokenCName == Other.TokenCName and self.TokenSpaceGuidCName == Other.TokenSpaceGuidCName\r
105\r
106 ## Override __hash__ function\r
107 #\r
108 # Use (TokenCName, TokenSpaceGuidCName) as key in hash table\r
109 #\r
110 # @retval truple() Key for hash table\r
111 #\r
112 def __hash__(self):\r
113 return hash((self.TokenCName, self.TokenSpaceGuidCName))\r
114\r
ae7b6df8 115class StructurePcd(PcdClassObject):\r
9904222d 116 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
117 if SkuInfoList is None:\r
118 SkuInfoList = {}\r
119 if validateranges is None:\r
120 validateranges = []\r
121 if validlists is None:\r
122 validlists = []\r
123 if expressions is None:\r
124 expressions = []\r
125 if Packages is None:\r
126 Packages = []\r
ae7b6df8 127 super(StructurePcd, self).__init__(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided, GuidValue, validateranges, validlists, expressions)\r
81add864 128 self.StructuredPcdIncludeFile = [] if StructuredPcdIncludeFile is None else StructuredPcdIncludeFile\r
ae7b6df8 129 self.PackageDecs = Packages\r
8518bf0b 130 self.DefaultStoreName = [default_store]\r
817e3669 131 self.DefaultValues = collections.OrderedDict()\r
ae7b6df8 132 self.PcdMode = None\r
817e3669 133 self.SkuOverrideValues = collections.OrderedDict()\r
ae7b6df8 134 self.FlexibleFieldName = None\r
e651d06c 135 self.StructName = None\r
6a103440
FB
136 self.PcdDefineLineNo = 0\r
137 self.PkgPath = ""\r
06140766 138 self.DefaultValueFromDec = ""\r
88252a90 139 self.ValueChain = set()\r
817e3669 140 self.PcdFieldValueFromComm = collections.OrderedDict()\r
ae7b6df8
LG
141 def __repr__(self):\r
142 return self.TypeName\r
143\r
144 def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0):\r
34952f49
LG
145 if FieldName in self.DefaultValues:\r
146 del self.DefaultValues[FieldName]\r
ae7b6df8
LG
147 self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo]\r
148 return self.DefaultValues[FieldName]\r
149\r
06140766
FB
150 def SetDecDefaultValue(self,DefaultValue):\r
151 self.DefaultValueFromDec = DefaultValue\r
8518bf0b 152 def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0):\r
ae7b6df8 153 if SkuName not in self.SkuOverrideValues:\r
817e3669 154 self.SkuOverrideValues[SkuName] = collections.OrderedDict()\r
8518bf0b 155 if DefaultStoreName not in self.SkuOverrideValues[SkuName]:\r
817e3669 156 self.SkuOverrideValues[SkuName][DefaultStoreName] = collections.OrderedDict()\r
8518bf0b
LG
157 if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]:\r
158 del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]\r
159 self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = [Value.strip(), FileName, LineNo]\r
160 return self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName]\r
ae7b6df8
LG
161\r
162 def SetPcdMode (self, PcdMode):\r
163 self.PcdMode = PcdMode\r
164\r
165 def SetFlexibleFieldName (self, FlexibleFieldName):\r
166 self.FlexibleFieldName = FlexibleFieldName\r
167\r
168 def copy(self, PcdObject):\r
169 self.TokenCName = PcdObject.TokenCName if PcdObject.TokenCName else self.TokenCName\r
170 self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName\r
171 self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue\r
172 self.Type = PcdObject.Type if PcdObject.Type else self.Type\r
173 self.DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType\r
174 self.DefaultValue = PcdObject.DefaultValue if PcdObject.DefaultValue else self.DefaultValue\r
175 self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue\r
176 self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize\r
177 self.SkuInfoList = PcdObject.SkuInfoList if PcdObject.SkuInfoList else self.SkuInfoList\r
178 self.Phase = PcdObject.Phase if PcdObject.Phase else self.Phase\r
179 self.Pending = PcdObject.Pending if PcdObject.Pending else self.Pending\r
180 self.IsOverrided = PcdObject.IsOverrided if PcdObject.IsOverrided else self.IsOverrided\r
181 self.IsFromBinaryInf = PcdObject.IsFromBinaryInf if PcdObject.IsFromBinaryInf else self.IsFromBinaryInf\r
182 self.IsFromDsc = PcdObject.IsFromDsc if PcdObject.IsFromDsc else self.IsFromDsc\r
183 self.validateranges = PcdObject.validateranges if PcdObject.validateranges else self.validateranges\r
184 self.validlists = PcdObject.validlists if PcdObject.validlists else self.validlists\r
185 self.expressions = PcdObject.expressions if PcdObject.expressions else self.expressions\r
f3b31433 186 self.DscRawValue = PcdObject.DscRawValue if PcdObject.DscRawValue else self.DscRawValue\r
0f228f19 187 self.PcdValueFromComm = PcdObject.PcdValueFromComm if PcdObject.PcdValueFromComm else self.PcdValueFromComm\r
065a7d40 188 self.DefinitionPosition = PcdObject.DefinitionPosition if PcdObject.DefinitionPosition else self.DefinitionPosition\r
ae7b6df8
LG
189 if type(PcdObject) is StructurePcd:\r
190 self.StructuredPcdIncludeFile = PcdObject.StructuredPcdIncludeFile if PcdObject.StructuredPcdIncludeFile else self.StructuredPcdIncludeFile\r
191 self.PackageDecs = PcdObject.PackageDecs if PcdObject.PackageDecs else self.PackageDecs\r
192 self.DefaultValues = PcdObject.DefaultValues if PcdObject.DefaultValues else self.DefaultValues\r
193 self.PcdMode = PcdObject.PcdMode if PcdObject.PcdMode else self.PcdMode\r
194 self.DefaultFromDSC=None\r
06140766 195 self.DefaultValueFromDec = PcdObject.DefaultValueFromDec if PcdObject.DefaultValueFromDec else self.DefaultValueFromDec\r
65eff519 196 self.SkuOverrideValues = PcdObject.SkuOverrideValues if PcdObject.SkuOverrideValues else self.SkuOverrideValues\r
ae7b6df8 197 self.FlexibleFieldName = PcdObject.FlexibleFieldName if PcdObject.FlexibleFieldName else self.FlexibleFieldName\r
e651d06c 198 self.StructName = PcdObject.DatumType if PcdObject.DatumType else self.StructName\r
6a103440
FB
199 self.PcdDefineLineNo = PcdObject.PcdDefineLineNo if PcdObject.PcdDefineLineNo else self.PcdDefineLineNo\r
200 self.PkgPath = PcdObject.PkgPath if PcdObject.PkgPath else self.PkgPath\r
f3b31433 201 self.ValueChain = PcdObject.ValueChain if PcdObject.ValueChain else self.ValueChain\r
b854e2bf 202 self.PcdFieldValueFromComm = PcdObject.PcdFieldValueFromComm if PcdObject.PcdFieldValueFromComm else self.PcdFieldValueFromComm\r
ae7b6df8 203\r
30fdf114
LG
204## LibraryClassObject\r
205#\r
206# This Class defines LibraryClassObject used in BuildDatabase\r
207#\r
208# @param object: Inherited from object class\r
209# @param Name: Input value for LibraryClassName, default is None\r
210# @param SupModList: Input value for SupModList, default is []\r
211# @param Type: Input value for Type, default is None\r
212#\r
213# @var LibraryClass: To store value for LibraryClass\r
214# @var SupModList: To store value for SupModList\r
215# @var Type: To store value for Type\r
216#\r
217class LibraryClassObject(object):\r
218 def __init__(self, Name = None, SupModList = [], Type = None):\r
219 self.LibraryClass = Name\r
220 self.SupModList = SupModList\r
4231a819 221 if Type is not None:\r
30fdf114
LG
222 self.SupModList = CleanString(Type).split(DataType.TAB_SPACE_SPLIT)\r
223\r
224## ModuleBuildClassObject\r
225#\r
226# This Class defines ModuleBuildClass\r
227#\r
228# @param object: Inherited from object class\r
229#\r
230# @var MetaFile: To store value for module meta file path\r
231# @var BaseName: To store value for BaseName\r
232# @var ModuleType: To store value for ModuleType\r
233# @var Guid: To store value for Guid\r
234# @var Version: To store value for Version\r
235# @var PcdIsDriver: To store value for PcdIsDriver\r
236# @var BinaryModule: To store value for BinaryModule\r
237# @var CustomMakefile: To store value for CustomMakefile\r
238# @var Specification: To store value for Specification\r
239# @var Shadow To store value for Shadow\r
240# @var LibraryClass: To store value for LibraryClass, it is a list structure as\r
241# [ LibraryClassObject, ...]\r
242# @var ModuleEntryPointList: To store value for ModuleEntryPointList\r
243# @var ModuleUnloadImageList: To store value for ModuleUnloadImageList\r
244# @var ConstructorList: To store value for ConstructorList\r
245# @var DestructorList: To store value for DestructorList\r
246# @var Binaries: To store value for Binaries, it is a list structure as\r
247# [ ModuleBinaryClassObject, ...]\r
248# @var Sources: To store value for Sources, it is a list structure as\r
249# [ ModuleSourceFilesClassObject, ... ]\r
250# @var LibraryClasses: To store value for LibraryClasses, it is a set structure as\r
251# { [LibraryClassName, ModuleType] : LibraryClassInfFile }\r
252# @var Protocols: To store value for Protocols, it is a list structure as\r
253# [ ProtocolName, ... ]\r
254# @var Ppis: To store value for Ppis, it is a list structure as\r
255# [ PpiName, ... ]\r
256# @var Guids: To store value for Guids, it is a list structure as\r
257# [ GuidName, ... ]\r
258# @var Includes: To store value for Includes, it is a list structure as\r
259# [ IncludePath, ... ]\r
260# @var Packages: To store value for Packages, it is a list structure as\r
261# [ DecFileName, ... ]\r
262# @var Pcds: To store value for Pcds, it is a set structure as\r
263# { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
264# @var BuildOptions: To store value for BuildOptions, it is a set structure as\r
265# { [BuildOptionKey] : BuildOptionValue}\r
266# @var Depex: To store value for Depex\r
267#\r
268class ModuleBuildClassObject(object):\r
269 def __init__(self):\r
270 self.AutoGenVersion = 0\r
271 self.MetaFile = ''\r
272 self.BaseName = ''\r
273 self.ModuleType = ''\r
274 self.Guid = ''\r
275 self.Version = ''\r
276 self.PcdIsDriver = ''\r
277 self.BinaryModule = ''\r
278 self.Shadow = ''\r
279 self.SourceOverridePath = ''\r
280 self.CustomMakefile = {}\r
281 self.Specification = {}\r
282 self.LibraryClass = []\r
283 self.ModuleEntryPointList = []\r
284 self.ModuleUnloadImageList = []\r
285 self.ConstructorList = []\r
286 self.DestructorList = []\r
287\r
288 self.Binaries = []\r
289 self.Sources = []\r
6e6d767e 290 self.LibraryClasses = OrderedDict()\r
30fdf114
LG
291 self.Libraries = []\r
292 self.Protocols = []\r
293 self.Ppis = []\r
294 self.Guids = []\r
295 self.Includes = []\r
296 self.Packages = []\r
297 self.Pcds = {}\r
298 self.BuildOptions = {}\r
299 self.Depex = {}\r
300\r
301 ## Convert the class to a string\r
302 #\r
303 # Convert member MetaFile of the class to a string\r
304 #\r
305 # @retval string Formatted String\r
306 #\r
307 def __str__(self):\r
308 return str(self.MetaFile)\r
309\r
310 ## Override __eq__ function\r
311 #\r
312 # Check whether ModuleBuildClassObjects are the same\r
313 #\r
314 # @retval False The two ModuleBuildClassObjects are different\r
315 # @retval True The two ModuleBuildClassObjects are the same\r
316 #\r
317 def __eq__(self, Other):\r
318 return self.MetaFile == Other\r
319\r
320 ## Override __hash__ function\r
321 #\r
322 # Use MetaFile as key in hash table\r
323 #\r
324 # @retval string Key for hash table\r
325 #\r
326 def __hash__(self):\r
327 return hash(self.MetaFile)\r
328\r
329## PackageBuildClassObject\r
330#\r
331# This Class defines PackageBuildClass\r
332#\r
333# @param object: Inherited from object class\r
334#\r
335# @var MetaFile: To store value for package meta file path\r
336# @var PackageName: To store value for PackageName\r
337# @var Guid: To store value for Guid\r
338# @var Version: To store value for Version\r
339# @var Protocols: To store value for Protocols, it is a set structure as\r
340# { [ProtocolName] : Protocol Guid, ... }\r
341# @var Ppis: To store value for Ppis, it is a set structure as\r
342# { [PpiName] : Ppi Guid, ... }\r
343# @var Guids: To store value for Guids, it is a set structure as\r
344# { [GuidName] : Guid, ... }\r
345# @var Includes: To store value for Includes, it is a list structure as\r
346# [ IncludePath, ... ]\r
347# @var LibraryClasses: To store value for LibraryClasses, it is a set structure as\r
348# { [LibraryClassName] : LibraryClassInfFile }\r
349# @var Pcds: To store value for Pcds, it is a set structure as\r
350# { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
351#\r
352class PackageBuildClassObject(object):\r
353 def __init__(self):\r
354 self.MetaFile = ''\r
355 self.PackageName = ''\r
356 self.Guid = ''\r
357 self.Version = ''\r
358\r
359 self.Protocols = {}\r
360 self.Ppis = {}\r
361 self.Guids = {}\r
362 self.Includes = []\r
363 self.LibraryClasses = {}\r
364 self.Pcds = {}\r
365\r
366 ## Convert the class to a string\r
367 #\r
368 # Convert member MetaFile of the class to a string\r
369 #\r
370 # @retval string Formatted String\r
371 #\r
372 def __str__(self):\r
373 return str(self.MetaFile)\r
374\r
375 ## Override __eq__ function\r
376 #\r
377 # Check whether PackageBuildClassObjects are the same\r
378 #\r
379 # @retval False The two PackageBuildClassObjects are different\r
380 # @retval True The two PackageBuildClassObjects are the same\r
381 #\r
382 def __eq__(self, Other):\r
383 return self.MetaFile == Other\r
384\r
385 ## Override __hash__ function\r
386 #\r
387 # Use MetaFile as key in hash table\r
388 #\r
389 # @retval string Key for hash table\r
390 #\r
391 def __hash__(self):\r
392 return hash(self.MetaFile)\r
393\r
394## PlatformBuildClassObject\r
395#\r
396# This Class defines PlatformBuildClass\r
397#\r
398# @param object: Inherited from object class\r
399#\r
400# @var MetaFile: To store value for platform meta-file path\r
401# @var PlatformName: To store value for PlatformName\r
402# @var Guid: To store value for Guid\r
403# @var Version: To store value for Version\r
404# @var DscSpecification: To store value for DscSpecification\r
405# @var OutputDirectory: To store value for OutputDirectory\r
406# @var FlashDefinition: To store value for FlashDefinition\r
407# @var BuildNumber: To store value for BuildNumber\r
408# @var MakefileName: To store value for MakefileName\r
409# @var SkuIds: To store value for SkuIds, it is a set structure as\r
410# { 'SkuName' : SkuId, '!include' : includefilename, ...}\r
411# @var Modules: To store value for Modules, it is a list structure as\r
412# [ InfFileName, ... ]\r
413# @var Libraries: To store value for Libraries, it is a list structure as\r
414# [ InfFileName, ... ]\r
415# @var LibraryClasses: To store value for LibraryClasses, it is a set structure as\r
416# { (LibraryClassName, ModuleType) : LibraryClassInfFile }\r
417# @var Pcds: To store value for Pcds, it is a set structure as\r
418# { [(PcdCName, PcdGuidCName)] : PcdClassObject }\r
419# @var BuildOptions: To store value for BuildOptions, it is a set structure as\r
420# { [BuildOptionKey] : BuildOptionValue }\r
421#\r
422class PlatformBuildClassObject(object):\r
423 def __init__(self):\r
424 self.MetaFile = ''\r
425 self.PlatformName = ''\r
426 self.Guid = ''\r
427 self.Version = ''\r
428 self.DscSpecification = ''\r
429 self.OutputDirectory = ''\r
430 self.FlashDefinition = ''\r
431 self.BuildNumber = ''\r
432 self.MakefileName = ''\r
433\r
434 self.SkuIds = {}\r
435 self.Modules = []\r
436 self.LibraryInstances = []\r
437 self.LibraryClasses = {}\r
438 self.Libraries = {}\r
439 self.Pcds = {}\r
440 self.BuildOptions = {}\r
441\r
442 ## Convert the class to a string\r
443 #\r
444 # Convert member MetaFile of the class to a string\r
445 #\r
446 # @retval string Formatted String\r
447 #\r
448 def __str__(self):\r
449 return str(self.MetaFile)\r
450\r
451 ## Override __eq__ function\r
452 #\r
453 # Check whether PlatformBuildClassObjects are the same\r
454 #\r
455 # @retval False The two PlatformBuildClassObjects are different\r
456 # @retval True The two PlatformBuildClassObjects are the same\r
457 #\r
458 def __eq__(self, Other):\r
459 return self.MetaFile == Other\r
460\r
461 ## Override __hash__ function\r
462 #\r
463 # Use MetaFile as key in hash table\r
464 #\r
465 # @retval string Key for hash table\r
466 #\r
467 def __hash__(self):\r
468 return hash(self.MetaFile)\r