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