]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
Revert BaseTools: PYTHON3 migration
[mirror_edk2.git] / BaseTools / Source / Python / UPT / GenMetaFile / GenDecFile.py
CommitLineData
4234283c
LG
1## @file GenDecFile.py\r
2#\r
3# This file contained the logical of transfer package object to DEC files.\r
4#\r
64285f15 5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 6#\r
f7496d71
LG
7# This program and the accompanying materials are licensed and made available\r
8# under the terms and conditions of the BSD License which accompanies this\r
9# distribution. The full text of the license may be found at\r
4234283c
LG
10# http://opensource.org/licenses/bsd-license.php\r
11#\r
12# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14#\r
15\r
16'''\r
17GenDEC\r
18'''\r
421ccda3
HC
19import os\r
20import stat\r
21import codecs\r
fcb1af1b 22from hashlib import md5\r
421ccda3 23from Core.FileHook import __FileHookOpen__\r
4234283c
LG
24from Library.Parsing import GenSection\r
25from Library.CommentGenerating import GenHeaderCommentSection\r
26from Library.CommentGenerating import GenGenericCommentF\r
27from Library.CommentGenerating import GenDecTailComment\r
28from Library.CommentGenerating import _GetHelpStr\r
29from Library.Misc import GuidStringToGuidStructureString\r
30from Library.Misc import SaveFileOnChange\r
31from Library.Misc import ConvertPath\r
421ccda3 32from Library.Misc import GetLocalValue\r
4234283c
LG
33from Library.DataType import TAB_SPACE_SPLIT\r
34from Library.DataType import TAB_COMMA_SPLIT\r
421ccda3 35from Library.DataType import END_OF_LINE\r
4234283c 36from Library.DataType import TAB_ARCH_COMMON\r
421ccda3
HC
37from Library.DataType import TAB_VALUE_SPLIT\r
38from Library.DataType import TAB_COMMENT_SPLIT\r
39from Library.DataType import TAB_PCD_VALIDRANGE\r
40from Library.DataType import TAB_PCD_VALIDLIST\r
41from Library.DataType import TAB_PCD_EXPRESSION\r
4234283c
LG
42from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
43from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME\r
44from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
45from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
421ccda3
HC
46from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
47from Library.DataType import TAB_DEC_PACKAGE_ABSTRACT\r
48from Library.DataType import TAB_DEC_PACKAGE_DESCRIPTION\r
49from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r
50from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r
51from Library.DataType import TAB_LANGUAGE_EN_X\r
52from Library.DataType import TAB_BINARY_HEADER_USERID\r
53from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
54from Library.DataType import TAB_COMMENT_EDK1_SPLIT\r
55from Library.DataType import TAB_ENCODING_UTF16LE\r
56from Library.DataType import TAB_CAPHEX_START\r
57from Library.DataType import TAB_HEX_START\r
58from Library.DataType import TAB_UNDERLINE_SPLIT\r
59from Library.DataType import TAB_STR_TOKENERR\r
60from Library.DataType import TAB_STR_TOKENCNAME\r
61from Library.DataType import TAB_PCD_ERROR_SECTION_COMMENT\r
62from Library.DataType import TAB_PCD_ERROR\r
63from Library.DataType import TAB_SECTION_START\r
64from Library.DataType import TAB_SECTION_END\r
65from Library.DataType import TAB_SPLIT\r
645a5128 66import Library.DataType as DT\r
421ccda3 67from Library.UniClassObject import FormatUniEntry\r
64285f15 68from Library.StringUtils import GetUniFileName\r
4234283c
LG
69\r
70def GenPcd(Package, Content):\r
71 #\r
72 # generate [Pcd] section\r
f7496d71 73 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
4234283c
LG
74 #\r
75 ValidUsageDict = {}\r
76 for Pcd in Package.GetPcdList():\r
77 #\r
78 # Generate generic comment\r
79 #\r
80 HelpTextList = Pcd.GetHelpTextList()\r
81 HelpStr = _GetHelpStr(HelpTextList)\r
82 CommentStr = GenGenericCommentF(HelpStr, 2)\r
f7496d71 83\r
421ccda3
HC
84 PromptList = Pcd.GetPromptList()\r
85 PromptStr = _GetHelpStr(PromptList)\r
86 CommentStr += GenGenericCommentF(PromptStr.strip(), 1, True)\r
f7496d71 87\r
4234283c 88 PcdErrList = Pcd.GetPcdErrorsList()\r
421ccda3
HC
89 for PcdErr in PcdErrList:\r
90 CommentStr += GenPcdErrComment(PcdErr)\r
4234283c 91 Statement = CommentStr\r
f7496d71 92\r
4234283c
LG
93 CName = Pcd.GetCName()\r
94 TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()\r
95 DefaultValue = Pcd.GetDefaultValue()\r
96 DatumType = Pcd.GetDatumType()\r
97 Token = Pcd.GetToken()\r
98 ValidUsage = Pcd.GetValidUsage()\r
99\r
100 if ValidUsage == 'FeaturePcd':\r
101 ValidUsage = 'PcdsFeatureFlag'\r
102 elif ValidUsage == 'PatchPcd':\r
103 ValidUsage = 'PcdsPatchableInModule'\r
104 elif ValidUsage == 'FixedPcd':\r
105 ValidUsage = 'PcdsFixedAtBuild'\r
106 elif ValidUsage == 'Pcd':\r
107 ValidUsage = 'PcdsDynamic'\r
108 elif ValidUsage == 'PcdEx':\r
109 ValidUsage = 'PcdsDynamicEx'\r
f7496d71 110\r
4234283c
LG
111 if ValidUsage in ValidUsageDict:\r
112 NewSectionDict = ValidUsageDict[ValidUsage]\r
113 else:\r
114 NewSectionDict = {}\r
115 ValidUsageDict[ValidUsage] = NewSectionDict\r
116 Statement += TokenSpaceGuidCName + '.' + CName\r
117 Statement += '|' + DefaultValue\r
118 Statement += '|' + DatumType\r
119 Statement += '|' + Token\r
120 #\r
121 # generate tail comment\r
122 #\r
123 if Pcd.GetSupModuleList():\r
124 Statement += GenDecTailComment(Pcd.GetSupModuleList())\r
125\r
0d1f5b2b 126 ArchList = sorted(Pcd.GetSupArchList())\r
4234283c
LG
127 SortedArch = ' '.join(ArchList)\r
128 if SortedArch in NewSectionDict:\r
129 NewSectionDict[SortedArch] = \\r
130 NewSectionDict[SortedArch] + [Statement]\r
131 else:\r
f7496d71
LG
132 NewSectionDict[SortedArch] = [Statement]\r
133\r
4234283c 134 for ValidUsage in ValidUsageDict:\r
421ccda3 135 Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage], True, True)\r
f7496d71 136\r
4234283c
LG
137 return Content\r
138\r
421ccda3
HC
139def GenPcdErrorMsgSection(Package, Content):\r
140 if not Package.PcdErrorCommentDict:\r
141 return Content\r
f7496d71 142\r
421ccda3
HC
143 #\r
144 # Generate '# [Error.<TokenSpcCName>]' section\r
145 #\r
146 Content += END_OF_LINE + END_OF_LINE\r
147 SectionComment = TAB_COMMENT_SPLIT + END_OF_LINE\r
148 SectionComment += TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_ERROR_SECTION_COMMENT + END_OF_LINE\r
149 SectionComment += TAB_COMMENT_SPLIT + END_OF_LINE\r
150 TokenSpcCNameList = []\r
f7496d71 151\r
421ccda3
HC
152 #\r
153 # Get TokenSpcCName list in PcdErrorCommentDict in Package object\r
154 #\r
155 for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
156 if TokenSpcCName not in TokenSpcCNameList:\r
157 TokenSpcCNameList.append(TokenSpcCName)\r
f7496d71 158\r
421ccda3
HC
159 for TokenSpcCNameItem in TokenSpcCNameList:\r
160 SectionName = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SECTION_START + TAB_PCD_ERROR + \\r
161 TAB_SPLIT + TokenSpcCNameItem + TAB_SECTION_END + END_OF_LINE\r
162 Content += SectionComment\r
163 Content += SectionName\r
164 for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
165 if TokenSpcCNameItem == TokenSpcCName:\r
166 PcdErrorMsg = GetLocalValue(Package.PcdErrorCommentDict[(TokenSpcCName, ErrorNumber)])\r
167 SectionItem = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SPACE_SPLIT + \\r
168 ErrorNumber + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT + \\r
169 PcdErrorMsg + END_OF_LINE\r
170 Content += SectionItem\r
f7496d71 171\r
421ccda3
HC
172 Content += TAB_COMMENT_SPLIT\r
173 return Content\r
f7496d71 174\r
4234283c
LG
175def GenGuidProtocolPpi(Package, Content):\r
176 #\r
177 # generate [Guids] section\r
178 #\r
179 NewSectionDict = {}\r
421ccda3
HC
180\r
181 LeftOffset = 46\r
182 # Get the line offset need\r
183 # If the real one < the min one, use the min one\r
184 # else use the real one\r
185 for Guid in Package.GetGuidList():\r
186 if len(Guid.GetCName()) > LeftOffset:\r
187 LeftOffset = len(Guid.GetCName())\r
188\r
189 # Generate\r
4234283c
LG
190 for Guid in Package.GetGuidList():\r
191 #\r
192 # Generate generic comment\r
193 #\r
194 HelpTextList = Guid.GetHelpTextList()\r
195 HelpStr = _GetHelpStr(HelpTextList)\r
196 CommentStr = GenGenericCommentF(HelpStr, 2)\r
197\r
198 Statement = CommentStr\r
199 CName = Guid.GetCName()\r
200 Value = GuidStringToGuidStructureString(Guid.GetGuid())\r
421ccda3 201 Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
4234283c
LG
202 #\r
203 # generate tail comment\r
204 #\r
205 if Guid.GetSupModuleList():\r
f7496d71 206 Statement += GenDecTailComment(Guid.GetSupModuleList())\r
0d1f5b2b 207 ArchList = sorted(Guid.GetSupArchList())\r
4234283c
LG
208 SortedArch = ' '.join(ArchList)\r
209 if SortedArch in NewSectionDict:\r
210 NewSectionDict[SortedArch] = \\r
211 NewSectionDict[SortedArch] + [Statement]\r
212 else:\r
f7496d71 213 NewSectionDict[SortedArch] = [Statement]\r
4234283c 214\r
421ccda3 215 Content += GenSection('Guids', NewSectionDict, True, True)\r
f7496d71 216\r
4234283c
LG
217 #\r
218 # generate [Protocols] section\r
219 #\r
220 NewSectionDict = {}\r
421ccda3
HC
221 LeftOffset = 46\r
222 # Get the line offset need\r
223 # If the real one < the min one, use the min one\r
224 # else use the real one\r
225 for Protocol in Package.GetProtocolList():\r
226 if len(Protocol.GetCName()) > LeftOffset:\r
227 LeftOffset = len(Protocol.GetCName())\r
228\r
4234283c
LG
229 for Protocol in Package.GetProtocolList():\r
230 #\r
231 # Generate generic comment\r
232 #\r
233 HelpTextList = Protocol.GetHelpTextList()\r
234 HelpStr = _GetHelpStr(HelpTextList)\r
f7496d71 235 CommentStr = GenGenericCommentF(HelpStr, 2)\r
4234283c 236\r
f7496d71 237 Statement = CommentStr\r
4234283c
LG
238 CName = Protocol.GetCName()\r
239 Value = GuidStringToGuidStructureString(Protocol.GetGuid())\r
421ccda3 240 Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
4234283c
LG
241\r
242 #\r
243 # generate tail comment\r
244 #\r
245 if Protocol.GetSupModuleList():\r
246 Statement += GenDecTailComment(Protocol.GetSupModuleList())\r
0d1f5b2b 247 ArchList = sorted(Protocol.GetSupArchList())\r
4234283c
LG
248 SortedArch = ' '.join(ArchList)\r
249 if SortedArch in NewSectionDict:\r
250 NewSectionDict[SortedArch] = \\r
251 NewSectionDict[SortedArch] + [Statement]\r
252 else:\r
f7496d71 253 NewSectionDict[SortedArch] = [Statement]\r
4234283c 254\r
f7496d71 255 Content += GenSection('Protocols', NewSectionDict, True, True)\r
4234283c
LG
256\r
257 #\r
258 # generate [Ppis] section\r
259 #\r
260 NewSectionDict = {}\r
421ccda3
HC
261 LeftOffset = 46\r
262 # Get the line offset need\r
263 # If the real one < the min one, use the min one\r
264 # else use the real one\r
265 for Ppi in Package.GetPpiList():\r
266 if len(Ppi.GetCName()) > LeftOffset:\r
267 LeftOffset = len(Ppi.GetCName())\r
268\r
4234283c
LG
269 for Ppi in Package.GetPpiList():\r
270 #\r
271 # Generate generic comment\r
272 #\r
273 HelpTextList = Ppi.GetHelpTextList()\r
274 HelpStr = _GetHelpStr(HelpTextList)\r
275 CommentStr = GenGenericCommentF(HelpStr, 2)\r
276\r
277 Statement = CommentStr\r
278 CName = Ppi.GetCName()\r
279 Value = GuidStringToGuidStructureString(Ppi.GetGuid())\r
421ccda3 280 Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
4234283c
LG
281\r
282 #\r
283 # generate tail comment\r
284 #\r
285 if Ppi.GetSupModuleList():\r
286 Statement += GenDecTailComment(Ppi.GetSupModuleList())\r
0d1f5b2b 287 ArchList = sorted(Ppi.GetSupArchList())\r
4234283c
LG
288 SortedArch = ' '.join(ArchList)\r
289 if SortedArch in NewSectionDict:\r
290 NewSectionDict[SortedArch] = \\r
291 NewSectionDict[SortedArch] + [Statement]\r
292 else:\r
f7496d71 293 NewSectionDict[SortedArch] = [Statement]\r
4234283c 294\r
421ccda3 295 Content += GenSection('Ppis', NewSectionDict, True, True)\r
f7496d71 296\r
4234283c
LG
297 return Content\r
298\r
299## Transfer Package Object to Dec files\r
300#\r
f7496d71 301# Transfer all contents of a standard Package Object to a Dec file\r
4234283c 302#\r
f7496d71 303# @param Package: A Package\r
4234283c 304#\r
421ccda3 305def PackageToDec(Package, DistHeader = None):\r
4234283c
LG
306 #\r
307 # Init global information for the file\r
308 #\r
309 ContainerFile = Package.GetFullPath()\r
f7496d71 310\r
4234283c 311 Content = ''\r
f7496d71 312\r
4234283c 313 #\r
f7496d71 314 # Generate file header\r
4234283c 315 #\r
421ccda3
HC
316 PackageAbstract = GetLocalValue(Package.GetAbstract())\r
317 PackageDescription = GetLocalValue(Package.GetDescription())\r
318 PackageCopyright = ''\r
319 PackageLicense = ''\r
320 for (Lang, Copyright) in Package.GetCopyright():\r
321 if Lang:\r
322 pass\r
323 PackageCopyright = Copyright\r
324 for (Lang, License) in Package.GetLicense():\r
325 if Lang:\r
326 pass\r
327 PackageLicense = License\r
328 if not PackageAbstract and DistHeader:\r
329 PackageAbstract = GetLocalValue(DistHeader.GetAbstract())\r
330 if not PackageDescription and DistHeader:\r
331 PackageDescription = GetLocalValue(DistHeader.GetDescription())\r
332 if not PackageCopyright and DistHeader:\r
333 for (Lang, Copyright) in DistHeader.GetCopyright():\r
334 PackageCopyright = Copyright\r
335 if not PackageLicense and DistHeader:\r
336 for (Lang, License) in DistHeader.GetLicense():\r
337 PackageLicense = License\r
f7496d71 338\r
421ccda3
HC
339 #\r
340 # Generate header comment section of DEC file\r
341 #\r
342 Content += GenHeaderCommentSection(PackageAbstract, \\r
343 PackageDescription, \\r
344 PackageCopyright, \\r
875cc5bb 345 PackageLicense).replace('\r\n', '\n')\r
421ccda3
HC
346\r
347 #\r
f7496d71 348 # Generate Binary header\r
421ccda3
HC
349 #\r
350 for UserExtension in Package.GetUserExtensionList():\r
351 if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
352 and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
353 PackageBinaryAbstract = GetLocalValue(UserExtension.GetBinaryAbstract())\r
354 PackageBinaryDescription = GetLocalValue(UserExtension.GetBinaryDescription())\r
355 PackageBinaryCopyright = ''\r
356 PackageBinaryLicense = ''\r
357 for (Lang, Copyright) in UserExtension.GetBinaryCopyright():\r
358 PackageBinaryCopyright = Copyright\r
359 for (Lang, License) in UserExtension.GetBinaryLicense():\r
f7496d71 360 PackageBinaryLicense = License\r
421ccda3
HC
361 if PackageBinaryAbstract and PackageBinaryDescription and \\r
362 PackageBinaryCopyright and PackageBinaryLicense:\r
f7496d71
LG
363 Content += GenHeaderCommentSection(PackageBinaryAbstract,\r
364 PackageBinaryDescription,\r
365 PackageBinaryCopyright,\r
421ccda3
HC
366 PackageBinaryLicense,\r
367 True)\r
368\r
369 #\r
370 # Generate PACKAGE_UNI_FILE for the Package\r
371 #\r
372 FileHeader = GenHeaderCommentSection(PackageAbstract, PackageDescription, PackageCopyright, PackageLicense, False, \\r
373 TAB_COMMENT_EDK1_SPLIT)\r
374 GenPackageUNIEncodeFile(Package, FileHeader)\r
375\r
4234283c 376 #\r
f7496d71 377 # for each section, maintain a dict, sorted arch will be its key,\r
4234283c
LG
378 #statement list will be its data\r
379 # { 'Arch1 Arch2 Arch3': [statement1, statement2],\r
f7496d71 380 # 'Arch1' : [statement1, statement3]\r
4234283c
LG
381 # }\r
382 #\r
f7496d71 383\r
4234283c 384 #\r
f7496d71 385 # generate [Defines] section\r
4234283c 386 #\r
421ccda3 387 LeftOffset = 31\r
4234283c
LG
388 NewSectionDict = {TAB_ARCH_COMMON : []}\r
389 SpecialItemList = []\r
f7496d71 390\r
421ccda3 391 Statement = (u'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION).ljust(LeftOffset) + u'= %s' % '0x00010017'\r
4234283c 392 SpecialItemList.append(Statement)\r
f7496d71 393\r
4234283c
LG
394 BaseName = Package.GetBaseName()\r
395 if BaseName.startswith('.') or BaseName.startswith('-'):\r
396 BaseName = '_' + BaseName\r
421ccda3 397 Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_NAME).ljust(LeftOffset) + u'= %s' % BaseName\r
4234283c 398 SpecialItemList.append(Statement)\r
421ccda3
HC
399\r
400 Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION).ljust(LeftOffset) + u'= %s' % Package.GetVersion()\r
4234283c 401 SpecialItemList.append(Statement)\r
421ccda3
HC
402\r
403 Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID).ljust(LeftOffset) + u'= %s' % Package.GetGuid()\r
404 SpecialItemList.append(Statement)\r
405\r
406 if Package.UNIFlag:\r
407 Statement = (u'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE).ljust(LeftOffset) + u'= %s' % Package.GetBaseName() + '.uni'\r
f7496d71 408 SpecialItemList.append(Statement)\r
421ccda3 409\r
4234283c
LG
410 for SortedArch in NewSectionDict:\r
411 NewSectionDict[SortedArch] = \\r
412 NewSectionDict[SortedArch] + SpecialItemList\r
413 Content += GenSection('Defines', NewSectionDict)\r
414\r
415 #\r
416 # generate [Includes] section\r
417 #\r
418 NewSectionDict = {}\r
419 IncludeArchList = Package.GetIncludeArchList()\r
f7496d71 420 if IncludeArchList:\r
4234283c
LG
421 for Path, ArchList in IncludeArchList:\r
422 Statement = Path\r
423 ArchList.sort()\r
424 SortedArch = ' '.join(ArchList)\r
425 if SortedArch in NewSectionDict:\r
426 NewSectionDict[SortedArch] = \\r
427 NewSectionDict[SortedArch] + [ConvertPath(Statement)]\r
428 else:\r
429 NewSectionDict[SortedArch] = [ConvertPath(Statement)]\r
430\r
421ccda3 431 Content += GenSection('Includes', NewSectionDict)\r
4234283c 432\r
421ccda3
HC
433 #\r
434 # generate [guids][protocols][ppis] sections\r
435 #\r
4234283c
LG
436 Content = GenGuidProtocolPpi(Package, Content)\r
437\r
438 #\r
439 # generate [LibraryClasses] section\r
440 #\r
441 NewSectionDict = {}\r
442 for LibraryClass in Package.GetLibraryClassList():\r
443 #\r
444 # Generate generic comment\r
445 #\r
446 HelpTextList = LibraryClass.GetHelpTextList()\r
447 HelpStr = _GetHelpStr(HelpTextList)\r
448 if HelpStr:\r
421ccda3
HC
449 HelpStr = '@libraryclass' + HelpStr\r
450 CommentStr = GenGenericCommentF(HelpStr, 2, False, True)\r
4234283c
LG
451\r
452 Statement = CommentStr\r
453 Name = LibraryClass.GetLibraryClass()\r
454 IncludeHeader = LibraryClass.GetIncludeHeader()\r
455 Statement += Name + '|' + ConvertPath(IncludeHeader)\r
456 #\r
457 # generate tail comment\r
458 #\r
459 if LibraryClass.GetSupModuleList():\r
460 Statement += \\r
461 GenDecTailComment(LibraryClass.GetSupModuleList())\r
0d1f5b2b 462 ArchList = sorted(LibraryClass.GetSupArchList())\r
4234283c
LG
463 SortedArch = ' '.join(ArchList)\r
464 if SortedArch in NewSectionDict:\r
465 NewSectionDict[SortedArch] = \\r
466 NewSectionDict[SortedArch] + [Statement]\r
467 else:\r
f7496d71 468 NewSectionDict[SortedArch] = [Statement]\r
4234283c 469\r
421ccda3 470 Content += GenSection('LibraryClasses', NewSectionDict, True, True)\r
4234283c 471\r
421ccda3
HC
472 #\r
473 # Generate '# [Error.<TokenSpcCName>]' section\r
474 #\r
475 Content = GenPcdErrorMsgSection(Package, Content)\r
f7496d71 476\r
421ccda3
HC
477 Content = GenPcd(Package, Content)\r
478\r
4234283c
LG
479 #\r
480 # generate [UserExtensions] section\r
481 #\r
482 NewSectionDict = {}\r
483 for UserExtension in Package.GetUserExtensionList():\r
421ccda3
HC
484 if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID and \\r
485 UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
486 continue\r
645a5128
HC
487\r
488 # Generate Private Section first\r
489 if UserExtension.GetUserID() == DT.TAB_INTEL and UserExtension.GetIdentifier() == DT.TAB_PRIVATE:\r
490 Content += '\n' + UserExtension.GetStatement()\r
491 continue\r
492\r
4234283c
LG
493 Statement = UserExtension.GetStatement()\r
494 if not Statement:\r
495 continue\r
421ccda3
HC
496 else:\r
497 LineList = Statement.split('\n')\r
498 NewStatement = ""\r
499 for Line in LineList:\r
500 NewStatement += " %s\n" % Line\r
f7496d71 501\r
4234283c
LG
502 SectionList = []\r
503 SectionName = 'UserExtensions'\r
504 UserId = UserExtension.GetUserID()\r
505 if UserId:\r
506 if '.' in UserId:\r
507 UserId = '"' + UserId + '"'\r
508 SectionName += '.' + UserId\r
509 if UserExtension.GetIdentifier():\r
510 SectionName += '.' + '"' + UserExtension.GetIdentifier() + '"'\r
511 if not UserExtension.GetSupArchList():\r
512 SectionList.append(SectionName)\r
513 else:\r
514 for Arch in UserExtension.GetSupArchList():\r
515 SectionList.append(SectionName + '.' + Arch)\r
516 SectionName = ', '.join(SectionList)\r
517 SectionName = ''.join(['[', SectionName, ']\n'])\r
421ccda3 518 Content += '\n' + SectionName + NewStatement\r
4234283c
LG
519\r
520 SaveFileOnChange(ContainerFile, Content, False)\r
421ccda3
HC
521 if DistHeader.ReadOnly:\r
522 os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)\r
523 else:\r
524 os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)\r
4234283c
LG
525 return ContainerFile\r
526\r
421ccda3
HC
527## GenPackageUNIEncodeFile\r
528# GenPackageUNIEncodeFile, default is a UCS-2LE encode file\r
529#\r
530def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCODING_UTF16LE):\r
531 GenUNIFlag = False\r
532 OnlyLANGUAGE_EN_X = True\r
533 BinaryAbstract = []\r
534 BinaryDescription = []\r
535 #\r
f7496d71 536 # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE,\r
421ccda3
HC
537 # then the PACKAGE_UNI_FILE must be created.\r
538 #\r
539 for (Key, Value) in PackageObject.GetAbstract() + PackageObject.GetDescription():\r
540 if Key == TAB_LANGUAGE_EN_X:\r
541 GenUNIFlag = True\r
542 else:\r
543 OnlyLANGUAGE_EN_X = False\r
f7496d71 544\r
421ccda3
HC
545 for UserExtension in PackageObject.GetUserExtensionList():\r
546 if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
547 and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
548 for (Key, Value) in UserExtension.GetBinaryAbstract():\r
549 if Key == TAB_LANGUAGE_EN_X:\r
550 GenUNIFlag = True\r
551 else:\r
552 OnlyLANGUAGE_EN_X = False\r
553 BinaryAbstract.append((Key, Value))\r
554\r
555 for (Key, Value) in UserExtension.GetBinaryDescription():\r
556 if Key == TAB_LANGUAGE_EN_X:\r
557 GenUNIFlag = True\r
558 else:\r
559 OnlyLANGUAGE_EN_X = False\r
560 BinaryDescription.append((Key, Value))\r
561\r
562 for Pcd in PackageObject.GetPcdList():\r
563 for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList():\r
564 if TxtObj.GetLang() == TAB_LANGUAGE_EN_X:\r
565 GenUNIFlag = True\r
566 else:\r
567 OnlyLANGUAGE_EN_X = False\r
f7496d71 568\r
421ccda3
HC
569 for PcdError in Pcd.GetPcdErrorsList():\r
570 if PcdError.GetErrorNumber().startswith('0x') or PcdError.GetErrorNumber().startswith('0X'):\r
571 for (Key, Value) in PcdError.GetErrorMessageList():\r
572 if Key == TAB_LANGUAGE_EN_X:\r
573 GenUNIFlag = True\r
574 else:\r
575 OnlyLANGUAGE_EN_X = False\r
576 if not GenUNIFlag:\r
577 return\r
578 elif OnlyLANGUAGE_EN_X:\r
579 return\r
580 else:\r
581 PackageObject.UNIFlag = True\r
f7496d71 582\r
421ccda3
HC
583 if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())):\r
584 os.makedirs(os.path.dirname(PackageObject.GetFullPath()))\r
f7496d71 585\r
06eb3540
HC
586 ContainerFile = GetUniFileName(os.path.dirname(PackageObject.GetFullPath()), PackageObject.GetBaseName())\r
587\r
1ccc4d89
LG
588 Content = UniFileHeader + '\r\n'\r
589 Content += '\r\n'\r
f7496d71 590\r
1ccc4d89 591 Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) + '\r\n'\r
f7496d71 592\r
421ccda3 593 Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \\r
1ccc4d89 594 + '\r\n'\r
f7496d71 595\r
1ccc4d89 596 Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) + '\r\n'\r
f7496d71 597\r
1ccc4d89 598 Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) + '\r\n'\r
f7496d71 599\r
421ccda3 600 PromptGenList = []\r
f7496d71 601 HelpTextGenList = []\r
421ccda3
HC
602 for Pcd in PackageObject.GetPcdList():\r
603 # Generate Prompt for each Pcd\r
604 PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_PROMPT '\r
605 TokenValueList = []\r
606 for TxtObj in Pcd.GetPromptList():\r
607 Lang = TxtObj.GetLang()\r
608 PromptStr = TxtObj.GetString()\r
609 #\r
f7496d71 610 # Avoid generating the same PROMPT entry more than one time.\r
421ccda3
HC
611 #\r
612 if (PcdPromptStrName, Lang) not in PromptGenList:\r
613 TokenValueList.append((Lang, PromptStr))\r
614 PromptGenList.append((PcdPromptStrName, Lang))\r
1ccc4d89 615 PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + '\r\n'\r
421ccda3
HC
616 if PromptString not in Content:\r
617 Content += PromptString\r
f7496d71 618\r
421ccda3
HC
619 # Generate Help String for each Pcd\r
620 PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_HELP '\r
621 TokenValueList = []\r
622 for TxtObj in Pcd.GetHelpTextList():\r
623 Lang = TxtObj.GetLang()\r
624 HelpStr = TxtObj.GetString()\r
625 #\r
f7496d71 626 # Avoid generating the same HELP entry more than one time.\r
421ccda3
HC
627 #\r
628 if (PcdHelpStrName, Lang) not in HelpTextGenList:\r
629 TokenValueList.append((Lang, HelpStr))\r
630 HelpTextGenList.append((PcdHelpStrName, Lang))\r
1ccc4d89 631 HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + '\r\n'\r
421ccda3
HC
632 if HelpTextString not in Content:\r
633 Content += HelpTextString\r
f7496d71 634\r
421ccda3
HC
635 # Generate PcdError for each Pcd if ErrorNo exist.\r
636 for PcdError in Pcd.GetPcdErrorsList():\r
637 ErrorNo = PcdError.GetErrorNumber()\r
638 if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith(TAB_CAPHEX_START):\r
639 PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \\r
640 + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \\r
641 + TAB_UNDERLINE_SPLIT + ErrorNo[2:]\r
1ccc4d89 642 PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + '\r\n'\r
421ccda3
HC
643 if PcdErrString not in Content:\r
644 Content += PcdErrString\r
f7496d71 645\r
421ccda3
HC
646 File = codecs.open(ContainerFile, 'w', Encoding)\r
647 File.write(u'\uFEFF' + Content)\r
648 File.stream.close()\r
fcb1af1b 649 Md5Sigature = md5(__FileHookOpen__(str(ContainerFile), 'rb').read())\r
421ccda3
HC
650 Md5Sum = Md5Sigature.hexdigest()\r
651 if (ContainerFile, Md5Sum) not in PackageObject.FileList:\r
652 PackageObject.FileList.append((ContainerFile, Md5Sum))\r
653\r
654 return ContainerFile\r
f7496d71 655\r
4234283c
LG
656## GenPcdErrComment\r
657#\r
658# @param PcdErrObject: PcdErrorObject\r
f7496d71 659#\r
4234283c 660# @retval CommentStr: Generated comment lines, with prefix "#"\r
f7496d71 661#\r
4234283c 662def GenPcdErrComment (PcdErrObject):\r
f7496d71 663 CommentStr = ''\r
421ccda3 664 ErrorCode = PcdErrObject.GetErrorNumber()\r
4234283c
LG
665 ValidValueRange = PcdErrObject.GetValidValueRange()\r
666 if ValidValueRange:\r
f7496d71 667 CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDRANGE + TAB_SPACE_SPLIT\r
421ccda3
HC
668 if ErrorCode:\r
669 CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
670 CommentStr += ValidValueRange + END_OF_LINE\r
f7496d71 671\r
4234283c
LG
672 ValidValue = PcdErrObject.GetValidValue()\r
673 if ValidValue:\r
674 ValidValueList = \\r
675 [Value for Value in ValidValue.split(TAB_SPACE_SPLIT) if Value]\r
421ccda3
HC
676 CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDLIST + TAB_SPACE_SPLIT\r
677 if ErrorCode:\r
678 CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
679 CommentStr += TAB_COMMA_SPLIT.join(ValidValueList) + END_OF_LINE\r
f7496d71 680\r
4234283c
LG
681 Expression = PcdErrObject.GetExpression()\r
682 if Expression:\r
421ccda3
HC
683 CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_EXPRESSION + TAB_SPACE_SPLIT\r
684 if ErrorCode:\r
685 CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
686 CommentStr += Expression + END_OF_LINE\r
f7496d71 687\r
4234283c
LG
688 return CommentStr\r
689\r