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