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 # 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.
22 from hashlib
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
70 def GenPcd(Package
, Content
):
72 # generate [Pcd] section
73 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
76 for Pcd
in Package
.GetPcdList():
78 # Generate generic comment
80 HelpTextList
= Pcd
.GetHelpTextList()
81 HelpStr
= _GetHelpStr(HelpTextList
)
82 CommentStr
= GenGenericCommentF(HelpStr
, 2)
84 PromptList
= Pcd
.GetPromptList()
85 PromptStr
= _GetHelpStr(PromptList
)
86 CommentStr
+= GenGenericCommentF(PromptStr
.strip(), 1, True)
88 PcdErrList
= Pcd
.GetPcdErrorsList()
89 for PcdErr
in PcdErrList
:
90 CommentStr
+= GenPcdErrComment(PcdErr
)
91 Statement
= CommentStr
93 CName
= Pcd
.GetCName()
94 TokenSpaceGuidCName
= Pcd
.GetTokenSpaceGuidCName()
95 DefaultValue
= Pcd
.GetDefaultValue()
96 DatumType
= Pcd
.GetDatumType()
97 Token
= Pcd
.GetToken()
98 ValidUsage
= Pcd
.GetValidUsage()
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'
111 if ValidUsage
in ValidUsageDict
:
112 NewSectionDict
= ValidUsageDict
[ValidUsage
]
115 ValidUsageDict
[ValidUsage
] = NewSectionDict
116 Statement
+= TokenSpaceGuidCName
+ '.' + CName
117 Statement
+= '|' + DefaultValue
118 Statement
+= '|' + DatumType
119 Statement
+= '|' + Token
121 # generate tail comment
123 if Pcd
.GetSupModuleList():
124 Statement
+= GenDecTailComment(Pcd
.GetSupModuleList())
126 ArchList
= sorted(Pcd
.GetSupArchList())
127 SortedArch
= ' '.join(ArchList
)
128 if SortedArch
in NewSectionDict
:
129 NewSectionDict
[SortedArch
] = \
130 NewSectionDict
[SortedArch
] + [Statement
]
132 NewSectionDict
[SortedArch
] = [Statement
]
134 for ValidUsage
in ValidUsageDict
:
135 Content
+= GenSection(ValidUsage
, ValidUsageDict
[ValidUsage
], True, True)
139 def GenPcdErrorMsgSection(Package
, Content
):
140 if not Package
.PcdErrorCommentDict
:
144 # Generate '# [Error.<TokenSpcCName>]' section
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
= []
153 # Get TokenSpcCName list in PcdErrorCommentDict in Package object
155 for (TokenSpcCName
, ErrorNumber
) in Package
.PcdErrorCommentDict
:
156 if TokenSpcCName
not in TokenSpcCNameList
:
157 TokenSpcCNameList
.append(TokenSpcCName
)
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
172 Content
+= TAB_COMMENT_SPLIT
175 def GenGuidProtocolPpi(Package
, Content
):
177 # generate [Guids] section
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())
190 for Guid
in Package
.GetGuidList():
192 # Generate generic comment
194 HelpTextList
= Guid
.GetHelpTextList()
195 HelpStr
= _GetHelpStr(HelpTextList
)
196 CommentStr
= GenGenericCommentF(HelpStr
, 2)
198 Statement
= CommentStr
199 CName
= Guid
.GetCName()
200 Value
= GuidStringToGuidStructureString(Guid
.GetGuid())
201 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
203 # generate tail comment
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
]
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
= sorted(Protocol
.GetSupArchList())
248 SortedArch
= ' '.join(ArchList
)
249 if SortedArch
in NewSectionDict
:
250 NewSectionDict
[SortedArch
] = \
251 NewSectionDict
[SortedArch
] + [Statement
]
253 NewSectionDict
[SortedArch
] = [Statement
]
255 Content
+= GenSection('Protocols', NewSectionDict
, True, True)
258 # generate [Ppis] section
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())
269 for Ppi
in Package
.GetPpiList():
271 # Generate generic comment
273 HelpTextList
= Ppi
.GetHelpTextList()
274 HelpStr
= _GetHelpStr(HelpTextList
)
275 CommentStr
= GenGenericCommentF(HelpStr
, 2)
277 Statement
= CommentStr
278 CName
= Ppi
.GetCName()
279 Value
= GuidStringToGuidStructureString(Ppi
.GetGuid())
280 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
283 # generate tail comment
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
]
293 NewSectionDict
[SortedArch
] = [Statement
]
295 Content
+= GenSection('Ppis', NewSectionDict
, True, True)
299 ## Transfer Package Object to Dec files
301 # Transfer all contents of a standard Package Object to a Dec file
303 # @param Package: A Package
305 def PackageToDec(Package
, DistHeader
= None):
307 # Init global information for the file
309 ContainerFile
= Package
.GetFullPath()
314 # Generate file header
316 PackageAbstract
= GetLocalValue(Package
.GetAbstract())
317 PackageDescription
= GetLocalValue(Package
.GetDescription())
318 PackageCopyright
= ''
320 for (Lang
, Copyright
) in Package
.GetCopyright():
323 PackageCopyright
= Copyright
324 for (Lang
, License
) in Package
.GetLicense():
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
340 # Generate header comment section of DEC file
342 Content
+= GenHeaderCommentSection(PackageAbstract
, \
343 PackageDescription
, \
345 PackageLicense
).replace('\r\n', '\n')
348 # Generate Binary header
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
,
370 # Generate PACKAGE_UNI_FILE for the Package
372 FileHeader
= GenHeaderCommentSection(PackageAbstract
, PackageDescription
, PackageCopyright
, PackageLicense
, False, \
373 TAB_COMMENT_EDK1_SPLIT
)
374 GenPackageUNIEncodeFile(Package
, FileHeader
)
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]
385 # generate [Defines] section
388 NewSectionDict
= {TAB_ARCH_COMMON
: []}
391 Statement
= (u
'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION
).ljust(LeftOffset
) + u
'= %s' % '0x00010017'
392 SpecialItemList
.append(Statement
)
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
)
400 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION
).ljust(LeftOffset
) + u
'= %s' % Package
.GetVersion()
401 SpecialItemList
.append(Statement
)
403 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID
).ljust(LeftOffset
) + u
'= %s' % Package
.GetGuid()
404 SpecialItemList
.append(Statement
)
407 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE
).ljust(LeftOffset
) + u
'= %s' % Package
.GetBaseName() + '.uni'
408 SpecialItemList
.append(Statement
)
410 for SortedArch
in NewSectionDict
:
411 NewSectionDict
[SortedArch
] = \
412 NewSectionDict
[SortedArch
] + SpecialItemList
413 Content
+= GenSection('Defines', NewSectionDict
)
416 # generate [Includes] section
419 IncludeArchList
= Package
.GetIncludeArchList()
421 for Path
, ArchList
in IncludeArchList
:
424 SortedArch
= ' '.join(ArchList
)
425 if SortedArch
in NewSectionDict
:
426 NewSectionDict
[SortedArch
] = \
427 NewSectionDict
[SortedArch
] + [ConvertPath(Statement
)]
429 NewSectionDict
[SortedArch
] = [ConvertPath(Statement
)]
431 Content
+= GenSection('Includes', NewSectionDict
)
434 # generate [guids][protocols][ppis] sections
436 Content
= GenGuidProtocolPpi(Package
, Content
)
439 # generate [LibraryClasses] section
442 for LibraryClass
in Package
.GetLibraryClassList():
444 # Generate generic comment
446 HelpTextList
= LibraryClass
.GetHelpTextList()
447 HelpStr
= _GetHelpStr(HelpTextList
)
449 HelpStr
= '@libraryclass' + HelpStr
450 CommentStr
= GenGenericCommentF(HelpStr
, 2, False, True)
452 Statement
= CommentStr
453 Name
= LibraryClass
.GetLibraryClass()
454 IncludeHeader
= LibraryClass
.GetIncludeHeader()
455 Statement
+= Name
+ '|' + ConvertPath(IncludeHeader
)
457 # generate tail comment
459 if LibraryClass
.GetSupModuleList():
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
]
468 NewSectionDict
[SortedArch
] = [Statement
]
470 Content
+= GenSection('LibraryClasses', NewSectionDict
, True, True)
473 # Generate '# [Error.<TokenSpcCName>]' section
475 Content
= GenPcdErrorMsgSection(Package
, Content
)
477 Content
= GenPcd(Package
, Content
)
480 # generate [UserExtensions] section
483 for UserExtension
in Package
.GetUserExtensionList():
484 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID
and \
485 UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
488 # Generate Private Section first
489 if UserExtension
.GetUserID() == DT
.TAB_INTEL
and UserExtension
.GetIdentifier() == DT
.TAB_PRIVATE
:
490 Content
+= '\n' + UserExtension
.GetStatement()
493 Statement
= UserExtension
.GetStatement()
497 LineList
= Statement
.split('\n')
499 for Line
in LineList
:
500 NewStatement
+= " %s\n" % Line
503 SectionName
= 'UserExtensions'
504 UserId
= UserExtension
.GetUserID()
507 UserId
= '"' + UserId
+ '"'
508 SectionName
+= '.' + UserId
509 if UserExtension
.GetIdentifier():
510 SectionName
+= '.' + '"' + UserExtension
.GetIdentifier() + '"'
511 if not UserExtension
.GetSupArchList():
512 SectionList
.append(SectionName
)
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
520 SaveFileOnChange(ContainerFile
, Content
, False)
521 if DistHeader
.ReadOnly
:
522 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH
)
524 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH|stat
.S_IWUSR|stat
.S_IWGRP|stat
.S_IWOTH
)
527 ## GenPackageUNIEncodeFile
528 # GenPackageUNIEncodeFile, default is a UCS-2LE encode file
530 def GenPackageUNIEncodeFile(PackageObject
, UniFileHeader
= '', Encoding
=TAB_ENCODING_UTF16LE
):
532 OnlyLANGUAGE_EN_X
= True
534 BinaryDescription
= []
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.
539 for (Key
, Value
) in PackageObject
.GetAbstract() + PackageObject
.GetDescription():
540 if Key
== TAB_LANGUAGE_EN_X
:
543 OnlyLANGUAGE_EN_X
= False
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
:
552 OnlyLANGUAGE_EN_X
= False
553 BinaryAbstract
.append((Key
, Value
))
555 for (Key
, Value
) in UserExtension
.GetBinaryDescription():
556 if Key
== TAB_LANGUAGE_EN_X
:
559 OnlyLANGUAGE_EN_X
= False
560 BinaryDescription
.append((Key
, Value
))
562 for Pcd
in PackageObject
.GetPcdList():
563 for TxtObj
in Pcd
.GetPromptList() + Pcd
.GetHelpTextList():
564 if TxtObj
.GetLang() == TAB_LANGUAGE_EN_X
:
567 OnlyLANGUAGE_EN_X
= False
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
:
575 OnlyLANGUAGE_EN_X
= False
578 elif OnlyLANGUAGE_EN_X
:
581 PackageObject
.UNIFlag
= True
583 if not os
.path
.exists(os
.path
.dirname(PackageObject
.GetFullPath())):
584 os
.makedirs(os
.path
.dirname(PackageObject
.GetFullPath()))
586 ContainerFile
= GetUniFileName(os
.path
.dirname(PackageObject
.GetFullPath()), PackageObject
.GetBaseName())
588 Content
= UniFileHeader
+ '\r\n'
591 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT
, PackageObject
.GetAbstract(), ContainerFile
) + '\r\n'
593 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION
, PackageObject
.GetDescription(), ContainerFile
) \
596 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT
, BinaryAbstract
, ContainerFile
) + '\r\n'
598 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION
, BinaryDescription
, ContainerFile
) + '\r\n'
602 for Pcd
in PackageObject
.GetPcdList():
603 # Generate Prompt for each Pcd
604 PcdPromptStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_PROMPT '
606 for TxtObj
in Pcd
.GetPromptList():
607 Lang
= TxtObj
.GetLang()
608 PromptStr
= TxtObj
.GetString()
610 # Avoid generating the same PROMPT entry more than one time.
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
619 # Generate Help String for each Pcd
620 PcdHelpStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_HELP '
622 for TxtObj
in Pcd
.GetHelpTextList():
623 Lang
= TxtObj
.GetLang()
624 HelpStr
= TxtObj
.GetString()
626 # Avoid generating the same HELP entry more than one time.
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
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
646 File
= codecs
.open(ContainerFile
, 'w', Encoding
)
647 File
.write(u
'\uFEFF' + Content
)
649 Md5Signature
= md5(__FileHookOpen__(str(ContainerFile
), 'rb').read())
650 Md5Sum
= Md5Signature
.hexdigest()
651 if (ContainerFile
, Md5Sum
) not in PackageObject
.FileList
:
652 PackageObject
.FileList
.append((ContainerFile
, Md5Sum
))
658 # @param PcdErrObject: PcdErrorObject
660 # @retval CommentStr: Generated comment lines, with prefix "#"
662 def GenPcdErrComment (PcdErrObject
):
664 ErrorCode
= PcdErrObject
.GetErrorNumber()
665 ValidValueRange
= PcdErrObject
.GetValidValueRange()
667 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_VALIDRANGE
+ TAB_SPACE_SPLIT
669 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
670 CommentStr
+= ValidValueRange
+ END_OF_LINE
672 ValidValue
= PcdErrObject
.GetValidValue()
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
678 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
679 CommentStr
+= TAB_COMMA_SPLIT
.join(ValidValueList
) + END_OF_LINE
681 Expression
= PcdErrObject
.GetExpression()
683 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_EXPRESSION
+ TAB_SPACE_SPLIT
685 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
686 CommentStr
+= Expression
+ END_OF_LINE