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