3 # This file contained the logical of transfer package object to DEC files.
5 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
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
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.
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 from Library
.UniClassObject
import FormatUniEntry
68 def GenPcd(Package
, Content
):
70 # generate [Pcd] section
71 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
74 for Pcd
in Package
.GetPcdList():
76 # Generate generic comment
78 HelpTextList
= Pcd
.GetHelpTextList()
79 HelpStr
= _GetHelpStr(HelpTextList
)
80 CommentStr
= GenGenericCommentF(HelpStr
, 2)
82 PromptList
= Pcd
.GetPromptList()
83 PromptStr
= _GetHelpStr(PromptList
)
84 CommentStr
+= GenGenericCommentF(PromptStr
.strip(), 1, True)
86 PcdErrList
= Pcd
.GetPcdErrorsList()
87 for PcdErr
in PcdErrList
:
88 CommentStr
+= GenPcdErrComment(PcdErr
)
89 Statement
= CommentStr
91 CName
= Pcd
.GetCName()
92 TokenSpaceGuidCName
= Pcd
.GetTokenSpaceGuidCName()
93 DefaultValue
= Pcd
.GetDefaultValue()
94 DatumType
= Pcd
.GetDatumType()
95 Token
= Pcd
.GetToken()
96 ValidUsage
= Pcd
.GetValidUsage()
98 if ValidUsage
== 'FeaturePcd':
99 ValidUsage
= 'PcdsFeatureFlag'
100 elif ValidUsage
== 'PatchPcd':
101 ValidUsage
= 'PcdsPatchableInModule'
102 elif ValidUsage
== 'FixedPcd':
103 ValidUsage
= 'PcdsFixedAtBuild'
104 elif ValidUsage
== 'Pcd':
105 ValidUsage
= 'PcdsDynamic'
106 elif ValidUsage
== 'PcdEx':
107 ValidUsage
= 'PcdsDynamicEx'
109 if ValidUsage
in ValidUsageDict
:
110 NewSectionDict
= ValidUsageDict
[ValidUsage
]
113 ValidUsageDict
[ValidUsage
] = NewSectionDict
114 Statement
+= TokenSpaceGuidCName
+ '.' + CName
115 Statement
+= '|' + DefaultValue
116 Statement
+= '|' + DatumType
117 Statement
+= '|' + Token
119 # generate tail comment
121 if Pcd
.GetSupModuleList():
122 Statement
+= GenDecTailComment(Pcd
.GetSupModuleList())
124 ArchList
= Pcd
.GetSupArchList()
126 SortedArch
= ' '.join(ArchList
)
127 if SortedArch
in NewSectionDict
:
128 NewSectionDict
[SortedArch
] = \
129 NewSectionDict
[SortedArch
] + [Statement
]
131 NewSectionDict
[SortedArch
] = [Statement
]
133 for ValidUsage
in ValidUsageDict
:
134 Content
+= GenSection(ValidUsage
, ValidUsageDict
[ValidUsage
], True, True)
138 def GenPcdErrorMsgSection(Package
, Content
):
139 if not Package
.PcdErrorCommentDict
:
143 # Generate '# [Error.<TokenSpcCName>]' section
145 Content
+= END_OF_LINE
+ END_OF_LINE
146 SectionComment
= TAB_COMMENT_SPLIT
+ END_OF_LINE
147 SectionComment
+= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_ERROR_SECTION_COMMENT
+ END_OF_LINE
148 SectionComment
+= TAB_COMMENT_SPLIT
+ END_OF_LINE
149 TokenSpcCNameList
= []
152 # Get TokenSpcCName list in PcdErrorCommentDict in Package object
154 for (TokenSpcCName
, ErrorNumber
) in Package
.PcdErrorCommentDict
:
155 if TokenSpcCName
not in TokenSpcCNameList
:
156 TokenSpcCNameList
.append(TokenSpcCName
)
158 for TokenSpcCNameItem
in TokenSpcCNameList
:
159 SectionName
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_SECTION_START
+ TAB_PCD_ERROR
+ \
160 TAB_SPLIT
+ TokenSpcCNameItem
+ TAB_SECTION_END
+ END_OF_LINE
161 Content
+= SectionComment
162 Content
+= SectionName
163 for (TokenSpcCName
, ErrorNumber
) in Package
.PcdErrorCommentDict
:
164 if TokenSpcCNameItem
== TokenSpcCName
:
165 PcdErrorMsg
= GetLocalValue(Package
.PcdErrorCommentDict
[(TokenSpcCName
, ErrorNumber
)])
166 SectionItem
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_SPACE_SPLIT
+ \
167 ErrorNumber
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
+ \
168 PcdErrorMsg
+ END_OF_LINE
169 Content
+= SectionItem
171 Content
+= TAB_COMMENT_SPLIT
174 def GenGuidProtocolPpi(Package
, Content
):
176 # generate [Guids] section
181 # Get the line offset need
182 # If the real one < the min one, use the min one
183 # else use the real one
184 for Guid
in Package
.GetGuidList():
185 if len(Guid
.GetCName()) > LeftOffset
:
186 LeftOffset
= len(Guid
.GetCName())
189 for Guid
in Package
.GetGuidList():
191 # Generate generic comment
193 HelpTextList
= Guid
.GetHelpTextList()
194 HelpStr
= _GetHelpStr(HelpTextList
)
195 CommentStr
= GenGenericCommentF(HelpStr
, 2)
197 Statement
= CommentStr
198 CName
= Guid
.GetCName()
199 Value
= GuidStringToGuidStructureString(Guid
.GetGuid())
200 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
202 # generate tail comment
204 if Guid
.GetSupModuleList():
205 Statement
+= GenDecTailComment(Guid
.GetSupModuleList())
206 ArchList
= Guid
.GetSupArchList()
208 SortedArch
= ' '.join(ArchList
)
209 if SortedArch
in NewSectionDict
:
210 NewSectionDict
[SortedArch
] = \
211 NewSectionDict
[SortedArch
] + [Statement
]
213 NewSectionDict
[SortedArch
] = [Statement
]
215 Content
+= GenSection('Guids', NewSectionDict
, True, True)
218 # generate [Protocols] section
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())
229 for Protocol
in Package
.GetProtocolList():
231 # Generate generic comment
233 HelpTextList
= Protocol
.GetHelpTextList()
234 HelpStr
= _GetHelpStr(HelpTextList
)
235 CommentStr
= GenGenericCommentF(HelpStr
, 2)
237 Statement
= CommentStr
238 CName
= Protocol
.GetCName()
239 Value
= GuidStringToGuidStructureString(Protocol
.GetGuid())
240 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
243 # generate tail comment
245 if Protocol
.GetSupModuleList():
246 Statement
+= GenDecTailComment(Protocol
.GetSupModuleList())
247 ArchList
= Protocol
.GetSupArchList()
249 SortedArch
= ' '.join(ArchList
)
250 if SortedArch
in NewSectionDict
:
251 NewSectionDict
[SortedArch
] = \
252 NewSectionDict
[SortedArch
] + [Statement
]
254 NewSectionDict
[SortedArch
] = [Statement
]
256 Content
+= GenSection('Protocols', NewSectionDict
, True, True)
259 # generate [Ppis] section
263 # Get the line offset need
264 # If the real one < the min one, use the min one
265 # else use the real one
266 for Ppi
in Package
.GetPpiList():
267 if len(Ppi
.GetCName()) > LeftOffset
:
268 LeftOffset
= len(Ppi
.GetCName())
270 for Ppi
in Package
.GetPpiList():
272 # Generate generic comment
274 HelpTextList
= Ppi
.GetHelpTextList()
275 HelpStr
= _GetHelpStr(HelpTextList
)
276 CommentStr
= GenGenericCommentF(HelpStr
, 2)
278 Statement
= CommentStr
279 CName
= Ppi
.GetCName()
280 Value
= GuidStringToGuidStructureString(Ppi
.GetGuid())
281 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
284 # generate tail comment
286 if Ppi
.GetSupModuleList():
287 Statement
+= GenDecTailComment(Ppi
.GetSupModuleList())
288 ArchList
= Ppi
.GetSupArchList()
290 SortedArch
= ' '.join(ArchList
)
291 if SortedArch
in NewSectionDict
:
292 NewSectionDict
[SortedArch
] = \
293 NewSectionDict
[SortedArch
] + [Statement
]
295 NewSectionDict
[SortedArch
] = [Statement
]
297 Content
+= GenSection('Ppis', NewSectionDict
, True, True)
301 ## Transfer Package Object to Dec files
303 # Transfer all contents of a standard Package Object to a Dec file
305 # @param Package: A Package
307 def PackageToDec(Package
, DistHeader
= None):
309 # Init global information for the file
311 ContainerFile
= Package
.GetFullPath()
316 # Generate file header
318 PackageAbstract
= GetLocalValue(Package
.GetAbstract())
319 PackageDescription
= GetLocalValue(Package
.GetDescription())
320 PackageCopyright
= ''
322 for (Lang
, Copyright
) in Package
.GetCopyright():
325 PackageCopyright
= Copyright
326 for (Lang
, License
) in Package
.GetLicense():
329 PackageLicense
= License
330 if not PackageAbstract
and DistHeader
:
331 PackageAbstract
= GetLocalValue(DistHeader
.GetAbstract())
332 if not PackageDescription
and DistHeader
:
333 PackageDescription
= GetLocalValue(DistHeader
.GetDescription())
334 if not PackageCopyright
and DistHeader
:
335 for (Lang
, Copyright
) in DistHeader
.GetCopyright():
336 PackageCopyright
= Copyright
337 if not PackageLicense
and DistHeader
:
338 for (Lang
, License
) in DistHeader
.GetLicense():
339 PackageLicense
= License
342 # Generate header comment section of DEC file
344 Content
+= GenHeaderCommentSection(PackageAbstract
, \
345 PackageDescription
, \
350 # Generate Binary header
352 for UserExtension
in Package
.GetUserExtensionList():
353 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID \
354 and UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
355 PackageBinaryAbstract
= GetLocalValue(UserExtension
.GetBinaryAbstract())
356 PackageBinaryDescription
= GetLocalValue(UserExtension
.GetBinaryDescription())
357 PackageBinaryCopyright
= ''
358 PackageBinaryLicense
= ''
359 for (Lang
, Copyright
) in UserExtension
.GetBinaryCopyright():
360 PackageBinaryCopyright
= Copyright
361 for (Lang
, License
) in UserExtension
.GetBinaryLicense():
362 PackageBinaryLicense
= License
363 if PackageBinaryAbstract
and PackageBinaryDescription
and \
364 PackageBinaryCopyright
and PackageBinaryLicense
:
365 Content
+= GenHeaderCommentSection(PackageBinaryAbstract
,
366 PackageBinaryDescription
,
367 PackageBinaryCopyright
,
368 PackageBinaryLicense
,
372 # Generate PACKAGE_UNI_FILE for the Package
374 FileHeader
= GenHeaderCommentSection(PackageAbstract
, PackageDescription
, PackageCopyright
, PackageLicense
, False, \
375 TAB_COMMENT_EDK1_SPLIT
)
376 GenPackageUNIEncodeFile(Package
, FileHeader
)
379 # for each section, maintain a dict, sorted arch will be its key,
380 #statement list will be its data
381 # { 'Arch1 Arch2 Arch3': [statement1, statement2],
382 # 'Arch1' : [statement1, statement3]
387 # generate [Defines] section
390 NewSectionDict
= {TAB_ARCH_COMMON
: []}
393 Statement
= (u
'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION
).ljust(LeftOffset
) + u
'= %s' % '0x00010017'
394 SpecialItemList
.append(Statement
)
396 BaseName
= Package
.GetBaseName()
397 if BaseName
.startswith('.') or BaseName
.startswith('-'):
398 BaseName
= '_' + BaseName
399 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_NAME
).ljust(LeftOffset
) + u
'= %s' % BaseName
400 SpecialItemList
.append(Statement
)
402 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION
).ljust(LeftOffset
) + u
'= %s' % Package
.GetVersion()
403 SpecialItemList
.append(Statement
)
405 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID
).ljust(LeftOffset
) + u
'= %s' % Package
.GetGuid()
406 SpecialItemList
.append(Statement
)
409 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE
).ljust(LeftOffset
) + u
'= %s' % Package
.GetBaseName() + '.uni'
410 SpecialItemList
.append(Statement
)
412 for SortedArch
in NewSectionDict
:
413 NewSectionDict
[SortedArch
] = \
414 NewSectionDict
[SortedArch
] + SpecialItemList
415 Content
+= GenSection('Defines', NewSectionDict
)
418 # generate [Includes] section
421 IncludeArchList
= Package
.GetIncludeArchList()
423 for Path
, ArchList
in IncludeArchList
:
426 SortedArch
= ' '.join(ArchList
)
427 if SortedArch
in NewSectionDict
:
428 NewSectionDict
[SortedArch
] = \
429 NewSectionDict
[SortedArch
] + [ConvertPath(Statement
)]
431 NewSectionDict
[SortedArch
] = [ConvertPath(Statement
)]
433 Content
+= GenSection('Includes', NewSectionDict
)
436 # generate [guids][protocols][ppis] sections
438 Content
= GenGuidProtocolPpi(Package
, Content
)
441 # generate [LibraryClasses] section
444 for LibraryClass
in Package
.GetLibraryClassList():
446 # Generate generic comment
448 HelpTextList
= LibraryClass
.GetHelpTextList()
449 HelpStr
= _GetHelpStr(HelpTextList
)
451 HelpStr
= '@libraryclass' + HelpStr
452 CommentStr
= GenGenericCommentF(HelpStr
, 2, False, True)
454 Statement
= CommentStr
455 Name
= LibraryClass
.GetLibraryClass()
456 IncludeHeader
= LibraryClass
.GetIncludeHeader()
457 Statement
+= Name
+ '|' + ConvertPath(IncludeHeader
)
459 # generate tail comment
461 if LibraryClass
.GetSupModuleList():
463 GenDecTailComment(LibraryClass
.GetSupModuleList())
464 ArchList
= LibraryClass
.GetSupArchList()
466 SortedArch
= ' '.join(ArchList
)
467 if SortedArch
in NewSectionDict
:
468 NewSectionDict
[SortedArch
] = \
469 NewSectionDict
[SortedArch
] + [Statement
]
471 NewSectionDict
[SortedArch
] = [Statement
]
473 Content
+= GenSection('LibraryClasses', NewSectionDict
, True, True)
476 # Generate '# [Error.<TokenSpcCName>]' section
478 Content
= GenPcdErrorMsgSection(Package
, Content
)
480 Content
= GenPcd(Package
, Content
)
483 # generate [UserExtensions] section
486 for UserExtension
in Package
.GetUserExtensionList():
487 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID
and \
488 UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
490 Statement
= UserExtension
.GetStatement()
494 LineList
= Statement
.split('\n')
496 for Line
in LineList
:
497 NewStatement
+= " %s\n" % Line
500 SectionName
= 'UserExtensions'
501 UserId
= UserExtension
.GetUserID()
504 UserId
= '"' + UserId
+ '"'
505 SectionName
+= '.' + UserId
506 if UserExtension
.GetIdentifier():
507 SectionName
+= '.' + '"' + UserExtension
.GetIdentifier() + '"'
508 if not UserExtension
.GetSupArchList():
509 SectionList
.append(SectionName
)
511 for Arch
in UserExtension
.GetSupArchList():
512 SectionList
.append(SectionName
+ '.' + Arch
)
513 SectionName
= ', '.join(SectionList
)
514 SectionName
= ''.join(['[', SectionName
, ']\n'])
515 Content
+= '\n' + SectionName
+ NewStatement
517 SaveFileOnChange(ContainerFile
, Content
, False)
518 if DistHeader
.ReadOnly
:
519 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH
)
521 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH|stat
.S_IWUSR|stat
.S_IWGRP|stat
.S_IWOTH
)
524 ## GenPackageUNIEncodeFile
525 # GenPackageUNIEncodeFile, default is a UCS-2LE encode file
527 def GenPackageUNIEncodeFile(PackageObject
, UniFileHeader
= '', Encoding
=TAB_ENCODING_UTF16LE
):
529 OnlyLANGUAGE_EN_X
= True
531 BinaryDescription
= []
533 # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE,
534 # then the PACKAGE_UNI_FILE must be created.
536 for (Key
, Value
) in PackageObject
.GetAbstract() + PackageObject
.GetDescription():
537 if Key
== TAB_LANGUAGE_EN_X
:
540 OnlyLANGUAGE_EN_X
= False
542 for UserExtension
in PackageObject
.GetUserExtensionList():
543 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID \
544 and UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
545 for (Key
, Value
) in UserExtension
.GetBinaryAbstract():
546 if Key
== TAB_LANGUAGE_EN_X
:
549 OnlyLANGUAGE_EN_X
= False
550 BinaryAbstract
.append((Key
, Value
))
552 for (Key
, Value
) in UserExtension
.GetBinaryDescription():
553 if Key
== TAB_LANGUAGE_EN_X
:
556 OnlyLANGUAGE_EN_X
= False
557 BinaryDescription
.append((Key
, Value
))
559 for Pcd
in PackageObject
.GetPcdList():
560 for TxtObj
in Pcd
.GetPromptList() + Pcd
.GetHelpTextList():
561 if TxtObj
.GetLang() == TAB_LANGUAGE_EN_X
:
564 OnlyLANGUAGE_EN_X
= False
566 for PcdError
in Pcd
.GetPcdErrorsList():
567 if PcdError
.GetErrorNumber().startswith('0x') or PcdError
.GetErrorNumber().startswith('0X'):
568 for (Key
, Value
) in PcdError
.GetErrorMessageList():
569 if Key
== TAB_LANGUAGE_EN_X
:
572 OnlyLANGUAGE_EN_X
= False
575 elif OnlyLANGUAGE_EN_X
:
578 PackageObject
.UNIFlag
= True
580 if not os
.path
.exists(os
.path
.dirname(PackageObject
.GetFullPath())):
581 os
.makedirs(os
.path
.dirname(PackageObject
.GetFullPath()))
582 ContainerFile
= os
.path
.normpath(os
.path
.join(os
.path
.dirname(PackageObject
.GetFullPath()),
583 (PackageObject
.GetBaseName() + '.uni')))
585 Content
= UniFileHeader
+ '\r\n'
588 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT
, PackageObject
.GetAbstract(), ContainerFile
) + '\r\n'
590 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION
, PackageObject
.GetDescription(), ContainerFile
) \
593 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT
, BinaryAbstract
, ContainerFile
) + '\r\n'
595 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION
, BinaryDescription
, ContainerFile
) + '\r\n'
599 for Pcd
in PackageObject
.GetPcdList():
600 # Generate Prompt for each Pcd
601 PcdPromptStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_PROMPT '
603 for TxtObj
in Pcd
.GetPromptList():
604 Lang
= TxtObj
.GetLang()
605 PromptStr
= TxtObj
.GetString()
607 # Avoid generating the same PROMPT entry more than one time.
609 if (PcdPromptStrName
, Lang
) not in PromptGenList
:
610 TokenValueList
.append((Lang
, PromptStr
))
611 PromptGenList
.append((PcdPromptStrName
, Lang
))
612 PromptString
= FormatUniEntry(PcdPromptStrName
, TokenValueList
, ContainerFile
) + '\r\n'
613 if PromptString
not in Content
:
614 Content
+= PromptString
616 # Generate Help String for each Pcd
617 PcdHelpStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_HELP '
619 for TxtObj
in Pcd
.GetHelpTextList():
620 Lang
= TxtObj
.GetLang()
621 HelpStr
= TxtObj
.GetString()
623 # Avoid generating the same HELP entry more than one time.
625 if (PcdHelpStrName
, Lang
) not in HelpTextGenList
:
626 TokenValueList
.append((Lang
, HelpStr
))
627 HelpTextGenList
.append((PcdHelpStrName
, Lang
))
628 HelpTextString
= FormatUniEntry(PcdHelpStrName
, TokenValueList
, ContainerFile
) + '\r\n'
629 if HelpTextString
not in Content
:
630 Content
+= HelpTextString
632 # Generate PcdError for each Pcd if ErrorNo exist.
633 for PcdError
in Pcd
.GetPcdErrorsList():
634 ErrorNo
= PcdError
.GetErrorNumber()
635 if ErrorNo
.startswith(TAB_HEX_START
) or ErrorNo
.startswith(TAB_CAPHEX_START
):
636 PcdErrStrName
= '#string ' + TAB_STR_TOKENCNAME
+ TAB_UNDERLINE_SPLIT
+ Pcd
.GetTokenSpaceGuidCName() \
637 + TAB_UNDERLINE_SPLIT
+ TAB_STR_TOKENERR \
638 + TAB_UNDERLINE_SPLIT
+ ErrorNo
[2:]
639 PcdErrString
= FormatUniEntry(PcdErrStrName
, PcdError
.GetErrorMessageList(), ContainerFile
) + '\r\n'
640 if PcdErrString
not in Content
:
641 Content
+= PcdErrString
643 File
= codecs
.open(ContainerFile
, 'w', Encoding
)
644 File
.write(u
'\uFEFF' + Content
)
646 Md5Sigature
= md5
.new(__FileHookOpen__(str(ContainerFile
), 'rb').read())
647 Md5Sum
= Md5Sigature
.hexdigest()
648 if (ContainerFile
, Md5Sum
) not in PackageObject
.FileList
:
649 PackageObject
.FileList
.append((ContainerFile
, Md5Sum
))
655 # @param PcdErrObject: PcdErrorObject
657 # @retval CommentStr: Generated comment lines, with prefix "#"
659 def GenPcdErrComment (PcdErrObject
):
661 ErrorCode
= PcdErrObject
.GetErrorNumber()
662 ValidValueRange
= PcdErrObject
.GetValidValueRange()
664 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_VALIDRANGE
+ TAB_SPACE_SPLIT
666 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
667 CommentStr
+= ValidValueRange
+ END_OF_LINE
669 ValidValue
= PcdErrObject
.GetValidValue()
672 [Value
for Value
in ValidValue
.split(TAB_SPACE_SPLIT
) if Value
]
673 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_VALIDLIST
+ TAB_SPACE_SPLIT
675 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
676 CommentStr
+= TAB_COMMA_SPLIT
.join(ValidValueList
) + END_OF_LINE
678 Expression
= PcdErrObject
.GetExpression()
680 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_EXPRESSION
+ TAB_SPACE_SPLIT
682 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
683 CommentStr
+= Expression
+ END_OF_LINE