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