]>
Commit | Line | Data |
---|---|---|
4234283c LG |
1 | ## @file DecPomAlignment.py\r |
2 | # This file contained the adapter for convert INF parser object to POM Object\r | |
3 | #\r | |
645a5128 | 4 | # Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>\r |
4234283c LG |
5 | #\r |
6 | # This program and the accompanying materials are licensed and made available \r | |
7 | # under the terms and conditions of the BSD License which accompanies this \r | |
8 | # distribution. The full text of the license may be found at \r | |
9 | # http://opensource.org/licenses/bsd-license.php\r | |
10 | #\r | |
11 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
12 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
13 | #\r | |
14 | \r | |
15 | '''\r | |
16 | DecPomAlignment\r | |
17 | '''\r | |
72443dd2 | 18 | from __future__ import print_function\r |
4234283c LG |
19 | \r |
20 | ##\r | |
21 | # Import Modules\r | |
22 | #\r | |
23 | import os.path\r | |
24 | from os import sep\r | |
25 | import platform\r | |
26 | \r | |
421ccda3 | 27 | import re\r |
4234283c LG |
28 | import Logger.Log as Logger\r |
29 | from Logger import StringTable as ST\r | |
30 | from Logger.ToolError import UPT_MUL_DEC_ERROR\r | |
421ccda3 | 31 | from Logger.ToolError import FORMAT_INVALID\r |
4234283c LG |
32 | \r |
33 | from Library.Parsing import NormPath\r | |
34 | from Library.DataType import ARCH_LIST\r | |
35 | from Library.DataType import TAB_GUIDS\r | |
36 | from Library.DataType import TAB_PROTOCOLS\r | |
37 | from Library.DataType import TAB_PPIS\r | |
38 | from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME\r | |
39 | from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r | |
40 | from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r | |
41 | from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r | |
421ccda3 | 42 | from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r |
4234283c | 43 | from Library.DataType import TAB_ARCH_COMMON\r |
4234283c | 44 | from Library.DataType import TAB_INCLUDES\r |
4234283c LG |
45 | from Library.DataType import TAB_LIBRARY_CLASSES\r |
46 | from Library.DataType import TAB_PCDS\r | |
47 | from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL\r | |
48 | from Library.DataType import TAB_PCDS_PATCHABLE_IN_MODULE_NULL\r | |
49 | from Library.DataType import TAB_PCDS_FEATURE_FLAG_NULL\r | |
50 | from Library.DataType import TAB_PCDS_DYNAMIC_EX_NULL\r | |
51 | from Library.DataType import TAB_PCDS_DYNAMIC_NULL\r | |
52 | from Library.DataType import TAB_PTR_TYPE_PCD\r | |
53 | from Library.DataType import ITEM_UNDEFINED\r | |
421ccda3 HC |
54 | from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r |
55 | from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r | |
56 | from Library.DataType import TAB_LANGUAGE_EN_US\r | |
57 | from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r | |
58 | from Library.DataType import TAB_BINARY_HEADER_USERID\r | |
59 | from Library.DataType import TAB_LANGUAGE_EN_X\r | |
60 | from Library.DataType import TAB_LANGUAGE_EN\r | |
61 | from Library.DataType import TAB_STR_TOKENCNAME\r | |
62 | from Library.DataType import TAB_STR_TOKENPROMPT\r | |
63 | from Library.DataType import TAB_STR_TOKENHELP\r | |
64 | from Library.DataType import TAB_STR_TOKENERR\r | |
65 | from Library.DataType import TAB_HEX_START\r | |
66 | from Library.DataType import TAB_SPLIT\r | |
645a5128 | 67 | import Library.DataType as DT\r |
421ccda3 HC |
68 | from Library.CommentParsing import ParseHeaderCommentSection\r |
69 | from Library.CommentParsing import ParseGenericComment\r | |
4234283c LG |
70 | from Library.CommentParsing import ParseDecPcdGenericComment\r |
71 | from Library.CommentParsing import ParseDecPcdTailComment\r | |
72 | from Library.Misc import GetFiles\r | |
73 | from Library.Misc import Sdict\r | |
421ccda3 HC |
74 | from Library.Misc import GetRelativePath\r |
75 | from Library.Misc import PathClass\r | |
76 | from Library.Misc import ValidateUNIFilePath\r | |
77 | from Library.UniClassObject import UniFileClassObject\r | |
78 | from Library.UniClassObject import ConvertSpecialUnicodes\r | |
79 | from Library.UniClassObject import GetLanguageCode1766\r | |
80 | from Library.ParserValidate import IsValidPath\r | |
4234283c | 81 | from Parser.DecParser import Dec\r |
4234283c LG |
82 | from Object.POM.PackageObject import PackageObject\r |
83 | from Object.POM.CommonObject import UserExtensionObject\r | |
84 | from Object.POM.CommonObject import IncludeObject\r | |
85 | from Object.POM.CommonObject import GuidObject\r | |
86 | from Object.POM.CommonObject import ProtocolObject\r | |
87 | from Object.POM.CommonObject import PpiObject\r | |
88 | from Object.POM.CommonObject import LibraryClassObject\r | |
89 | from Object.POM.CommonObject import PcdObject\r | |
90 | from Object.POM.CommonObject import TextObject\r | |
421ccda3 HC |
91 | from Object.POM.CommonObject import MiscFileObject\r |
92 | from Object.POM.CommonObject import FileObject\r | |
4234283c LG |
93 | \r |
94 | \r | |
95 | ## DecPomAlignment\r | |
96 | #\r | |
97 | # Inherited from PackageObject\r | |
98 | #\r | |
99 | class DecPomAlignment(PackageObject):\r | |
100 | def __init__(self, Filename, WorkspaceDir = None, CheckMulDec = False):\r | |
101 | PackageObject.__init__(self)\r | |
102 | self.UserExtensions = ''\r | |
103 | self.WorkspaceDir = WorkspaceDir\r | |
104 | self.SupArchList = ARCH_LIST\r | |
105 | self.CheckMulDec = CheckMulDec\r | |
106 | self.DecParser = None\r | |
421ccda3 HC |
107 | self.UniFileClassObject = None\r |
108 | self.PcdDefaultValueDict = {}\r | |
4234283c LG |
109 | \r |
110 | #\r | |
111 | # Load Dec file\r | |
112 | #\r | |
113 | self.LoadDecFile(Filename)\r | |
114 | \r | |
115 | #\r | |
116 | # Transfer to Package Object if IsToPackage is True\r | |
117 | #\r | |
118 | self.DecToPackage()\r | |
119 | \r | |
120 | ## Load Dec file\r | |
121 | #\r | |
122 | # Load the file if it exists\r | |
123 | #\r | |
124 | # @param Filename: Input value for filename of Dec file\r | |
125 | #\r | |
126 | def LoadDecFile(self, Filename):\r | |
127 | #\r | |
128 | # Insert a record for file\r | |
129 | #\r | |
130 | Filename = NormPath(Filename)\r | |
131 | (Path, Name) = os.path.split(Filename)\r | |
132 | self.SetFullPath(Filename)\r | |
133 | self.SetRelaPath(Path)\r | |
134 | self.SetFileName(Name)\r | |
421ccda3 HC |
135 | self.SetPackagePath(GetRelativePath(Path, self.WorkspaceDir)) \r |
136 | self.SetCombinePath(GetRelativePath(Filename, self.WorkspaceDir))\r | |
4234283c LG |
137 | \r |
138 | self.DecParser = Dec(Filename)\r | |
139 | \r | |
140 | ## Transfer to Package Object\r | |
141 | # \r | |
142 | # Transfer all contents of a Dec file to a standard Package Object\r | |
143 | #\r | |
144 | def DecToPackage(self):\r | |
145 | #\r | |
146 | # Init global information for the file\r | |
147 | #\r | |
148 | ContainerFile = self.GetFullPath()\r | |
149 | \r | |
150 | #\r | |
151 | # Generate Package Header\r | |
152 | #\r | |
153 | self.GenPackageHeader(ContainerFile)\r | |
154 | \r | |
155 | #\r | |
156 | # Generate Includes\r | |
157 | #\r | |
158 | self.GenIncludes(ContainerFile)\r | |
159 | \r | |
160 | #\r | |
161 | # Generate Guids\r | |
162 | #\r | |
163 | self.GenGuidProtocolPpis(TAB_GUIDS, ContainerFile)\r | |
164 | \r | |
165 | #\r | |
166 | # Generate Protocols\r | |
167 | #\r | |
168 | self.GenGuidProtocolPpis(TAB_PROTOCOLS, ContainerFile)\r | |
169 | \r | |
170 | #\r | |
171 | # Generate Ppis\r | |
172 | #\r | |
173 | self.GenGuidProtocolPpis(TAB_PPIS, ContainerFile)\r | |
174 | \r | |
175 | #\r | |
176 | # Generate LibraryClasses\r | |
177 | #\r | |
178 | self.GenLibraryClasses(ContainerFile)\r | |
179 | \r | |
180 | #\r | |
181 | # Generate Pcds\r | |
182 | #\r | |
183 | self.GenPcds(ContainerFile)\r | |
184 | \r | |
185 | #\r | |
186 | # Generate Module File list, will be used later on to generate \r | |
187 | # distribution\r | |
188 | #\r | |
189 | self.GenModuleFileList(ContainerFile)\r | |
190 | \r | |
191 | #\r | |
192 | # Generate user extensions\r | |
193 | #\r | |
194 | self.GenUserExtensions()\r | |
421ccda3 HC |
195 | \r |
196 | ## Generate user extension\r | |
4234283c LG |
197 | #\r |
198 | #\r | |
199 | def GenUserExtensions(self):\r | |
200 | UEObj = self.DecParser.GetUserExtensionSectionObject()\r | |
201 | UEList = UEObj.GetAllUserExtensions()\r | |
202 | for Item in UEList:\r | |
203 | if not Item.UserString:\r | |
204 | continue\r | |
205 | UserExtension = UserExtensionObject()\r | |
206 | UserId = Item.UserId\r | |
207 | if UserId.startswith('"') and UserId.endswith('"'):\r | |
208 | UserId = UserId[1:-1]\r | |
209 | UserExtension.SetUserID(UserId)\r | |
210 | Identifier = Item.IdString\r | |
211 | if Identifier.startswith('"') and Identifier.endswith('"'):\r | |
212 | Identifier = Identifier[1:-1]\r | |
421ccda3 HC |
213 | #\r |
214 | # Generate miscellaneous files of DEC file\r | |
215 | #\r | |
216 | if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r | |
217 | self.GenMiscFiles(Item.UserString)\r | |
4234283c LG |
218 | UserExtension.SetIdentifier(Identifier)\r |
219 | UserExtension.SetStatement(Item.UserString)\r | |
220 | UserExtension.SetSupArchList(\r | |
221 | Item.ArchAndModuleType\r | |
222 | )\r | |
223 | self.SetUserExtensionList(\r | |
224 | self.GetUserExtensionList() + [UserExtension]\r | |
225 | )\r | |
645a5128 HC |
226 | \r |
227 | # Add Private sections to UserExtension\r | |
228 | if self.DecParser.GetPrivateSections():\r | |
229 | PrivateUserExtension = UserExtensionObject()\r | |
230 | PrivateUserExtension.SetStatement(self.DecParser.GetPrivateSections())\r | |
231 | PrivateUserExtension.SetIdentifier(DT.TAB_PRIVATE)\r | |
232 | PrivateUserExtension.SetUserID(DT.TAB_INTEL)\r | |
233 | self.SetUserExtensionList(self.GetUserExtensionList() + [PrivateUserExtension])\r | |
421ccda3 HC |
234 | \r |
235 | ## Generate miscellaneous files on DEC file\r | |
236 | #\r | |
237 | #\r | |
238 | def GenMiscFiles(self, Content):\r | |
239 | MiscFileObj = MiscFileObject()\r | |
240 | for Line in Content.splitlines():\r | |
241 | FileName = ''\r | |
242 | if '#' in Line:\r | |
243 | FileName = Line[:Line.find('#')]\r | |
244 | else:\r | |
245 | FileName = Line\r | |
246 | if FileName:\r | |
247 | if IsValidPath(FileName, self.GetRelaPath()):\r | |
248 | FileObj = FileObject()\r | |
249 | FileObj.SetURI(FileName)\r | |
250 | MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r | |
251 | else:\r | |
252 | Logger.Error("InfParser", \r | |
253 | FORMAT_INVALID,\r | |
254 | ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r | |
255 | File=self.GetFileName(),\r | |
256 | ExtraData=Line) \r | |
257 | self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r | |
258 | \r | |
4234283c LG |
259 | ## Generate Package Header\r |
260 | #\r | |
261 | # Gen Package Header of Dec as <Key> = <Value>\r | |
262 | #\r | |
263 | # @param ContainerFile: The Dec file full path \r | |
264 | #\r | |
265 | def GenPackageHeader(self, ContainerFile):\r | |
266 | Logger.Debug(2, "Generate PackageHeader ...")\r | |
267 | DefinesDict = {}\r | |
268 | \r | |
269 | #\r | |
270 | # Update all defines item in database\r | |
271 | #\r | |
272 | DefObj = self.DecParser.GetDefineSectionObject()\r | |
273 | for Item in DefObj.GetDefines():\r | |
274 | #\r | |
275 | # put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION\r | |
276 | #\r | |
277 | SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \\r | |
421ccda3 HC |
278 | TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, \\r |
279 | TAB_DEC_DEFINES_DEC_SPECIFICATION, TAB_DEC_DEFINES_PKG_UNI_FILE]\r | |
4234283c LG |
280 | if Item.Key in SkipItemList:\r |
281 | continue\r | |
282 | DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON\r | |
283 | \r | |
284 | self.SetBaseName(DefObj.GetPackageName())\r | |
285 | self.SetVersion(DefObj.GetPackageVersion())\r | |
286 | # self.SetName(DefObj.GetPackageName() + ' Version ' + \\r | |
287 | # DefObj.GetPackageVersion())\r | |
288 | self.SetName(os.path.splitext(self.GetFileName())[0])\r | |
289 | self.SetGuid(DefObj.GetPackageGuid())\r | |
421ccda3 HC |
290 | if DefObj.GetPackageUniFile():\r |
291 | ValidateUNIFilePath(DefObj.GetPackageUniFile())\r | |
292 | self.UniFileClassObject = \\r | |
293 | UniFileClassObject([PathClass(os.path.join(DefObj.GetPackagePath(), DefObj.GetPackageUniFile()))])\r | |
294 | else:\r | |
295 | self.UniFileClassObject = None\r | |
4234283c LG |
296 | \r |
297 | if DefinesDict:\r | |
298 | UserExtension = UserExtensionObject()\r | |
299 | UserExtension.SetDefinesDict(DefinesDict)\r | |
300 | UserExtension.SetIdentifier('DefineModifiers')\r | |
301 | UserExtension.SetUserID('EDK2') \r | |
302 | self.SetUserExtensionList(\r | |
303 | self.GetUserExtensionList() + [UserExtension]\r | |
304 | )\r | |
305 | \r | |
306 | #\r | |
421ccda3 | 307 | # Get File header information\r |
4234283c | 308 | #\r |
421ccda3 HC |
309 | if self.UniFileClassObject:\r |
310 | Lang = TAB_LANGUAGE_EN_X\r | |
311 | else:\r | |
312 | Lang = TAB_LANGUAGE_EN_US\r | |
4234283c LG |
313 | Abstract, Description, Copyright, License = \\r |
314 | ParseHeaderCommentSection(self.DecParser.GetHeadComment(),\r | |
315 | ContainerFile)\r | |
421ccda3 HC |
316 | if Abstract:\r |
317 | self.SetAbstract((Lang, Abstract))\r | |
318 | if Description:\r | |
319 | self.SetDescription((Lang, Description))\r | |
320 | if Copyright:\r | |
321 | self.SetCopyright(('', Copyright))\r | |
322 | if License:\r | |
323 | self.SetLicense(('', License))\r | |
4234283c | 324 | \r |
421ccda3 HC |
325 | #\r |
326 | # Get Binary header information\r | |
327 | #\r | |
328 | if self.DecParser.BinaryHeadComment:\r | |
329 | Abstract, Description, Copyright, License = \\r | |
330 | ParseHeaderCommentSection(self.DecParser.BinaryHeadComment,\r | |
331 | ContainerFile, True)\r | |
332 | \r | |
333 | if not Abstract or not Description or not Copyright or not License:\r | |
334 | Logger.Error('MkPkg',\r | |
335 | FORMAT_INVALID,\r | |
336 | ST.ERR_INVALID_BINARYHEADER_FORMAT,\r | |
337 | ContainerFile)\r | |
338 | else:\r | |
339 | self.SetBinaryHeaderAbstract((Lang, Abstract))\r | |
340 | self.SetBinaryHeaderDescription((Lang, Description))\r | |
341 | self.SetBinaryHeaderCopyright(('', Copyright))\r | |
342 | self.SetBinaryHeaderLicense(('', License))\r | |
343 | \r | |
344 | BinaryAbstractList = []\r | |
345 | BinaryDescriptionList = []\r | |
346 | \r | |
347 | #Get Binary header from UNI file\r | |
348 | # Initialize the UniStrDict dictionary, top keys are language codes\r | |
349 | UniStrDict = {}\r | |
350 | if self.UniFileClassObject:\r | |
351 | UniStrDict = self.UniFileClassObject.OrderedStringList\r | |
352 | for Lang in UniStrDict:\r | |
353 | for StringDefClassObject in UniStrDict[Lang]:\r | |
354 | Lang = GetLanguageCode1766(Lang)\r | |
355 | if StringDefClassObject.StringName == TAB_DEC_BINARY_ABSTRACT:\r | |
356 | if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r | |
357 | not in self.GetBinaryHeaderAbstract():\r | |
358 | BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r | |
359 | if StringDefClassObject.StringName == TAB_DEC_BINARY_DESCRIPTION:\r | |
360 | if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r | |
361 | not in self.GetBinaryHeaderDescription():\r | |
362 | BinaryDescriptionList.append((Lang, \r | |
363 | ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r | |
364 | #Combine Binary header from DEC file and UNI file\r | |
365 | BinaryAbstractList = self.GetBinaryHeaderAbstract() + BinaryAbstractList\r | |
366 | BinaryDescriptionList = self.GetBinaryHeaderDescription() + BinaryDescriptionList\r | |
367 | BinaryCopyrightList = self.GetBinaryHeaderCopyright()\r | |
368 | BinaryLicenseList = self.GetBinaryHeaderLicense()\r | |
369 | #Generate the UserExtensionObject for TianoCore."BinaryHeader"\r | |
370 | if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r | |
371 | BinaryUserExtension = UserExtensionObject()\r | |
372 | BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r | |
373 | BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r | |
374 | BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r | |
375 | BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r | |
376 | BinaryUserExtension.SetIdentifier(TAB_BINARY_HEADER_IDENTIFIER)\r | |
377 | BinaryUserExtension.SetUserID(TAB_BINARY_HEADER_USERID)\r | |
378 | self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r | |
379 | \r | |
380 | \r | |
4234283c LG |
381 | ## GenIncludes\r |
382 | #\r | |
383 | # Gen Includes of Dec\r | |
384 | # \r | |
385 | # @param ContainerFile: The Dec file full path \r | |
386 | #\r | |
387 | def GenIncludes(self, ContainerFile):\r | |
388 | if ContainerFile:\r | |
389 | pass\r | |
390 | Logger.Debug(2, "Generate %s ..." % TAB_INCLUDES)\r | |
391 | IncludesDict = Sdict()\r | |
392 | \r | |
393 | IncObj = self.DecParser.GetIncludeSectionObject()\r | |
394 | for Item in IncObj.GetAllIncludes():\r | |
395 | IncludePath = os.path.normpath(Item.File)\r | |
421ccda3 | 396 | if platform.system() != 'Windows' and platform.system() != 'Microsoft':\r |
4234283c LG |
397 | IncludePath = IncludePath.replace('\\', '/')\r |
398 | if IncludePath in IncludesDict:\r | |
399 | if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:\r | |
400 | IncludesDict[IncludePath] = [TAB_ARCH_COMMON]\r | |
401 | else:\r | |
402 | IncludesDict[IncludePath] = IncludesDict[IncludePath] + Item.GetArchList()\r | |
403 | else:\r | |
404 | IncludesDict[IncludePath] = Item.GetArchList()\r | |
405 | \r | |
406 | # \r | |
407 | # get the standardIncludeFileList(industry), packageIncludeFileList\r | |
408 | # (others) for PackageObject \r | |
409 | # \r | |
410 | PackagePath = os.path.split(self.GetFullPath())[0]\r | |
411 | IncludePathList = \\r | |
0d1f5b2b | 412 | sorted([os.path.normpath(Path) + sep for Path in IncludesDict.keys()])\r |
4234283c LG |
413 | \r |
414 | #\r | |
415 | # get a non-overlap set of include path, IncludePathList should be \r | |
416 | # sorted, and path should be end with path seperator '\'\r | |
417 | #\r | |
418 | NonOverLapList = []\r | |
419 | for Path1 in IncludePathList:\r | |
420 | for Path2 in NonOverLapList:\r | |
421 | if Path1.startswith(Path2):\r | |
422 | break\r | |
423 | else:\r | |
424 | NonOverLapList.append(Path1)\r | |
425 | #\r | |
426 | # revert the list so the longest path shown first in list, also need\r | |
427 | # to remove the extra path seperator '\'\r | |
428 | # as this list is used to search the supported Arch info\r | |
429 | #\r | |
430 | for IndexN in range (0, len(IncludePathList)):\r | |
431 | IncludePathList[IndexN] = os.path.normpath(IncludePathList[IndexN])\r | |
432 | IncludePathList.sort() \r | |
433 | IncludePathList.reverse()\r | |
434 | #\r | |
435 | # save the include path list for later usage\r | |
436 | #\r | |
437 | self.SetIncludePathList(IncludePathList)\r | |
438 | StandardIncludeFileList = []\r | |
439 | PackageIncludeFileList = []\r | |
440 | \r | |
441 | IncludeFileList = []\r | |
442 | for Path in NonOverLapList:\r | |
443 | FileList = GetFiles(os.path.join(PackagePath, Path), ['CVS', '.svn'], False)\r | |
444 | IncludeFileList += [os.path.normpath(os.path.join(Path, File)) for File in FileList]\r | |
445 | for Includefile in IncludeFileList:\r | |
446 | ExtName = os.path.splitext(Includefile)[1]\r | |
447 | if ExtName.upper() == '.DEC' and self.CheckMulDec:\r | |
448 | Logger.Error('MkPkg', \r | |
449 | UPT_MUL_DEC_ERROR,\r | |
450 | ST.ERR_MUL_DEC_ERROR%(os.path.dirname(ContainerFile), \r | |
451 | os.path.basename(ContainerFile),\r | |
452 | Includefile))\r | |
453 | \r | |
454 | FileCombinePath = os.path.dirname(Includefile)\r | |
455 | Include = IncludeObject()\r | |
456 | for Path in IncludePathList:\r | |
457 | if FileCombinePath.startswith(Path):\r | |
458 | SupArchList = IncludesDict[Path]\r | |
459 | break\r | |
460 | Include.SetFilePath(Includefile)\r | |
461 | Include.SetSupArchList(SupArchList)\r | |
462 | if Includefile.find('IndustryStandard') != -1:\r | |
463 | StandardIncludeFileList.append(Include)\r | |
464 | else:\r | |
465 | PackageIncludeFileList.append(Include) \r | |
466 | \r | |
467 | self.SetStandardIncludeFileList(StandardIncludeFileList)\r | |
468 | \r | |
469 | #\r | |
470 | # put include path into the PackageIncludeFileList\r | |
471 | #\r | |
472 | PackagePathList = []\r | |
473 | IncObj = self.DecParser.GetIncludeSectionObject() \r | |
474 | for Item in IncObj.GetAllIncludes():\r | |
475 | IncludePath = Item.File\r | |
476 | Include = IncludeObject()\r | |
477 | Include.SetFilePath(IncludePath)\r | |
478 | Include.SetSupArchList(Item.GetArchList())\r | |
479 | PackagePathList.append(Include)\r | |
480 | self.SetPackageIncludeFileList(PackagePathList + PackageIncludeFileList)\r | |
481 | \r | |
482 | ## GenPpis\r | |
483 | #\r | |
484 | # Gen Ppis of Dec\r | |
485 | # <CName>=<GuidValue>\r | |
486 | #\r | |
487 | # @param ContainerFile: The Dec file full path \r | |
488 | #\r | |
489 | def GenGuidProtocolPpis(self, Type, ContainerFile):\r | |
490 | if ContainerFile:\r | |
491 | pass\r | |
492 | Logger.Debug(2, "Generate %s ..." % Type)\r | |
493 | \r | |
494 | Obj = None\r | |
495 | Factory = None\r | |
496 | if Type == TAB_GUIDS:\r | |
497 | Obj = self.DecParser.GetGuidSectionObject()\r | |
498 | def CreateGuidObject():\r | |
499 | Object = GuidObject()\r | |
500 | Object.SetGuidTypeList([])\r | |
501 | Object.SetUsage(None)\r | |
502 | Object.SetName(None)\r | |
503 | return Object\r | |
504 | Factory = CreateGuidObject\r | |
505 | elif Type == TAB_PROTOCOLS:\r | |
506 | Obj = self.DecParser.GetProtocolSectionObject()\r | |
507 | \r | |
508 | def CreateProtocolObject():\r | |
509 | return ProtocolObject()\r | |
510 | Factory = CreateProtocolObject\r | |
511 | elif Type == TAB_PPIS:\r | |
512 | Obj = self.DecParser.GetPpiSectionObject()\r | |
513 | \r | |
514 | def CreatePpiObject():\r | |
515 | return PpiObject()\r | |
516 | Factory = CreatePpiObject\r | |
517 | else:\r | |
518 | #\r | |
519 | # Should not be here\r | |
520 | #\r | |
521 | return\r | |
522 | \r | |
523 | DeclarationsList = []\r | |
524 | \r | |
525 | #\r | |
526 | # Go through each arch\r | |
527 | #\r | |
528 | for Item in Obj.GetGuidStyleAllItems():\r | |
529 | Name = Item.GuidCName\r | |
530 | Value = Item.GuidString\r | |
531 | HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r | |
532 | Item.GetTailComment())\r | |
533 | \r | |
534 | ListObject = Factory()\r | |
535 | ListObject.SetCName(Name)\r | |
536 | ListObject.SetGuid(Value)\r | |
537 | ListObject.SetSupArchList(Item.GetArchList())\r | |
538 | if HelpTxt:\r | |
421ccda3 HC |
539 | if self.UniFileClassObject:\r |
540 | HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r | |
4234283c LG |
541 | ListObject.SetHelpTextList([HelpTxt])\r |
542 | \r | |
543 | DeclarationsList.append(ListObject)\r | |
544 | \r | |
545 | # \r | |
546 | #GuidTypeList is abstracted from help\r | |
547 | #\r | |
548 | if Type == TAB_GUIDS:\r | |
549 | self.SetGuidList(self.GetGuidList() + DeclarationsList)\r | |
550 | elif Type == TAB_PROTOCOLS:\r | |
551 | self.SetProtocolList(self.GetProtocolList() + DeclarationsList)\r | |
552 | elif Type == TAB_PPIS:\r | |
553 | self.SetPpiList(self.GetPpiList() + DeclarationsList)\r | |
554 | \r | |
555 | ## GenLibraryClasses\r | |
556 | #\r | |
557 | # Gen LibraryClasses of Dec\r | |
558 | # <CName>=<GuidValue>\r | |
559 | #\r | |
560 | # @param ContainerFile: The Dec file full path \r | |
561 | #\r | |
562 | def GenLibraryClasses(self, ContainerFile):\r | |
563 | if ContainerFile:\r | |
564 | pass\r | |
565 | Logger.Debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r | |
566 | LibraryClassDeclarations = []\r | |
567 | \r | |
568 | LibObj = self.DecParser.GetLibraryClassSectionObject()\r | |
569 | for Item in LibObj.GetAllLibraryclasses():\r | |
570 | LibraryClass = LibraryClassObject()\r | |
571 | LibraryClass.SetLibraryClass(Item.Libraryclass)\r | |
572 | LibraryClass.SetSupArchList(Item.GetArchList())\r | |
573 | LibraryClass.SetIncludeHeader(Item.File)\r | |
574 | HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r | |
575 | Item.GetTailComment(), None, '@libraryclass')\r | |
576 | if HelpTxt:\r | |
421ccda3 HC |
577 | if self.UniFileClassObject:\r |
578 | HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r | |
4234283c LG |
579 | LibraryClass.SetHelpTextList([HelpTxt])\r |
580 | LibraryClassDeclarations.append(LibraryClass)\r | |
581 | \r | |
582 | self.SetLibraryClassList(self.GetLibraryClassList() + \\r | |
583 | LibraryClassDeclarations)\r | |
584 | \r | |
585 | ## GenPcds\r | |
586 | #\r | |
587 | # Gen Pcds of Dec\r | |
588 | # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r | |
589 | #\r | |
590 | # @param ContainerFile: The Dec file full path \r | |
591 | #\r | |
592 | def GenPcds(self, ContainerFile):\r | |
593 | Logger.Debug(2, "Generate %s ..." % TAB_PCDS)\r | |
4234283c LG |
594 | PcdObj = self.DecParser.GetPcdSectionObject()\r |
595 | #\r | |
596 | # Get all Pcds\r | |
597 | # \r | |
598 | PcdDeclarations = []\r | |
599 | IterList = [\r | |
600 | (TAB_PCDS_FIXED_AT_BUILD_NULL, 'FixedPcd'),\r | |
601 | (TAB_PCDS_PATCHABLE_IN_MODULE_NULL, 'PatchPcd'), \r | |
602 | (TAB_PCDS_FEATURE_FLAG_NULL, 'FeaturePcd'),\r | |
603 | (TAB_PCDS_DYNAMIC_EX_NULL, 'PcdEx'), \r | |
604 | (TAB_PCDS_DYNAMIC_NULL, 'Pcd')]\r | |
421ccda3 HC |
605 | \r |
606 | PromptStrList = []\r | |
607 | HelpStrList = []\r | |
608 | PcdErrStrList = []\r | |
609 | # Initialize UniStrDict dictionary, top keys are language codes\r | |
610 | UniStrDict = {}\r | |
611 | StrList = []\r | |
612 | \r | |
613 | Language = ''\r | |
614 | if self.UniFileClassObject:\r | |
615 | Language = TAB_LANGUAGE_EN_X\r | |
616 | else:\r | |
617 | Language = TAB_LANGUAGE_EN_US\r | |
618 | \r | |
619 | if self.UniFileClassObject:\r | |
620 | UniStrDict = self.UniFileClassObject.OrderedStringList\r | |
621 | for Lang in UniStrDict:\r | |
622 | for StringDefClassObject in UniStrDict[Lang]:\r | |
623 | StrList = StringDefClassObject.StringName.split('_')\r | |
624 | # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_PROMPT\r | |
625 | if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENPROMPT:\r | |
626 | PromptStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r | |
627 | StringDefClassObject.StringValue))\r | |
628 | # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_HELP\r | |
629 | if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENHELP:\r | |
630 | HelpStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r | |
631 | StringDefClassObject.StringValue))\r | |
632 | # StringName format is STR_<TOKENSPACECNAME>_ERR_##\r | |
633 | if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[2] == TAB_STR_TOKENERR:\r | |
634 | PcdErrStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r | |
635 | StringDefClassObject.StringValue))\r | |
4234283c LG |
636 | #\r |
637 | # For each PCD type\r | |
638 | #\r | |
639 | for PcdType, Type in IterList:\r | |
640 | #\r | |
641 | # Go through all archs\r | |
642 | #\r | |
643 | # for Arch in self.SupArchList + [TAB_ARCH_COMMON]:\r | |
644 | #\r | |
645 | for Item in PcdObj.GetPcdsByType(PcdType.upper()):\r | |
646 | PcdDeclaration = GenPcdDeclaration(\r | |
647 | ContainerFile,\r | |
648 | (Item.TokenSpaceGuidCName, Item.TokenCName,\r | |
649 | Item.DefaultValue, Item.DatumType, Item.TokenValue,\r | |
ccaa7754 | 650 | Type, Item.GetHeadComment(), Item.GetTailComment(), ''),\r |
421ccda3 HC |
651 | Language,\r |
652 | self.DecParser.GetDefineSectionMacro()\r | |
653 | )\r | |
4234283c | 654 | PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))\r |
421ccda3 HC |
655 | \r |
656 | #\r | |
657 | # Get PCD error message from PCD error comment section in DEC file\r | |
658 | #\r | |
659 | for PcdErr in PcdDeclaration.GetPcdErrorsList():\r | |
660 | if (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber()) \\r | |
661 | in self.DecParser.PcdErrorCommentDict:\r | |
662 | Key = (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber())\r | |
663 | PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r | |
664 | [(Language, self.DecParser.PcdErrorCommentDict[Key])])\r | |
665 | \r | |
666 | for Index in range(0, len(PromptStrList)):\r | |
667 | StrNameList = PromptStrList[Index][1].split('_')\r | |
668 | if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r | |
669 | StrNameList[2].lower() == Item.TokenCName.lower():\r | |
670 | TxtObj = TextObject()\r | |
671 | TxtObj.SetLang(PromptStrList[Index][0])\r | |
672 | TxtObj.SetString(PromptStrList[Index][2])\r | |
673 | for Prompt in PcdDeclaration.GetPromptList():\r | |
674 | if Prompt.GetLang() == TxtObj.GetLang() and \\r | |
675 | Prompt.GetString() == TxtObj.GetString():\r | |
676 | break\r | |
677 | else:\r | |
678 | PcdDeclaration.SetPromptList(PcdDeclaration.GetPromptList() + [TxtObj])\r | |
679 | \r | |
680 | for Index in range(0, len(HelpStrList)):\r | |
681 | StrNameList = HelpStrList[Index][1].split('_')\r | |
682 | if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r | |
683 | StrNameList[2].lower() == Item.TokenCName.lower():\r | |
684 | TxtObj = TextObject()\r | |
685 | TxtObj.SetLang(HelpStrList[Index][0])\r | |
686 | TxtObj.SetString(HelpStrList[Index][2])\r | |
687 | for HelpStrObj in PcdDeclaration.GetHelpTextList():\r | |
688 | if HelpStrObj.GetLang() == TxtObj.GetLang() and \\r | |
689 | HelpStrObj.GetString() == TxtObj.GetString():\r | |
690 | break\r | |
691 | else:\r | |
692 | PcdDeclaration.SetHelpTextList(PcdDeclaration.GetHelpTextList() + [TxtObj])\r | |
693 | \r | |
694 | #\r | |
695 | # Get PCD error message from UNI file\r | |
696 | #\r | |
697 | for Index in range(0, len(PcdErrStrList)):\r | |
698 | StrNameList = PcdErrStrList[Index][1].split('_')\r | |
699 | if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r | |
700 | StrNameList[2].lower() == TAB_STR_TOKENERR.lower():\r | |
701 | for PcdErr in PcdDeclaration.GetPcdErrorsList():\r | |
702 | if PcdErr.GetErrorNumber().lower() == (TAB_HEX_START + StrNameList[3]).lower() and \\r | |
703 | (PcdErrStrList[Index][0], PcdErrStrList[Index][2]) not in PcdErr.GetErrorMessageList():\r | |
704 | PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r | |
705 | [(PcdErrStrList[Index][0], PcdErrStrList[Index][2])])\r | |
706 | \r | |
707 | #\r | |
708 | # Check to prevent missing error message if a Pcd has the error code.\r | |
709 | #\r | |
710 | for PcdErr in PcdDeclaration.GetPcdErrorsList():\r | |
711 | if PcdErr.GetErrorNumber().strip():\r | |
712 | if not PcdErr.GetErrorMessageList():\r | |
713 | Logger.Error('UPT',\r | |
714 | FORMAT_INVALID,\r | |
715 | ST.ERR_DECPARSE_PCD_UNMATCHED_ERRORCODE % PcdErr.GetErrorNumber(),\r | |
716 | ContainerFile,\r | |
717 | PcdErr.GetLineNum(),\r | |
718 | PcdErr.GetFileLine()) \r | |
719 | \r | |
4234283c | 720 | PcdDeclarations.append(PcdDeclaration)\r |
4234283c | 721 | self.SetPcdList(self.GetPcdList() + PcdDeclarations)\r |
421ccda3 HC |
722 | self.CheckPcdValue()\r |
723 | \r | |
724 | ##\r | |
725 | # Get error message via language\r | |
726 | # @param ErrorMessageList: Error message tuple list the language and its message\r | |
727 | # @param Lang: the language of setting\r | |
728 | # @return: the error message described in the related UNI file\r | |
729 | def GetEnErrorMessage(self, ErrorMessageList):\r | |
730 | if self.FullPath:\r | |
731 | pass\r | |
732 | Lang = TAB_LANGUAGE_EN_US\r | |
733 | for (Language, Message) in ErrorMessageList:\r | |
734 | if Language == Lang:\r | |
735 | return Message\r | |
736 | for (Language, Message) in ErrorMessageList:\r | |
737 | if Language.find(TAB_LANGUAGE_EN) >= 0:\r | |
738 | return Message\r | |
739 | else:\r | |
740 | try:\r | |
741 | return ErrorMessageList[0][1]\r | |
742 | except IndexError:\r | |
743 | return ''\r | |
744 | return '' \r | |
745 | \r | |
746 | ##\r | |
747 | # Replace the strings for Python eval function.\r | |
748 | # @param ReplaceValue: The string that needs to be replaced. \r | |
749 | # @return: The string was replaced, then eval function is always making out it. \r | |
750 | def ReplaceForEval(self, ReplaceValue, IsRange=False, IsExpr=False):\r | |
751 | if self.FullPath:\r | |
752 | pass\r | |
753 | #\r | |
754 | # deal with "NOT EQ", "NOT LT", "NOT GT", "NOT LE", "NOT GE", "NOT NOT" \r | |
755 | #\r | |
756 | NOTNOT_Pattern = '[\t\s]*NOT[\t\s]+NOT[\t\s]*'\r | |
757 | NOTGE_Pattern = '[\t\s]*NOT[\t\s]+GE[\t\s]*'\r | |
758 | NOTLE_Pattern = '[\t\s]*NOT[\t\s]+LE[\t\s]*'\r | |
759 | NOTGT_Pattern = '[\t\s]*NOT[\t\s]+GT[\t\s]*'\r | |
760 | NOTLT_Pattern = '[\t\s]*NOT[\t\s]+LT[\t\s]*'\r | |
761 | NOTEQ_Pattern = '[\t\s]*NOT[\t\s]+EQ[\t\s]*'\r | |
762 | ReplaceValue = re.compile(NOTNOT_Pattern).sub('', ReplaceValue)\r | |
763 | ReplaceValue = re.compile(NOTLT_Pattern).sub('x >= ', ReplaceValue)\r | |
764 | ReplaceValue = re.compile(NOTGT_Pattern).sub('x <= ', ReplaceValue)\r | |
765 | ReplaceValue = re.compile(NOTLE_Pattern).sub('x > ', ReplaceValue)\r | |
766 | ReplaceValue = re.compile(NOTGE_Pattern).sub('x < ', ReplaceValue)\r | |
767 | ReplaceValue = re.compile(NOTEQ_Pattern).sub('x != ', ReplaceValue)\r | |
768 | \r | |
769 | if IsRange:\r | |
770 | ReplaceValue = ReplaceValue.replace('EQ', 'x ==')\r | |
771 | ReplaceValue = ReplaceValue.replace('LT', 'x <')\r | |
772 | ReplaceValue = ReplaceValue.replace('LE', 'x <=')\r | |
773 | ReplaceValue = ReplaceValue.replace('GT', 'x >')\r | |
774 | ReplaceValue = ReplaceValue.replace('GE', 'x >=')\r | |
775 | ReplaceValue = ReplaceValue.replace('XOR', 'x ^')\r | |
776 | elif IsExpr:\r | |
777 | ReplaceValue = ReplaceValue.replace('EQ', '==')\r | |
778 | ReplaceValue = ReplaceValue.replace('NE', '!=')\r | |
779 | ReplaceValue = ReplaceValue.replace('LT', '<')\r | |
780 | ReplaceValue = ReplaceValue.replace('LE', '<=')\r | |
781 | ReplaceValue = ReplaceValue.replace('GT', '>')\r | |
782 | ReplaceValue = ReplaceValue.replace('GE', '>=') \r | |
783 | ReplaceValue = ReplaceValue.replace('XOR', '^') \r | |
784 | \r | |
785 | ReplaceValue = ReplaceValue.replace('AND', 'and')\r | |
786 | ReplaceValue = ReplaceValue.replace('&&', ' and ')\r | |
787 | ReplaceValue = ReplaceValue.replace('xor', '^')\r | |
788 | ReplaceValue = ReplaceValue.replace('OR', 'or')\r | |
789 | ReplaceValue = ReplaceValue.replace('||', ' or ')\r | |
790 | ReplaceValue = ReplaceValue.replace('NOT', 'not')\r | |
791 | if ReplaceValue.find('!') >= 0 and ReplaceValue[ReplaceValue.index('!') + 1] != '=':\r | |
792 | ReplaceValue = ReplaceValue.replace('!', ' not ') \r | |
793 | if '.' in ReplaceValue:\r | |
794 | Pattern = '[a-zA-Z0-9]{1,}\.[a-zA-Z0-9]{1,}'\r | |
795 | MatchedList = re.findall(Pattern, ReplaceValue)\r | |
796 | for MatchedItem in MatchedList:\r | |
797 | if MatchedItem not in self.PcdDefaultValueDict:\r | |
798 | Logger.Error("Dec File Parser", FORMAT_INVALID, Message=ST.ERR_DECPARSE_PCD_NODEFINED % MatchedItem,\r | |
799 | File=self.FullPath)\r | |
800 | \r | |
801 | ReplaceValue = ReplaceValue.replace(MatchedItem, self.PcdDefaultValueDict[MatchedItem])\r | |
802 | \r | |
803 | return ReplaceValue\r | |
804 | \r | |
805 | ##\r | |
806 | # Check pcd's default value according to the pcd's description\r | |
807 | #\r | |
808 | def CheckPcdValue(self):\r | |
809 | for Pcd in self.GetPcdList():\r | |
810 | self.PcdDefaultValueDict[TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName())).strip()] = \\r | |
811 | Pcd.GetDefaultValue()\r | |
812 | \r | |
813 | for Pcd in self.GetPcdList():\r | |
814 | ValidationExpressions = []\r | |
815 | PcdGuidName = TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()))\r | |
816 | Valids = Pcd.GetPcdErrorsList()\r | |
817 | for Valid in Valids:\r | |
818 | Expression = Valid.GetExpression()\r | |
819 | if Expression:\r | |
820 | #\r | |
821 | # Delete the 'L' prefix of a quoted string, this operation is for eval()\r | |
822 | #\r | |
823 | QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r | |
824 | QuotedMatchedObj = re.search(QUOTED_PATTERN, Expression)\r | |
825 | if QuotedMatchedObj:\r | |
826 | MatchedStr = QuotedMatchedObj.group().strip()\r | |
827 | if MatchedStr.startswith('L'):\r | |
828 | Expression = Expression.replace(MatchedStr, MatchedStr[1:].strip()) \r | |
829 | \r | |
830 | Expression = self.ReplaceForEval(Expression, IsExpr=True)\r | |
831 | Expression = Expression.replace(PcdGuidName, 'x')\r | |
832 | Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r | |
833 | ValidationExpressions.append((Expression, Message)) \r | |
834 | \r | |
835 | ValidList = Valid.GetValidValue()\r | |
836 | if ValidList:\r | |
837 | ValidValue = 'x in %s' % [eval(v) for v in ValidList.split(' ') if v]\r | |
838 | Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r | |
839 | ValidationExpressions.append((ValidValue, Message))\r | |
840 | \r | |
841 | ValidValueRange = Valid.GetValidValueRange() \r | |
842 | if ValidValueRange:\r | |
843 | ValidValueRange = self.ReplaceForEval(ValidValueRange, IsRange=True)\r | |
844 | if ValidValueRange.find('-') >= 0:\r | |
845 | ValidValueRange = ValidValueRange.replace('-', '<= x <=')\r | |
846 | elif not ValidValueRange.startswith('x ') and not ValidValueRange.startswith('not ') \\r | |
847 | and not ValidValueRange.startswith('not(') and not ValidValueRange.startswith('('):\r | |
848 | ValidValueRange = 'x %s' % ValidValueRange\r | |
849 | Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r | |
850 | ValidationExpressions.append((ValidValueRange, Message))\r | |
851 | \r | |
852 | DefaultValue = self.PcdDefaultValueDict[PcdGuidName.strip()]\r | |
853 | #\r | |
854 | # Delete the 'L' prefix of a quoted string, this operation is for eval()\r | |
855 | #\r | |
856 | QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r | |
857 | QuotedMatchedObj = re.search(QUOTED_PATTERN, DefaultValue)\r | |
858 | if QuotedMatchedObj:\r | |
859 | MatchedStr = QuotedMatchedObj.group().strip()\r | |
860 | if MatchedStr.startswith('L'):\r | |
861 | DefaultValue = DefaultValue.replace(MatchedStr, MatchedStr[1:].strip())\r | |
862 | \r | |
863 | try:\r | |
864 | DefaultValue = eval(DefaultValue.replace('TRUE', 'True').replace('true', 'True')\r | |
865 | .replace('FALSE', 'False').replace('false', 'False'))\r | |
866 | except BaseException:\r | |
867 | pass\r | |
868 | \r | |
869 | for (Expression, Msg) in ValidationExpressions:\r | |
870 | try:\r | |
871 | if not eval(Expression, {'x':DefaultValue}):\r | |
872 | Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData='%s, value = %s' %\\r | |
873 | (PcdGuidName, DefaultValue), Message=Msg, File=self.FullPath)\r | |
874 | except TypeError:\r | |
875 | Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData=PcdGuidName, \\r | |
876 | Message=Msg, File=self.FullPath)\r | |
4234283c | 877 | \r |
4234283c LG |
878 | ## GenModuleFileList\r |
879 | #\r | |
880 | def GenModuleFileList(self, ContainerFile): \r | |
881 | ModuleFileList = []\r | |
882 | ContainerFileName = os.path.basename(ContainerFile)\r | |
883 | ContainerFilePath = os.path.dirname(ContainerFile)\r | |
884 | for Item in GetFiles(ContainerFilePath, \r | |
885 | ['CVS', '.svn'] + self.GetIncludePathList(), False):\r | |
886 | ExtName = os.path.splitext(Item)[1]\r | |
887 | if ExtName.lower() == '.inf':\r | |
888 | ModuleFileList.append(Item)\r | |
889 | elif ExtName.upper() == '.DEC' and self.CheckMulDec:\r | |
890 | if Item == ContainerFileName:\r | |
891 | continue\r | |
892 | Logger.Error('MkPkg', \r | |
893 | UPT_MUL_DEC_ERROR,\r | |
894 | ST.ERR_MUL_DEC_ERROR%(ContainerFilePath, \r | |
895 | ContainerFileName, \r | |
896 | Item))\r | |
897 | \r | |
898 | self.SetModuleFileList(ModuleFileList)\r | |
899 | \r | |
900 | ## Show detailed information of Package\r | |
901 | #\r | |
902 | # Print all members and their values of Package class\r | |
903 | #\r | |
904 | def ShowPackage(self):\r | |
72443dd2 GL |
905 | print('\nName =', self.GetName())\r |
906 | print('\nBaseName =', self.GetBaseName())\r | |
907 | print('\nVersion =', self.GetVersion())\r | |
908 | print('\nGuid =', self.GetGuid())\r | |
4234283c | 909 | \r |
72443dd2 GL |
910 | print('\nStandardIncludes = %d ' \\r |
911 | % len(self.GetStandardIncludeFileList()), end=' ')\r | |
4234283c | 912 | for Item in self.GetStandardIncludeFileList():\r |
72443dd2 GL |
913 | print(Item.GetFilePath(), ' ', Item.GetSupArchList())\r |
914 | print('\nPackageIncludes = %d \n' \\r | |
915 | % len(self.GetPackageIncludeFileList()), end=' ')\r | |
4234283c | 916 | for Item in self.GetPackageIncludeFileList():\r |
72443dd2 | 917 | print(Item.GetFilePath(), ' ', Item.GetSupArchList())\r |
4234283c | 918 | \r |
72443dd2 | 919 | print('\nGuids =', self.GetGuidList())\r |
4234283c | 920 | for Item in self.GetGuidList():\r |
72443dd2 GL |
921 | print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r |
922 | print('\nProtocols =', self.GetProtocolList())\r | |
4234283c | 923 | for Item in self.GetProtocolList():\r |
72443dd2 GL |
924 | print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r |
925 | print('\nPpis =', self.GetPpiList())\r | |
4234283c | 926 | for Item in self.GetPpiList():\r |
72443dd2 GL |
927 | print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r |
928 | print('\nLibraryClasses =', self.GetLibraryClassList())\r | |
4234283c | 929 | for Item in self.GetLibraryClassList():\r |
72443dd2 GL |
930 | print(Item.GetLibraryClass(), Item.GetRecommendedInstance(), \\r |
931 | Item.GetSupArchList())\r | |
932 | print('\nPcds =', self.GetPcdList())\r | |
4234283c | 933 | for Item in self.GetPcdList():\r |
72443dd2 | 934 | print('CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \\r |
4234283c LG |
935 | Item.GetTokenSpaceGuidCName(), \\r |
936 | 'DefaultValue=', Item.GetDefaultValue(), \\r | |
937 | 'ValidUsage=', Item.GetValidUsage(), \\r | |
938 | 'SupArchList', Item.GetSupArchList(), \\r | |
72443dd2 | 939 | 'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType())\r |
4234283c LG |
940 | \r |
941 | for Item in self.GetMiscFileList():\r | |
72443dd2 | 942 | print(Item.GetName())\r |
4234283c | 943 | for FileObjectItem in Item.GetFileList():\r |
72443dd2 GL |
944 | print(FileObjectItem.GetURI())\r |
945 | print('****************\n')\r | |
4234283c LG |
946 | \r |
947 | ## GenPcdDeclaration\r | |
948 | #\r | |
949 | # @param ContainerFile: File name of the DEC file\r | |
950 | # @param PcdInfo: Pcd information, of format (TokenGuidCName, \r | |
951 | # TokenName, Value, DatumType, Token, Type, \r | |
952 | # GenericComment, TailComment, Arch)\r | |
421ccda3 | 953 | # @param Language: The language of HelpText, Prompt \r |
4234283c | 954 | # \r |
421ccda3 | 955 | def GenPcdDeclaration(ContainerFile, PcdInfo, Language, MacroReplaceDict):\r |
4234283c | 956 | HelpStr = ''\r |
421ccda3 | 957 | PromptStr = ''\r |
4234283c LG |
958 | TailHelpStr = ''\r |
959 | TokenGuidCName, TokenName, Value, DatumType, Token, Type, \\r | |
960 | GenericComment, TailComment, Arch = PcdInfo\r | |
961 | Pcd = PcdObject()\r | |
962 | Pcd.SetCName(TokenName)\r | |
963 | Pcd.SetToken(Token)\r | |
964 | Pcd.SetTokenSpaceGuidCName(TokenGuidCName)\r | |
965 | Pcd.SetDatumType(DatumType)\r | |
966 | Pcd.SetDefaultValue(Value)\r | |
967 | Pcd.SetValidUsage(Type)\r | |
968 | #\r | |
969 | # MaxDatumSize is required field for 'VOID*' PCD\r | |
970 | #\r | |
971 | if DatumType == TAB_PTR_TYPE_PCD:\r | |
972 | Pcd.SetMaxDatumSize(ITEM_UNDEFINED)\r | |
973 | \r | |
974 | SupArchList = [Arch]\r | |
975 | Pcd.SetSupArchList(SupArchList)\r | |
976 | \r | |
977 | if GenericComment:\r | |
421ccda3 HC |
978 | HelpStr, PcdErrList, PromptStr = ParseDecPcdGenericComment(GenericComment, \r |
979 | ContainerFile, \r | |
980 | TokenGuidCName, \r | |
981 | TokenName,\r | |
982 | MacroReplaceDict)\r | |
983 | if PcdErrList:\r | |
984 | Pcd.SetPcdErrorsList(PcdErrList)\r | |
4234283c LG |
985 | \r |
986 | if TailComment:\r | |
987 | SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment, \r | |
988 | ContainerFile)\r | |
989 | if SupModuleList:\r | |
990 | Pcd.SetSupModuleList(SupModuleList)\r | |
991 | \r | |
992 | if HelpStr and (not HelpStr.endswith('\n')) and TailHelpStr:\r | |
993 | HelpStr += '\n'\r | |
994 | HelpStr += TailHelpStr\r | |
995 | if HelpStr:\r | |
421ccda3 HC |
996 | HelpTxtObj = TextObject()\r |
997 | HelpTxtObj.SetLang(Language) \r | |
4234283c LG |
998 | HelpTxtObj.SetString(HelpStr)\r |
999 | Pcd.SetHelpTextList([HelpTxtObj])\r | |
421ccda3 HC |
1000 | if PromptStr:\r |
1001 | TxtObj = TextObject()\r | |
1002 | TxtObj.SetLang(Language)\r | |
1003 | TxtObj.SetString(PromptStr)\r | |
1004 | Pcd.SetPromptList([TxtObj])\r | |
4234283c LG |
1005 | \r |
1006 | return Pcd\r |