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