3 # This file contained the logical of transfer package object to DEC files.
5 # Copyright (c) 2011 - 2016, 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 import Library
.DataType
as DT
67 from Library
.UniClassObject
import FormatUniEntry
69 def GenPcd(Package
, Content
):
71 # generate [Pcd] section
72 # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
75 for Pcd
in Package
.GetPcdList():
77 # Generate generic comment
79 HelpTextList
= Pcd
.GetHelpTextList()
80 HelpStr
= _GetHelpStr(HelpTextList
)
81 CommentStr
= GenGenericCommentF(HelpStr
, 2)
83 PromptList
= Pcd
.GetPromptList()
84 PromptStr
= _GetHelpStr(PromptList
)
85 CommentStr
+= GenGenericCommentF(PromptStr
.strip(), 1, True)
87 PcdErrList
= Pcd
.GetPcdErrorsList()
88 for PcdErr
in PcdErrList
:
89 CommentStr
+= GenPcdErrComment(PcdErr
)
90 Statement
= CommentStr
92 CName
= Pcd
.GetCName()
93 TokenSpaceGuidCName
= Pcd
.GetTokenSpaceGuidCName()
94 DefaultValue
= Pcd
.GetDefaultValue()
95 DatumType
= Pcd
.GetDatumType()
96 Token
= Pcd
.GetToken()
97 ValidUsage
= Pcd
.GetValidUsage()
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'
110 if ValidUsage
in ValidUsageDict
:
111 NewSectionDict
= ValidUsageDict
[ValidUsage
]
114 ValidUsageDict
[ValidUsage
] = NewSectionDict
115 Statement
+= TokenSpaceGuidCName
+ '.' + CName
116 Statement
+= '|' + DefaultValue
117 Statement
+= '|' + DatumType
118 Statement
+= '|' + Token
120 # generate tail comment
122 if Pcd
.GetSupModuleList():
123 Statement
+= GenDecTailComment(Pcd
.GetSupModuleList())
125 ArchList
= 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
= Guid
.GetSupArchList()
209 SortedArch
= ' '.join(ArchList
)
210 if SortedArch
in NewSectionDict
:
211 NewSectionDict
[SortedArch
] = \
212 NewSectionDict
[SortedArch
] + [Statement
]
214 NewSectionDict
[SortedArch
] = [Statement
]
216 Content
+= GenSection('Guids', NewSectionDict
, True, True)
219 # generate [Protocols] section
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())
230 for Protocol
in Package
.GetProtocolList():
232 # Generate generic comment
234 HelpTextList
= Protocol
.GetHelpTextList()
235 HelpStr
= _GetHelpStr(HelpTextList
)
236 CommentStr
= GenGenericCommentF(HelpStr
, 2)
238 Statement
= CommentStr
239 CName
= Protocol
.GetCName()
240 Value
= GuidStringToGuidStructureString(Protocol
.GetGuid())
241 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
244 # generate tail comment
246 if Protocol
.GetSupModuleList():
247 Statement
+= GenDecTailComment(Protocol
.GetSupModuleList())
248 ArchList
= Protocol
.GetSupArchList()
250 SortedArch
= ' '.join(ArchList
)
251 if SortedArch
in NewSectionDict
:
252 NewSectionDict
[SortedArch
] = \
253 NewSectionDict
[SortedArch
] + [Statement
]
255 NewSectionDict
[SortedArch
] = [Statement
]
257 Content
+= GenSection('Protocols', NewSectionDict
, True, True)
260 # generate [Ppis] section
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())
271 for Ppi
in Package
.GetPpiList():
273 # Generate generic comment
275 HelpTextList
= Ppi
.GetHelpTextList()
276 HelpStr
= _GetHelpStr(HelpTextList
)
277 CommentStr
= GenGenericCommentF(HelpStr
, 2)
279 Statement
= CommentStr
280 CName
= Ppi
.GetCName()
281 Value
= GuidStringToGuidStructureString(Ppi
.GetGuid())
282 Statement
+= CName
.ljust(LeftOffset
) + ' = ' + Value
285 # generate tail comment
287 if Ppi
.GetSupModuleList():
288 Statement
+= GenDecTailComment(Ppi
.GetSupModuleList())
289 ArchList
= Ppi
.GetSupArchList()
291 SortedArch
= ' '.join(ArchList
)
292 if SortedArch
in NewSectionDict
:
293 NewSectionDict
[SortedArch
] = \
294 NewSectionDict
[SortedArch
] + [Statement
]
296 NewSectionDict
[SortedArch
] = [Statement
]
298 Content
+= GenSection('Ppis', NewSectionDict
, True, True)
302 ## Transfer Package Object to Dec files
304 # Transfer all contents of a standard Package Object to a Dec file
306 # @param Package: A Package
308 def PackageToDec(Package
, DistHeader
= None):
310 # Init global information for the file
312 ContainerFile
= Package
.GetFullPath()
317 # Generate file header
319 PackageAbstract
= GetLocalValue(Package
.GetAbstract())
320 PackageDescription
= GetLocalValue(Package
.GetDescription())
321 PackageCopyright
= ''
323 for (Lang
, Copyright
) in Package
.GetCopyright():
326 PackageCopyright
= Copyright
327 for (Lang
, License
) in Package
.GetLicense():
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
343 # Generate header comment section of DEC file
345 Content
+= GenHeaderCommentSection(PackageAbstract
, \
346 PackageDescription
, \
348 PackageLicense
).replace('\r\n', '\n')
351 # Generate Binary header
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
,
373 # Generate PACKAGE_UNI_FILE for the Package
375 FileHeader
= GenHeaderCommentSection(PackageAbstract
, PackageDescription
, PackageCopyright
, PackageLicense
, False, \
376 TAB_COMMENT_EDK1_SPLIT
)
377 GenPackageUNIEncodeFile(Package
, FileHeader
)
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]
388 # generate [Defines] section
391 NewSectionDict
= {TAB_ARCH_COMMON
: []}
394 Statement
= (u
'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION
).ljust(LeftOffset
) + u
'= %s' % '0x00010017'
395 SpecialItemList
.append(Statement
)
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
)
403 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION
).ljust(LeftOffset
) + u
'= %s' % Package
.GetVersion()
404 SpecialItemList
.append(Statement
)
406 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID
).ljust(LeftOffset
) + u
'= %s' % Package
.GetGuid()
407 SpecialItemList
.append(Statement
)
410 Statement
= (u
'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE
).ljust(LeftOffset
) + u
'= %s' % Package
.GetBaseName() + '.uni'
411 SpecialItemList
.append(Statement
)
413 for SortedArch
in NewSectionDict
:
414 NewSectionDict
[SortedArch
] = \
415 NewSectionDict
[SortedArch
] + SpecialItemList
416 Content
+= GenSection('Defines', NewSectionDict
)
419 # generate [Includes] section
422 IncludeArchList
= Package
.GetIncludeArchList()
424 for Path
, ArchList
in IncludeArchList
:
427 SortedArch
= ' '.join(ArchList
)
428 if SortedArch
in NewSectionDict
:
429 NewSectionDict
[SortedArch
] = \
430 NewSectionDict
[SortedArch
] + [ConvertPath(Statement
)]
432 NewSectionDict
[SortedArch
] = [ConvertPath(Statement
)]
434 Content
+= GenSection('Includes', NewSectionDict
)
437 # generate [guids][protocols][ppis] sections
439 Content
= GenGuidProtocolPpi(Package
, Content
)
442 # generate [LibraryClasses] section
445 for LibraryClass
in Package
.GetLibraryClassList():
447 # Generate generic comment
449 HelpTextList
= LibraryClass
.GetHelpTextList()
450 HelpStr
= _GetHelpStr(HelpTextList
)
452 HelpStr
= '@libraryclass' + HelpStr
453 CommentStr
= GenGenericCommentF(HelpStr
, 2, False, True)
455 Statement
= CommentStr
456 Name
= LibraryClass
.GetLibraryClass()
457 IncludeHeader
= LibraryClass
.GetIncludeHeader()
458 Statement
+= Name
+ '|' + ConvertPath(IncludeHeader
)
460 # generate tail comment
462 if LibraryClass
.GetSupModuleList():
464 GenDecTailComment(LibraryClass
.GetSupModuleList())
465 ArchList
= LibraryClass
.GetSupArchList()
467 SortedArch
= ' '.join(ArchList
)
468 if SortedArch
in NewSectionDict
:
469 NewSectionDict
[SortedArch
] = \
470 NewSectionDict
[SortedArch
] + [Statement
]
472 NewSectionDict
[SortedArch
] = [Statement
]
474 Content
+= GenSection('LibraryClasses', NewSectionDict
, True, True)
477 # Generate '# [Error.<TokenSpcCName>]' section
479 Content
= GenPcdErrorMsgSection(Package
, Content
)
481 Content
= GenPcd(Package
, Content
)
484 # generate [UserExtensions] section
487 for UserExtension
in Package
.GetUserExtensionList():
488 if UserExtension
.GetUserID() == TAB_BINARY_HEADER_USERID
and \
489 UserExtension
.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER
:
492 # Generate Private Section first
493 if UserExtension
.GetUserID() == DT
.TAB_INTEL
and UserExtension
.GetIdentifier() == DT
.TAB_PRIVATE
:
494 Content
+= '\n' + UserExtension
.GetStatement()
497 Statement
= UserExtension
.GetStatement()
501 LineList
= Statement
.split('\n')
503 for Line
in LineList
:
504 NewStatement
+= " %s\n" % Line
507 SectionName
= 'UserExtensions'
508 UserId
= UserExtension
.GetUserID()
511 UserId
= '"' + UserId
+ '"'
512 SectionName
+= '.' + UserId
513 if UserExtension
.GetIdentifier():
514 SectionName
+= '.' + '"' + UserExtension
.GetIdentifier() + '"'
515 if not UserExtension
.GetSupArchList():
516 SectionList
.append(SectionName
)
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
524 SaveFileOnChange(ContainerFile
, Content
, False)
525 if DistHeader
.ReadOnly
:
526 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH
)
528 os
.chmod(ContainerFile
, stat
.S_IRUSR|stat
.S_IRGRP|stat
.S_IROTH|stat
.S_IWUSR|stat
.S_IWGRP|stat
.S_IWOTH
)
531 ## GenPackageUNIEncodeFile
532 # GenPackageUNIEncodeFile, default is a UCS-2LE encode file
534 def GenPackageUNIEncodeFile(PackageObject
, UniFileHeader
= '', Encoding
=TAB_ENCODING_UTF16LE
):
536 OnlyLANGUAGE_EN_X
= True
538 BinaryDescription
= []
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.
543 for (Key
, Value
) in PackageObject
.GetAbstract() + PackageObject
.GetDescription():
544 if Key
== TAB_LANGUAGE_EN_X
:
547 OnlyLANGUAGE_EN_X
= False
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
:
556 OnlyLANGUAGE_EN_X
= False
557 BinaryAbstract
.append((Key
, Value
))
559 for (Key
, Value
) in UserExtension
.GetBinaryDescription():
560 if Key
== TAB_LANGUAGE_EN_X
:
563 OnlyLANGUAGE_EN_X
= False
564 BinaryDescription
.append((Key
, Value
))
566 for Pcd
in PackageObject
.GetPcdList():
567 for TxtObj
in Pcd
.GetPromptList() + Pcd
.GetHelpTextList():
568 if TxtObj
.GetLang() == TAB_LANGUAGE_EN_X
:
571 OnlyLANGUAGE_EN_X
= False
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
:
579 OnlyLANGUAGE_EN_X
= False
582 elif OnlyLANGUAGE_EN_X
:
585 PackageObject
.UNIFlag
= True
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')))
592 Content
= UniFileHeader
+ '\r\n'
595 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT
, PackageObject
.GetAbstract(), ContainerFile
) + '\r\n'
597 Content
+= FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION
, PackageObject
.GetDescription(), ContainerFile
) \
600 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT
, BinaryAbstract
, ContainerFile
) + '\r\n'
602 Content
+= FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION
, BinaryDescription
, ContainerFile
) + '\r\n'
606 for Pcd
in PackageObject
.GetPcdList():
607 # Generate Prompt for each Pcd
608 PcdPromptStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_PROMPT '
610 for TxtObj
in Pcd
.GetPromptList():
611 Lang
= TxtObj
.GetLang()
612 PromptStr
= TxtObj
.GetString()
614 # Avoid generating the same PROMPT entry more than one time.
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
623 # Generate Help String for each Pcd
624 PcdHelpStrName
= '#string ' + 'STR_' + Pcd
.GetTokenSpaceGuidCName() + '_' + Pcd
.GetCName() + '_HELP '
626 for TxtObj
in Pcd
.GetHelpTextList():
627 Lang
= TxtObj
.GetLang()
628 HelpStr
= TxtObj
.GetString()
630 # Avoid generating the same HELP entry more than one time.
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
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
650 File
= codecs
.open(ContainerFile
, 'w', Encoding
)
651 File
.write(u
'\uFEFF' + Content
)
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
))
662 # @param PcdErrObject: PcdErrorObject
664 # @retval CommentStr: Generated comment lines, with prefix "#"
666 def GenPcdErrComment (PcdErrObject
):
668 ErrorCode
= PcdErrObject
.GetErrorNumber()
669 ValidValueRange
= PcdErrObject
.GetValidValueRange()
671 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_VALIDRANGE
+ TAB_SPACE_SPLIT
673 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
674 CommentStr
+= ValidValueRange
+ END_OF_LINE
676 ValidValue
= PcdErrObject
.GetValidValue()
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
682 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
683 CommentStr
+= TAB_COMMA_SPLIT
.join(ValidValueList
) + END_OF_LINE
685 Expression
= PcdErrObject
.GetExpression()
687 CommentStr
= TAB_COMMENT_SPLIT
+ TAB_SPACE_SPLIT
+ TAB_PCD_EXPRESSION
+ TAB_SPACE_SPLIT
689 CommentStr
+= ErrorCode
+ TAB_SPACE_SPLIT
+ TAB_VALUE_SPLIT
+ TAB_SPACE_SPLIT
690 CommentStr
+= Expression
+ END_OF_LINE