3 # This file contained the logical of transfer package object to DEC files.
5 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
7 # SPDX-License-Identifier: BSD-2-Clause-Patent
16 from hashlib
import md5
17 from Core
.FileHook
import __FileHookOpen__
18 from Library
.Parsing
import GenSection
19 from Library
.CommentGenerating
import GenHeaderCommentSection
20 from Library
.CommentGenerating
import GenGenericCommentF
21 from Library
.CommentGenerating
import GenDecTailComment
22 from Library
.CommentGenerating
import _GetHelpStr
23 from Library
.Misc
import GuidStringToGuidStructureString
24 from Library
.Misc
import SaveFileOnChange
25 from Library
.Misc
import ConvertPath
26 from Library
.Misc
import GetLocalValue
27 from Library
.DataType
import TAB_SPACE_SPLIT
28 from Library
.DataType
import TAB_COMMA_SPLIT
29 from Library
.DataType
import END_OF_LINE
30 from Library
.DataType
import TAB_ARCH_COMMON
31 from Library
.DataType
import TAB_VALUE_SPLIT
32 from Library
.DataType
import TAB_COMMENT_SPLIT
33 from Library
.DataType
import TAB_PCD_VALIDRANGE
34 from Library
.DataType
import TAB_PCD_VALIDLIST
35 from Library
.DataType
import TAB_PCD_EXPRESSION
36 from Library
.DataType
import TAB_DEC_DEFINES_DEC_SPECIFICATION
37 from Library
.DataType
import TAB_DEC_DEFINES_PACKAGE_NAME
38 from Library
.DataType
import TAB_DEC_DEFINES_PACKAGE_GUID
39 from Library
.DataType
import TAB_DEC_DEFINES_PACKAGE_VERSION
40 from Library
.DataType
import TAB_DEC_DEFINES_PKG_UNI_FILE
41 from Library
.DataType
import TAB_DEC_PACKAGE_ABSTRACT
42 from Library
.DataType
import TAB_DEC_PACKAGE_DESCRIPTION
43 from Library
.DataType
import TAB_DEC_BINARY_ABSTRACT
44 from Library
.DataType
import TAB_DEC_BINARY_DESCRIPTION
45 from Library
.DataType
import TAB_LANGUAGE_EN_X
46 from Library
.DataType
import TAB_BINARY_HEADER_USERID
47 from Library
.DataType
import TAB_BINARY_HEADER_IDENTIFIER
48 from Library
.DataType
import TAB_COMMENT_EDK1_SPLIT
49 from Library
.DataType
import TAB_ENCODING_UTF16LE
50 from Library
.DataType
import TAB_CAPHEX_START
51 from Library
.DataType
import TAB_HEX_START
52 from Library
.DataType
import TAB_UNDERLINE_SPLIT
53 from Library
.DataType
import TAB_STR_TOKENERR
54 from Library
.DataType
import TAB_STR_TOKENCNAME
55 from Library
.DataType
import TAB_PCD_ERROR_SECTION_COMMENT
56 from Library
.DataType
import TAB_PCD_ERROR
57 from Library
.DataType
import TAB_SECTION_START
58 from Library
.DataType
import TAB_SECTION_END
59 from Library
.DataType
import TAB_SPLIT
60 import Library
.DataType
as DT
61 from Library
.UniClassObject
import FormatUniEntry
62 from Library
.StringUtils
import GetUniFileName
64 def GenPcd(Package
, Content
):
66 # generate [Pcd] section
67 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
70 for Pcd
in Package
.GetPcdList():
72 # Generate generic comment
74 HelpTextList
= Pcd
.GetHelpTextList()
75 HelpStr
= _GetHelpStr(HelpTextList
)
76 CommentStr
= GenGenericCommentF(HelpStr
, 2)
78 PromptList
= Pcd
.GetPromptList()
79 PromptStr
= _GetHelpStr(PromptList
)
80 CommentStr
+= GenGenericCommentF(PromptStr
.strip(), 1, True)
82 PcdErrList
= Pcd
.GetPcdErrorsList()
83 for PcdErr
in PcdErrList
:
84 CommentStr
+= GenPcdErrComment(PcdErr
)
85 Statement
= CommentStr
87 CName
= Pcd
.GetCName()
88 TokenSpaceGuidCName
= Pcd
.GetTokenSpaceGuidCName()
89 DefaultValue
= Pcd
.GetDefaultValue()
90 DatumType
= Pcd
.GetDatumType()
91 Token
= Pcd
.GetToken()
92 ValidUsage
= Pcd
.GetValidUsage()
94 if ValidUsage
== 'FeaturePcd':
95 ValidUsage
= 'PcdsFeatureFlag'
96 elif ValidUsage
== 'PatchPcd':
97 ValidUsage
= 'PcdsPatchableInModule'
98 elif ValidUsage
== 'FixedPcd':
99 ValidUsage
= 'PcdsFixedAtBuild'
100 elif ValidUsage
== 'Pcd':
101 ValidUsage
= 'PcdsDynamic'
102 elif ValidUsage
== 'PcdEx':
103 ValidUsage
= 'PcdsDynamicEx'
105 if ValidUsage
in ValidUsageDict
:
106 NewSectionDict
= ValidUsageDict
[ValidUsage
]
109 ValidUsageDict
[ValidUsage
] = NewSectionDict
110 Statement
+= TokenSpaceGuidCName
+ '.' + CName
111 Statement
+= '|' + DefaultValue
112 Statement
+= '|' + DatumType
113 Statement
+= '|' + Token
115 # generate tail comment
117 if Pcd
.GetSupModuleList():
118 Statement
+= GenDecTailComment(Pcd
.GetSupModuleList())
120 ArchList
= sorted(Pcd
.GetSupArchList())
121 SortedArch
= ' '.join(ArchList
)
122 if SortedArch
in NewSectionDict
:
123 NewSectionDict
[SortedArch
] = \
124 NewSectionDict
[SortedArch
] + [Statement
]
126 NewSectionDict
[SortedArch
] = [Statement
]
128 for ValidUsage
in ValidUsageDict
:
129 Content
+= GenSection(ValidUsage
, ValidUsageDict
[ValidUsage
], True, True)
133 def GenPcdErrorMsgSection(Package
, Content
):
134 if not Package
.PcdErrorCommentDict
:
138 # Generate '# [Error.<TokenSpcCName>]' section
140 Content
+= END_OF_LINE
+ END_OF_LINE
141 SectionComment
= TAB_COMMENT_SPLIT
+ END_OF_LINE
142 SectionComment
+= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_ERROR_SECTION_COMMENT
+ END_OF_LINE
143 SectionComment
+= TAB_COMMENT_SPLIT
+ END_OF_LINE
144 TokenSpcCNameList
= []
147 # Get TokenSpcCName list in PcdErrorCommentDict in Package object
149 for (TokenSpcCName
, ErrorNumber
) in Package
.PcdErrorCommentDict
:
150 if TokenSpcCName
not in TokenSpcCNameList
:
151 TokenSpcCNameList
.append(TokenSpcCName
)
153 for TokenSpcCNameItem
in TokenSpcCNameList
:
154 SectionName
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_SECTION_START
+ TAB_PCD_ERROR
+ \
155 TAB_SPLIT
+ TokenSpcCNameItem
+ TAB_SECTION_END
+ END_OF_LINE
156 Content
+= SectionComment
157 Content
+= SectionName
158 for (TokenSpcCName
, ErrorNumber
) in Package
.PcdErrorCommentDict
:
159 if TokenSpcCNameItem
== TokenSpcCName
:
160 PcdErrorMsg
= GetLocalValue(Package
.PcdErrorCommentDict
[(TokenSpcCName
, ErrorNumber
)])
161 SectionItem
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_SPACE_SPLIT
+ \
162 ErrorNumber
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
+ \
163 PcdErrorMsg
+ END_OF_LINE
164 Content
+= SectionItem
166 Content
+= TAB_COMMENT_SPLIT
169 def GenGuidProtocolPpi(Package
, Content
):
171 # generate [Guids] section
176 # Get the line offset need
177 # If the real one < the min one, use the min one
178 # else use the real one
179 for Guid
in Package
.GetGuidList():
180 if len(Guid
.GetCName()) > LeftOffset
:
181 LeftOffset
= len(Guid
.GetCName())
184 for Guid
in Package
.GetGuidList():
186 # Generate generic comment
188 HelpTextList
= Guid
.GetHelpTextList()
189 HelpStr
= _GetHelpStr(HelpTextList
)
190 CommentStr
= GenGenericCommentF(HelpStr
, 2)
192 Statement
= CommentStr
193 CName
= Guid
.GetCName()
194 Value
= GuidStringToGuidStructureString(Guid
.GetGuid())
195 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
197 # generate tail comment
199 if Guid
.GetSupModuleList():
200 Statement
+= GenDecTailComment(Guid
.GetSupModuleList())
201 ArchList
= sorted(Guid
.GetSupArchList())
202 SortedArch
= ' '.join(ArchList
)
203 if SortedArch
in NewSectionDict
:
204 NewSectionDict
[SortedArch
] = \
205 NewSectionDict
[SortedArch
] + [Statement
]
207 NewSectionDict
[SortedArch
] = [Statement
]
209 Content
+= GenSection('Guids', NewSectionDict
, True, True)
212 # generate [Protocols] section
216 # Get the line offset need
217 # If the real one < the min one, use the min one
218 # else use the real one
219 for Protocol
in Package
.GetProtocolList():
220 if len(Protocol
.GetCName()) > LeftOffset
:
221 LeftOffset
= len(Protocol
.GetCName())
223 for Protocol
in Package
.GetProtocolList():
225 # Generate generic comment
227 HelpTextList
= Protocol
.GetHelpTextList()
228 HelpStr
= _GetHelpStr(HelpTextList
)
229 CommentStr
= GenGenericCommentF(HelpStr
, 2)
231 Statement
= CommentStr
232 CName
= Protocol
.GetCName()
233 Value
= GuidStringToGuidStructureString(Protocol
.GetGuid())
234 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
237 # generate tail comment
239 if Protocol
.GetSupModuleList():
240 Statement
+= GenDecTailComment(Protocol
.GetSupModuleList())
241 ArchList
= sorted(Protocol
.GetSupArchList())
242 SortedArch
= ' '.join(ArchList
)
243 if SortedArch
in NewSectionDict
:
244 NewSectionDict
[SortedArch
] = \
245 NewSectionDict
[SortedArch
] + [Statement
]
247 NewSectionDict
[SortedArch
] = [Statement
]
249 Content
+= GenSection('Protocols', NewSectionDict
, True, True)
252 # generate [Ppis] section
256 # Get the line offset need
257 # If the real one < the min one, use the min one
258 # else use the real one
259 for Ppi
in Package
.GetPpiList():
260 if len(Ppi
.GetCName()) > LeftOffset
:
261 LeftOffset
= len(Ppi
.GetCName())
263 for Ppi
in Package
.GetPpiList():
265 # Generate generic comment
267 HelpTextList
= Ppi
.GetHelpTextList()
268 HelpStr
= _GetHelpStr(HelpTextList
)
269 CommentStr
= GenGenericCommentF(HelpStr
, 2)
271 Statement
= CommentStr
272 CName
= Ppi
.GetCName()
273 Value
= GuidStringToGuidStructureString(Ppi
.GetGuid())
274 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
277 # generate tail comment
279 if Ppi
.GetSupModuleList():
280 Statement
+= GenDecTailComment(Ppi
.GetSupModuleList())
281 ArchList
= sorted(Ppi
.GetSupArchList())
282 SortedArch
= ' '.join(ArchList
)
283 if SortedArch
in NewSectionDict
:
284 NewSectionDict
[SortedArch
] = \
285 NewSectionDict
[SortedArch
] + [Statement
]
287 NewSectionDict
[SortedArch
] = [Statement
]
289 Content
+= GenSection('Ppis', NewSectionDict
, True, True)
293 ## Transfer Package Object to Dec files
295 # Transfer all contents of a standard Package Object to a Dec file
297 # @param Package: A Package
299 def PackageToDec(Package
, DistHeader
= None):
301 # Init global information for the file
303 ContainerFile
= Package
.GetFullPath()
308 # Generate file header
310 PackageAbstract
= GetLocalValue(Package
.GetAbstract())
311 PackageDescription
= GetLocalValue(Package
.GetDescription())
312 PackageCopyright
= ''
314 for (Lang
, Copyright
) in Package
.GetCopyright():
317 PackageCopyright
= Copyright
318 for (Lang
, License
) in Package
.GetLicense():
321 PackageLicense
= License
322 if not PackageAbstract
and DistHeader
:
323 PackageAbstract
= GetLocalValue(DistHeader
.GetAbstract())
324 if not PackageDescription
and DistHeader
:
325 PackageDescription
= GetLocalValue(DistHeader
.GetDescription())
326 if not PackageCopyright
and DistHeader
:
327 for (Lang
, Copyright
) in DistHeader
.GetCopyright():
328 PackageCopyright
= Copyright
329 if not PackageLicense
and DistHeader
:
330 for (Lang
, License
) in DistHeader
.GetLicense():
331 PackageLicense
= License
334 # Generate header comment section of DEC file
336 Content
+= GenHeaderCommentSection(PackageAbstract
, \
337 PackageDescription
, \
339 PackageLicense
).replace('\r\n', '\n')
342 # Generate Binary header
344 for UserExtension
in Package
.GetUserExtensionList():
345 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID \
346 and UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
347 PackageBinaryAbstract
= GetLocalValue(UserExtension
.GetBinaryAbstract())
348 PackageBinaryDescription
= GetLocalValue(UserExtension
.GetBinaryDescription())
349 PackageBinaryCopyright
= ''
350 PackageBinaryLicense
= ''
351 for (Lang
, Copyright
) in UserExtension
.GetBinaryCopyright():
352 PackageBinaryCopyright
= Copyright
353 for (Lang
, License
) in UserExtension
.GetBinaryLicense():
354 PackageBinaryLicense
= License
355 if PackageBinaryAbstract
and PackageBinaryDescription
and \
356 PackageBinaryCopyright
and PackageBinaryLicense
:
357 Content
+= GenHeaderCommentSection(PackageBinaryAbstract
,
358 PackageBinaryDescription
,
359 PackageBinaryCopyright
,
360 PackageBinaryLicense
,
364 # Generate PACKAGE_UNI_FILE for the Package
366 FileHeader
= GenHeaderCommentSection(PackageAbstract
, PackageDescription
, PackageCopyright
, PackageLicense
, False, \
367 TAB_COMMENT_EDK1_SPLIT
)
368 GenPackageUNIEncodeFile(Package
, FileHeader
)
371 # for each section, maintain a dict, sorted arch will be its key,
372 #statement list will be its data
373 # { 'Arch1 Arch2 Arch3': [statement1, statement2],
374 # 'Arch1' : [statement1, statement3]
379 # generate [Defines] section
382 NewSectionDict
= {TAB_ARCH_COMMON
: []}
385 Statement
= (u
'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION
).ljust(LeftOffset
) + u
'= %s' % '0x00010017'
386 SpecialItemList
.append(Statement
)
388 BaseName
= Package
.GetBaseName()
389 if BaseName
.startswith('.') or BaseName
.startswith('-'):
390 BaseName
= '_' + BaseName
391 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_NAME
).ljust(LeftOffset
) + u
'= %s' % BaseName
392 SpecialItemList
.append(Statement
)
394 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION
).ljust(LeftOffset
) + u
'= %s' % Package
.GetVersion()
395 SpecialItemList
.append(Statement
)
397 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID
).ljust(LeftOffset
) + u
'= %s' % Package
.GetGuid()
398 SpecialItemList
.append(Statement
)
401 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE
).ljust(LeftOffset
) + u
'= %s' % Package
.GetBaseName() + '.uni'
402 SpecialItemList
.append(Statement
)
404 for SortedArch
in NewSectionDict
:
405 NewSectionDict
[SortedArch
] = \
406 NewSectionDict
[SortedArch
] + SpecialItemList
407 Content
+= GenSection('Defines', NewSectionDict
)
410 # generate [Includes] section
413 IncludeArchList
= Package
.GetIncludeArchList()
415 for Path
, ArchList
in IncludeArchList
:
418 SortedArch
= ' '.join(ArchList
)
419 if SortedArch
in NewSectionDict
:
420 NewSectionDict
[SortedArch
] = \
421 NewSectionDict
[SortedArch
] + [ConvertPath(Statement
)]
423 NewSectionDict
[SortedArch
] = [ConvertPath(Statement
)]
425 Content
+= GenSection('Includes', NewSectionDict
)
428 # generate [guids][protocols][ppis] sections
430 Content
= GenGuidProtocolPpi(Package
, Content
)
433 # generate [LibraryClasses] section
436 for LibraryClass
in Package
.GetLibraryClassList():
438 # Generate generic comment
440 HelpTextList
= LibraryClass
.GetHelpTextList()
441 HelpStr
= _GetHelpStr(HelpTextList
)
443 HelpStr
= '@libraryclass' + HelpStr
444 CommentStr
= GenGenericCommentF(HelpStr
, 2, False, True)
446 Statement
= CommentStr
447 Name
= LibraryClass
.GetLibraryClass()
448 IncludeHeader
= LibraryClass
.GetIncludeHeader()
449 Statement
+= Name
+ '|' + ConvertPath(IncludeHeader
)
451 # generate tail comment
453 if LibraryClass
.GetSupModuleList():
455 GenDecTailComment(LibraryClass
.GetSupModuleList())
456 ArchList
= sorted(LibraryClass
.GetSupArchList())
457 SortedArch
= ' '.join(ArchList
)
458 if SortedArch
in NewSectionDict
:
459 NewSectionDict
[SortedArch
] = \
460 NewSectionDict
[SortedArch
] + [Statement
]
462 NewSectionDict
[SortedArch
] = [Statement
]
464 Content
+= GenSection('LibraryClasses', NewSectionDict
, True, True)
467 # Generate '# [Error.<TokenSpcCName>]' section
469 Content
= GenPcdErrorMsgSection(Package
, Content
)
471 Content
= GenPcd(Package
, Content
)
474 # generate [UserExtensions] section
477 for UserExtension
in Package
.GetUserExtensionList():
478 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID
and \
479 UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
482 # Generate Private Section first
483 if UserExtension
.GetUserID() == DT
.TAB_INTEL
and UserExtension
.GetIdentifier() == DT
.TAB_PRIVATE
:
484 Content
+= '\n' + UserExtension
.GetStatement()
487 Statement
= UserExtension
.GetStatement()
491 LineList
= Statement
.split('\n')
493 for Line
in LineList
:
494 NewStatement
+= " %s\n" % Line
497 SectionName
= 'UserExtensions'
498 UserId
= UserExtension
.GetUserID()
501 UserId
= '"' + UserId
+ '"'
502 SectionName
+= '.' + UserId
503 if UserExtension
.GetIdentifier():
504 SectionName
+= '.' + '"' + UserExtension
.GetIdentifier() + '"'
505 if not UserExtension
.GetSupArchList():
506 SectionList
.append(SectionName
)
508 for Arch
in UserExtension
.GetSupArchList():
509 SectionList
.append(SectionName
+ '.' + Arch
)
510 SectionName
= ', '.join(SectionList
)
511 SectionName
= ''.join(['[', SectionName
, ']\n'])
512 Content
+= '\n' + SectionName
+ NewStatement
514 SaveFileOnChange(ContainerFile
, Content
, False)
515 if DistHeader
.ReadOnly
:
516 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH
)
518 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH|stat
.S_IWUSR|stat
.S_IWGRP|stat
.S_IWOTH
)
521 ## GenPackageUNIEncodeFile
522 # GenPackageUNIEncodeFile, default is a UCS-2LE encode file
524 def GenPackageUNIEncodeFile(PackageObject
, UniFileHeader
= '', Encoding
=TAB_ENCODING_UTF16LE
):
526 OnlyLANGUAGE_EN_X
= True
528 BinaryDescription
= []
530 # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE,
531 # then the PACKAGE_UNI_FILE must be created.
533 for (Key
, Value
) in PackageObject
.GetAbstract() + PackageObject
.GetDescription():
534 if Key
== TAB_LANGUAGE_EN_X
:
537 OnlyLANGUAGE_EN_X
= False
539 for UserExtension
in PackageObject
.GetUserExtensionList():
540 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID \
541 and UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
542 for (Key
, Value
) in UserExtension
.GetBinaryAbstract():
543 if Key
== TAB_LANGUAGE_EN_X
:
546 OnlyLANGUAGE_EN_X
= False
547 BinaryAbstract
.append((Key
, Value
))
549 for (Key
, Value
) in UserExtension
.GetBinaryDescription():
550 if Key
== TAB_LANGUAGE_EN_X
:
553 OnlyLANGUAGE_EN_X
= False
554 BinaryDescription
.append((Key
, Value
))
556 for Pcd
in PackageObject
.GetPcdList():
557 for TxtObj
in Pcd
.GetPromptList() + Pcd
.GetHelpTextList():
558 if TxtObj
.GetLang() == TAB_LANGUAGE_EN_X
:
561 OnlyLANGUAGE_EN_X
= False
563 for PcdError
in Pcd
.GetPcdErrorsList():
564 if PcdError
.GetErrorNumber().startswith('0x') or PcdError
.GetErrorNumber().startswith('0X'):
565 for (Key
, Value
) in PcdError
.GetErrorMessageList():
566 if Key
== TAB_LANGUAGE_EN_X
:
569 OnlyLANGUAGE_EN_X
= False
572 elif OnlyLANGUAGE_EN_X
:
575 PackageObject
.UNIFlag
= True
577 if not os
.path
.exists(os
.path
.dirname(PackageObject
.GetFullPath())):
578 os
.makedirs(os
.path
.dirname(PackageObject
.GetFullPath()))
580 ContainerFile
= GetUniFileName(os
.path
.dirname(PackageObject
.GetFullPath()), PackageObject
.GetBaseName())
582 Content
= UniFileHeader
+ '\r\n'
585 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT
, PackageObject
.GetAbstract(), ContainerFile
) + '\r\n'
587 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION
, PackageObject
.GetDescription(), ContainerFile
) \
590 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT
, BinaryAbstract
, ContainerFile
) + '\r\n'
592 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION
, BinaryDescription
, ContainerFile
) + '\r\n'
596 for Pcd
in PackageObject
.GetPcdList():
597 # Generate Prompt for each Pcd
598 PcdPromptStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_PROMPT '
600 for TxtObj
in Pcd
.GetPromptList():
601 Lang
= TxtObj
.GetLang()
602 PromptStr
= TxtObj
.GetString()
604 # Avoid generating the same PROMPT entry more than one time.
606 if (PcdPromptStrName
, Lang
) not in PromptGenList
:
607 TokenValueList
.append((Lang
, PromptStr
))
608 PromptGenList
.append((PcdPromptStrName
, Lang
))
609 PromptString
= FormatUniEntry(PcdPromptStrName
, TokenValueList
, ContainerFile
) + '\r\n'
610 if PromptString
not in Content
:
611 Content
+= PromptString
613 # Generate Help String for each Pcd
614 PcdHelpStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_HELP '
616 for TxtObj
in Pcd
.GetHelpTextList():
617 Lang
= TxtObj
.GetLang()
618 HelpStr
= TxtObj
.GetString()
620 # Avoid generating the same HELP entry more than one time.
622 if (PcdHelpStrName
, Lang
) not in HelpTextGenList
:
623 TokenValueList
.append((Lang
, HelpStr
))
624 HelpTextGenList
.append((PcdHelpStrName
, Lang
))
625 HelpTextString
= FormatUniEntry(PcdHelpStrName
, TokenValueList
, ContainerFile
) + '\r\n'
626 if HelpTextString
not in Content
:
627 Content
+= HelpTextString
629 # Generate PcdError for each Pcd if ErrorNo exist.
630 for PcdError
in Pcd
.GetPcdErrorsList():
631 ErrorNo
= PcdError
.GetErrorNumber()
632 if ErrorNo
.startswith(TAB_HEX_START
) or ErrorNo
.startswith(TAB_CAPHEX_START
):
633 PcdErrStrName
= '#string ' + TAB_STR_TOKENCNAME
+ TAB_UNDERLINE_SPLIT
+ Pcd
.GetTokenSpaceGuidCName() \
634 + TAB_UNDERLINE_SPLIT
+ TAB_STR_TOKENERR \
635 + TAB_UNDERLINE_SPLIT
+ ErrorNo
[2:]
636 PcdErrString
= FormatUniEntry(PcdErrStrName
, PcdError
.GetErrorMessageList(), ContainerFile
) + '\r\n'
637 if PcdErrString
not in Content
:
638 Content
+= PcdErrString
640 File
= codecs
.open(ContainerFile
, 'w', Encoding
)
641 File
.write(u
'\uFEFF' + Content
)
643 Md5Signature
= md5(__FileHookOpen__(str(ContainerFile
), 'rb').read())
644 Md5Sum
= Md5Signature
.hexdigest()
645 if (ContainerFile
, Md5Sum
) not in PackageObject
.FileList
:
646 PackageObject
.FileList
.append((ContainerFile
, Md5Sum
))
652 # @param PcdErrObject: PcdErrorObject
654 # @retval CommentStr: Generated comment lines, with prefix "#"
656 def GenPcdErrComment (PcdErrObject
):
658 ErrorCode
= PcdErrObject
.GetErrorNumber()
659 ValidValueRange
= PcdErrObject
.GetValidValueRange()
661 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_VALIDRANGE
+ TAB_SPACE_SPLIT
663 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
664 CommentStr
+= ValidValueRange
+ END_OF_LINE
666 ValidValue
= PcdErrObject
.GetValidValue()
669 [Value
for Value
in ValidValue
.split(TAB_SPACE_SPLIT
) if Value
]
670 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_VALIDLIST
+ TAB_SPACE_SPLIT
672 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
673 CommentStr
+= TAB_COMMA_SPLIT
.join(ValidValueList
) + END_OF_LINE
675 Expression
= PcdErrObject
.GetExpression()
677 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_EXPRESSION
+ TAB_SPACE_SPLIT
679 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
680 CommentStr
+= Expression
+ END_OF_LINE