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