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