When creating a UNI file if there is a name conflict, add an index from 0 to the file name Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hess Chen <hesheng.chen@intel.com> Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
		
			
				
	
	
		
			695 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			695 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file GenDecFile.py
 | |
| #
 | |
| # This file contained the logical of transfer package object to DEC files.
 | |
| #
 | |
| # Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
 | |
| #
 | |
| # This program and the accompanying materials are licensed and made available 
 | |
| # under the terms and conditions of the BSD License which accompanies this 
 | |
| # distribution. The full text of the license may be found at 
 | |
| # http://opensource.org/licenses/bsd-license.php
 | |
| #
 | |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| #
 | |
| 
 | |
| '''
 | |
| GenDEC
 | |
| '''
 | |
| import os
 | |
| import stat
 | |
| import codecs
 | |
| import md5
 | |
| from Core.FileHook import __FileHookOpen__
 | |
| from Library.Parsing import GenSection
 | |
| from Library.CommentGenerating import GenHeaderCommentSection
 | |
| from Library.CommentGenerating import GenGenericCommentF
 | |
| from Library.CommentGenerating import GenDecTailComment
 | |
| from Library.CommentGenerating import _GetHelpStr
 | |
| from Library.Misc import GuidStringToGuidStructureString
 | |
| from Library.Misc import SaveFileOnChange
 | |
| from Library.Misc import ConvertPath
 | |
| from Library.Misc import GetLocalValue
 | |
| from Library.DataType import TAB_SPACE_SPLIT
 | |
| from Library.DataType import TAB_COMMA_SPLIT
 | |
| from Library.DataType import END_OF_LINE
 | |
| from Library.DataType import TAB_ARCH_COMMON
 | |
| from Library.DataType import TAB_VALUE_SPLIT
 | |
| from Library.DataType import TAB_COMMENT_SPLIT
 | |
| from Library.DataType import TAB_PCD_VALIDRANGE
 | |
| from Library.DataType import TAB_PCD_VALIDLIST
 | |
| from Library.DataType import TAB_PCD_EXPRESSION
 | |
| from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION
 | |
| from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME
 | |
| from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID
 | |
| from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION
 | |
| from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE
 | |
| from Library.DataType import TAB_DEC_PACKAGE_ABSTRACT
 | |
| from Library.DataType import TAB_DEC_PACKAGE_DESCRIPTION
 | |
| from Library.DataType import TAB_DEC_BINARY_ABSTRACT
 | |
| from Library.DataType import TAB_DEC_BINARY_DESCRIPTION
 | |
| from Library.DataType import TAB_LANGUAGE_EN_X
 | |
| from Library.DataType import TAB_BINARY_HEADER_USERID
 | |
| from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER
 | |
| from Library.DataType import TAB_COMMENT_EDK1_SPLIT
 | |
| from Library.DataType import TAB_ENCODING_UTF16LE
 | |
| from Library.DataType import TAB_CAPHEX_START
 | |
| from Library.DataType import TAB_HEX_START
 | |
| from Library.DataType import TAB_UNDERLINE_SPLIT
 | |
| from Library.DataType import TAB_STR_TOKENERR
 | |
| from Library.DataType import TAB_STR_TOKENCNAME
 | |
| from Library.DataType import TAB_PCD_ERROR_SECTION_COMMENT
 | |
| from Library.DataType import TAB_PCD_ERROR
 | |
| from Library.DataType import TAB_SECTION_START
 | |
| from Library.DataType import TAB_SECTION_END
 | |
| from Library.DataType import TAB_SPLIT
 | |
| import Library.DataType as DT
 | |
| from Library.UniClassObject import FormatUniEntry
 | |
| from Library.String import GetUniFileName
 | |
| 
 | |
| def GenPcd(Package, Content):
 | |
|     #
 | |
|     # generate [Pcd] section
 | |
|     # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>    
 | |
|     #
 | |
|     ValidUsageDict = {}
 | |
|     for Pcd in Package.GetPcdList():
 | |
|         #
 | |
|         # Generate generic comment
 | |
|         #
 | |
|         HelpTextList = Pcd.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CommentStr = GenGenericCommentF(HelpStr, 2)
 | |
|         
 | |
|         PromptList = Pcd.GetPromptList()
 | |
|         PromptStr = _GetHelpStr(PromptList)
 | |
|         CommentStr += GenGenericCommentF(PromptStr.strip(), 1, True)
 | |
|         
 | |
|         PcdErrList = Pcd.GetPcdErrorsList()
 | |
|         for PcdErr in PcdErrList:
 | |
|             CommentStr += GenPcdErrComment(PcdErr)
 | |
|         Statement = CommentStr
 | |
|  
 | |
|         CName = Pcd.GetCName()
 | |
|         TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()
 | |
|         DefaultValue = Pcd.GetDefaultValue()
 | |
|         DatumType = Pcd.GetDatumType()
 | |
|         Token = Pcd.GetToken()
 | |
|         ValidUsage = Pcd.GetValidUsage()
 | |
| 
 | |
|         if ValidUsage == 'FeaturePcd':
 | |
|             ValidUsage = 'PcdsFeatureFlag'
 | |
|         elif ValidUsage == 'PatchPcd':
 | |
|             ValidUsage = 'PcdsPatchableInModule'
 | |
|         elif ValidUsage == 'FixedPcd':
 | |
|             ValidUsage = 'PcdsFixedAtBuild'
 | |
|         elif ValidUsage == 'Pcd':
 | |
|             ValidUsage = 'PcdsDynamic'
 | |
|         elif ValidUsage == 'PcdEx':
 | |
|             ValidUsage = 'PcdsDynamicEx'
 | |
|                                 
 | |
|         if ValidUsage in ValidUsageDict:
 | |
|             NewSectionDict = ValidUsageDict[ValidUsage]
 | |
|         else:
 | |
|             NewSectionDict = {}
 | |
|             ValidUsageDict[ValidUsage] = NewSectionDict
 | |
|         Statement += TokenSpaceGuidCName + '.' + CName
 | |
|         Statement += '|' + DefaultValue
 | |
|         Statement += '|' + DatumType
 | |
|         Statement += '|' + Token
 | |
|         #
 | |
|         # generate tail comment
 | |
|         #
 | |
|         if Pcd.GetSupModuleList():
 | |
|             Statement += GenDecTailComment(Pcd.GetSupModuleList())
 | |
| 
 | |
|         ArchList = Pcd.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = \
 | |
|             NewSectionDict[SortedArch] + [Statement]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [Statement]            
 | |
|         
 | |
|     for ValidUsage in ValidUsageDict:
 | |
|         Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage], True, True)
 | |
|     
 | |
|     return Content
 | |
| 
 | |
| def GenPcdErrorMsgSection(Package, Content):
 | |
|     if not Package.PcdErrorCommentDict:
 | |
|         return Content
 | |
|     
 | |
|     #
 | |
|     # Generate '# [Error.<TokenSpcCName>]' section
 | |
|     #
 | |
|     Content += END_OF_LINE + END_OF_LINE
 | |
|     SectionComment = TAB_COMMENT_SPLIT + END_OF_LINE
 | |
|     SectionComment += TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_ERROR_SECTION_COMMENT + END_OF_LINE
 | |
|     SectionComment += TAB_COMMENT_SPLIT + END_OF_LINE
 | |
|     TokenSpcCNameList = []
 | |
|     
 | |
|     #
 | |
|     # Get TokenSpcCName list in PcdErrorCommentDict in Package object
 | |
|     #
 | |
|     for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:
 | |
|         if TokenSpcCName not in TokenSpcCNameList:
 | |
|             TokenSpcCNameList.append(TokenSpcCName)
 | |
|     
 | |
|     for TokenSpcCNameItem in TokenSpcCNameList:
 | |
|         SectionName = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SECTION_START + TAB_PCD_ERROR + \
 | |
|                       TAB_SPLIT + TokenSpcCNameItem + TAB_SECTION_END + END_OF_LINE
 | |
|         Content += SectionComment
 | |
|         Content += SectionName
 | |
|         for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:
 | |
|             if TokenSpcCNameItem == TokenSpcCName:
 | |
|                 PcdErrorMsg = GetLocalValue(Package.PcdErrorCommentDict[(TokenSpcCName, ErrorNumber)])
 | |
|                 SectionItem = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SPACE_SPLIT + \
 | |
|                               ErrorNumber + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT + \
 | |
|                               PcdErrorMsg + END_OF_LINE
 | |
|                 Content += SectionItem
 | |
|                 
 | |
|     Content += TAB_COMMENT_SPLIT
 | |
|     return Content
 | |
|             
 | |
| def GenGuidProtocolPpi(Package, Content):
 | |
|     #
 | |
|     # generate [Guids] section
 | |
|     #
 | |
|     NewSectionDict = {}
 | |
| 
 | |
|     LeftOffset = 46
 | |
|     # Get the line offset need
 | |
|     # If the real one < the min one, use the min one
 | |
|     # else use the real one
 | |
|     for Guid in Package.GetGuidList():
 | |
|         if len(Guid.GetCName()) > LeftOffset:
 | |
|             LeftOffset = len(Guid.GetCName())
 | |
| 
 | |
|     # Generate
 | |
|     for Guid in Package.GetGuidList():
 | |
|         #
 | |
|         # Generate generic comment
 | |
|         #
 | |
|         HelpTextList = Guid.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CommentStr = GenGenericCommentF(HelpStr, 2)
 | |
| 
 | |
|         Statement = CommentStr
 | |
|         CName = Guid.GetCName()
 | |
|         Value = GuidStringToGuidStructureString(Guid.GetGuid())
 | |
|         Statement += CName.ljust(LeftOffset) + ' = ' + Value
 | |
|         #
 | |
|         # generate tail comment
 | |
|         #
 | |
|         if Guid.GetSupModuleList():
 | |
|             Statement += GenDecTailComment(Guid.GetSupModuleList())     
 | |
|         ArchList = Guid.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = \
 | |
|             NewSectionDict[SortedArch] + [Statement]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [Statement]            
 | |
| 
 | |
|     Content += GenSection('Guids', NewSectionDict, True, True)
 | |
|  
 | |
|     #
 | |
|     # generate [Protocols] section
 | |
|     #
 | |
|     NewSectionDict = {}
 | |
|     LeftOffset = 46
 | |
|     # Get the line offset need
 | |
|     # If the real one < the min one, use the min one
 | |
|     # else use the real one
 | |
|     for Protocol in Package.GetProtocolList():
 | |
|         if len(Protocol.GetCName()) > LeftOffset:
 | |
|             LeftOffset = len(Protocol.GetCName())
 | |
| 
 | |
|     for Protocol in Package.GetProtocolList():
 | |
|         #
 | |
|         # Generate generic comment
 | |
|         #
 | |
|         HelpTextList = Protocol.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CommentStr = GenGenericCommentF(HelpStr, 2)        
 | |
| 
 | |
|         Statement = CommentStr        
 | |
|         CName = Protocol.GetCName()
 | |
|         Value = GuidStringToGuidStructureString(Protocol.GetGuid())
 | |
|         Statement += CName.ljust(LeftOffset) + ' = ' + Value
 | |
| 
 | |
|         #
 | |
|         # generate tail comment
 | |
|         #
 | |
|         if Protocol.GetSupModuleList():
 | |
|             Statement += GenDecTailComment(Protocol.GetSupModuleList())
 | |
|         ArchList = Protocol.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = \
 | |
|             NewSectionDict[SortedArch] + [Statement]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [Statement]            
 | |
| 
 | |
|     Content += GenSection('Protocols', NewSectionDict, True, True) 
 | |
| 
 | |
|     #
 | |
|     # generate [Ppis] section
 | |
|     #
 | |
|     NewSectionDict = {}
 | |
|     LeftOffset = 46
 | |
|     # Get the line offset need
 | |
|     # If the real one < the min one, use the min one
 | |
|     # else use the real one
 | |
|     for Ppi in Package.GetPpiList():
 | |
|         if len(Ppi.GetCName()) > LeftOffset:
 | |
|             LeftOffset = len(Ppi.GetCName())
 | |
| 
 | |
|     for Ppi in Package.GetPpiList():
 | |
|         #
 | |
|         # Generate generic comment
 | |
|         #
 | |
|         HelpTextList = Ppi.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CommentStr = GenGenericCommentF(HelpStr, 2)
 | |
| 
 | |
|         Statement = CommentStr
 | |
|         CName = Ppi.GetCName()
 | |
|         Value = GuidStringToGuidStructureString(Ppi.GetGuid())
 | |
|         Statement += CName.ljust(LeftOffset) + ' = ' + Value
 | |
| 
 | |
|         #
 | |
|         # generate tail comment
 | |
|         #
 | |
|         if Ppi.GetSupModuleList():
 | |
|             Statement += GenDecTailComment(Ppi.GetSupModuleList())
 | |
|         ArchList = Ppi.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = \
 | |
|             NewSectionDict[SortedArch] + [Statement]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [Statement]            
 | |
| 
 | |
|     Content += GenSection('Ppis', NewSectionDict, True, True)
 | |
|     
 | |
|     return Content
 | |
| 
 | |
| ## Transfer Package Object to Dec files
 | |
| #
 | |
| # Transfer all contents of a standard Package Object to a Dec file 
 | |
| #
 | |
| # @param Package:  A Package 
 | |
| #
 | |
| def PackageToDec(Package, DistHeader = None):
 | |
|     #
 | |
|     # Init global information for the file
 | |
|     #
 | |
|     ContainerFile = Package.GetFullPath()
 | |
|     
 | |
|     Content = ''
 | |
|     
 | |
|     #
 | |
|     # Generate file header 
 | |
|     #
 | |
|     PackageAbstract = GetLocalValue(Package.GetAbstract())
 | |
|     PackageDescription = GetLocalValue(Package.GetDescription())
 | |
|     PackageCopyright = ''
 | |
|     PackageLicense = ''
 | |
|     for (Lang, Copyright) in Package.GetCopyright():
 | |
|         if Lang:
 | |
|             pass
 | |
|         PackageCopyright = Copyright
 | |
|     for (Lang, License) in Package.GetLicense():
 | |
|         if Lang:
 | |
|             pass
 | |
|         PackageLicense = License
 | |
|     if not PackageAbstract and DistHeader:
 | |
|         PackageAbstract = GetLocalValue(DistHeader.GetAbstract())
 | |
|     if not PackageDescription and DistHeader:
 | |
|         PackageDescription = GetLocalValue(DistHeader.GetDescription())
 | |
|     if not PackageCopyright and DistHeader:
 | |
|         for (Lang, Copyright) in DistHeader.GetCopyright():
 | |
|             PackageCopyright = Copyright
 | |
|     if not PackageLicense and DistHeader:
 | |
|         for (Lang, License) in DistHeader.GetLicense():
 | |
|             PackageLicense = License
 | |
|          
 | |
|     #
 | |
|     # Generate header comment section of DEC file
 | |
|     #
 | |
|     Content += GenHeaderCommentSection(PackageAbstract, \
 | |
|                                        PackageDescription, \
 | |
|                                        PackageCopyright, \
 | |
|                                        PackageLicense).replace('\r\n', '\n')
 | |
| 
 | |
|     #
 | |
|     # Generate Binary header 
 | |
|     #
 | |
|     for UserExtension in Package.GetUserExtensionList():
 | |
|         if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \
 | |
|         and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:
 | |
|             PackageBinaryAbstract = GetLocalValue(UserExtension.GetBinaryAbstract())
 | |
|             PackageBinaryDescription = GetLocalValue(UserExtension.GetBinaryDescription())
 | |
|             PackageBinaryCopyright = ''
 | |
|             PackageBinaryLicense = ''
 | |
|             for (Lang, Copyright) in UserExtension.GetBinaryCopyright():
 | |
|                 PackageBinaryCopyright = Copyright
 | |
|             for (Lang, License) in UserExtension.GetBinaryLicense():
 | |
|                 PackageBinaryLicense = License 
 | |
|             if PackageBinaryAbstract and PackageBinaryDescription and \
 | |
|             PackageBinaryCopyright and PackageBinaryLicense:
 | |
|                 Content += GenHeaderCommentSection(PackageBinaryAbstract, 
 | |
|                                            PackageBinaryDescription, 
 | |
|                                            PackageBinaryCopyright, 
 | |
|                                            PackageBinaryLicense,
 | |
|                                            True)
 | |
| 
 | |
|     #
 | |
|     # Generate PACKAGE_UNI_FILE for the Package
 | |
|     #
 | |
|     FileHeader = GenHeaderCommentSection(PackageAbstract, PackageDescription, PackageCopyright, PackageLicense, False, \
 | |
|                                          TAB_COMMENT_EDK1_SPLIT)
 | |
|     GenPackageUNIEncodeFile(Package, FileHeader)
 | |
| 
 | |
|     #
 | |
|     # for each section, maintain a dict, sorted arch will be its key, 
 | |
|     #statement list will be its data
 | |
|     # { 'Arch1 Arch2 Arch3': [statement1, statement2],
 | |
|     #   'Arch1' : [statement1, statement3] 
 | |
|     #  }
 | |
|     #
 | |
|     
 | |
|     #
 | |
|     # generate [Defines] section                     
 | |
|     #
 | |
|     LeftOffset = 31
 | |
|     NewSectionDict = {TAB_ARCH_COMMON : []}
 | |
|     SpecialItemList = []
 | |
|     
 | |
|     Statement = (u'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION).ljust(LeftOffset) + u'= %s' % '0x00010017'
 | |
|     SpecialItemList.append(Statement)
 | |
|     
 | |
|     BaseName = Package.GetBaseName()
 | |
|     if BaseName.startswith('.') or BaseName.startswith('-'):
 | |
|         BaseName = '_' + BaseName
 | |
|     Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_NAME).ljust(LeftOffset) + u'= %s' % BaseName
 | |
|     SpecialItemList.append(Statement)
 | |
| 
 | |
|     Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION).ljust(LeftOffset) + u'= %s' % Package.GetVersion()
 | |
|     SpecialItemList.append(Statement)
 | |
| 
 | |
|     Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID).ljust(LeftOffset) + u'= %s' % Package.GetGuid()
 | |
|     SpecialItemList.append(Statement)
 | |
| 
 | |
|     if Package.UNIFlag:
 | |
|         Statement = (u'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE).ljust(LeftOffset) + u'= %s' % Package.GetBaseName() + '.uni'
 | |
|         SpecialItemList.append(Statement)               
 | |
| 
 | |
|     for SortedArch in NewSectionDict:
 | |
|         NewSectionDict[SortedArch] = \
 | |
|         NewSectionDict[SortedArch] + SpecialItemList
 | |
|     Content += GenSection('Defines', NewSectionDict)
 | |
| 
 | |
|     #
 | |
|     # generate [Includes] section
 | |
|     #
 | |
|     NewSectionDict = {}
 | |
|     IncludeArchList = Package.GetIncludeArchList()
 | |
|     if IncludeArchList:            
 | |
|         for Path, ArchList in IncludeArchList:
 | |
|             Statement = Path
 | |
|             ArchList.sort()
 | |
|             SortedArch = ' '.join(ArchList)
 | |
|             if SortedArch in NewSectionDict:
 | |
|                 NewSectionDict[SortedArch] = \
 | |
|                 NewSectionDict[SortedArch] + [ConvertPath(Statement)]
 | |
|             else:
 | |
|                 NewSectionDict[SortedArch] = [ConvertPath(Statement)]
 | |
| 
 | |
|     Content += GenSection('Includes', NewSectionDict)
 | |
| 
 | |
|     #
 | |
|     # generate [guids][protocols][ppis] sections
 | |
|     #
 | |
|     Content = GenGuidProtocolPpi(Package, Content)
 | |
| 
 | |
|     #
 | |
|     # generate [LibraryClasses] section
 | |
|     #
 | |
|     NewSectionDict = {}
 | |
|     for LibraryClass in Package.GetLibraryClassList():
 | |
|         #
 | |
|         # Generate generic comment
 | |
|         #
 | |
|         HelpTextList = LibraryClass.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         if HelpStr:
 | |
|             HelpStr = '@libraryclass' + HelpStr
 | |
|         CommentStr = GenGenericCommentF(HelpStr, 2, False, True)
 | |
| 
 | |
|         Statement = CommentStr
 | |
|         Name = LibraryClass.GetLibraryClass()
 | |
|         IncludeHeader = LibraryClass.GetIncludeHeader()
 | |
|         Statement += Name + '|' + ConvertPath(IncludeHeader)
 | |
|         #
 | |
|         # generate tail comment
 | |
|         #
 | |
|         if LibraryClass.GetSupModuleList():
 | |
|             Statement += \
 | |
|             GenDecTailComment(LibraryClass.GetSupModuleList())
 | |
|         ArchList = LibraryClass.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = \
 | |
|             NewSectionDict[SortedArch] + [Statement]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [Statement]            
 | |
| 
 | |
|     Content += GenSection('LibraryClasses', NewSectionDict, True, True)
 | |
| 
 | |
|     #
 | |
|     # Generate '# [Error.<TokenSpcCName>]' section
 | |
|     #
 | |
|     Content = GenPcdErrorMsgSection(Package, Content)
 | |
|     
 | |
|     Content = GenPcd(Package, Content)
 | |
| 
 | |
|     #
 | |
|     # generate [UserExtensions] section
 | |
|     #
 | |
|     NewSectionDict = {}
 | |
|     for UserExtension in Package.GetUserExtensionList():
 | |
|         if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID and \
 | |
|             UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:
 | |
|             continue
 | |
| 
 | |
|         # Generate Private Section first
 | |
|         if UserExtension.GetUserID() == DT.TAB_INTEL and UserExtension.GetIdentifier() == DT.TAB_PRIVATE:
 | |
|             Content += '\n' + UserExtension.GetStatement()
 | |
|             continue
 | |
| 
 | |
|         Statement = UserExtension.GetStatement()
 | |
|         if not Statement:
 | |
|             continue
 | |
|         else:
 | |
|             LineList = Statement.split('\n')
 | |
|             NewStatement = ""
 | |
|             for Line in LineList:
 | |
|                 NewStatement += "  %s\n" % Line
 | |
|         
 | |
|         SectionList = []
 | |
|         SectionName = 'UserExtensions'
 | |
|         UserId = UserExtension.GetUserID()
 | |
|         if UserId:
 | |
|             if '.' in UserId:
 | |
|                 UserId = '"' + UserId + '"'
 | |
|             SectionName += '.' + UserId
 | |
|             if UserExtension.GetIdentifier():
 | |
|                 SectionName += '.' + '"' + UserExtension.GetIdentifier() + '"'
 | |
|         if not UserExtension.GetSupArchList():
 | |
|             SectionList.append(SectionName)
 | |
|         else:
 | |
|             for Arch in UserExtension.GetSupArchList():
 | |
|                 SectionList.append(SectionName + '.' + Arch)
 | |
|         SectionName = ', '.join(SectionList)
 | |
|         SectionName = ''.join(['[', SectionName, ']\n'])
 | |
|         Content += '\n' + SectionName + NewStatement
 | |
| 
 | |
|     SaveFileOnChange(ContainerFile, Content, False)
 | |
|     if DistHeader.ReadOnly:
 | |
|         os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)
 | |
|     else:
 | |
|         os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)
 | |
|     return ContainerFile
 | |
| 
 | |
| ## GenPackageUNIEncodeFile
 | |
| # GenPackageUNIEncodeFile, default is a UCS-2LE encode file
 | |
| #
 | |
| def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCODING_UTF16LE):
 | |
|     GenUNIFlag = False
 | |
|     OnlyLANGUAGE_EN_X = True
 | |
|     BinaryAbstract = []
 | |
|     BinaryDescription = []
 | |
|     #
 | |
|     # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE, 
 | |
|     # then the PACKAGE_UNI_FILE must be created.
 | |
|     #
 | |
|     for (Key, Value) in PackageObject.GetAbstract() + PackageObject.GetDescription():
 | |
|         if Key == TAB_LANGUAGE_EN_X:
 | |
|             GenUNIFlag = True
 | |
|         else:
 | |
|             OnlyLANGUAGE_EN_X = False
 | |
|             
 | |
|     for UserExtension in PackageObject.GetUserExtensionList():
 | |
|         if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \
 | |
|         and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:
 | |
|             for (Key, Value) in UserExtension.GetBinaryAbstract():
 | |
|                 if Key == TAB_LANGUAGE_EN_X:
 | |
|                     GenUNIFlag = True
 | |
|                 else:
 | |
|                     OnlyLANGUAGE_EN_X = False
 | |
|                 BinaryAbstract.append((Key, Value))
 | |
| 
 | |
|             for (Key, Value) in UserExtension.GetBinaryDescription():
 | |
|                 if Key == TAB_LANGUAGE_EN_X:
 | |
|                     GenUNIFlag = True
 | |
|                 else:
 | |
|                     OnlyLANGUAGE_EN_X = False
 | |
|                 BinaryDescription.append((Key, Value))
 | |
| 
 | |
|     for Pcd in PackageObject.GetPcdList():
 | |
|         for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList():
 | |
|             if TxtObj.GetLang() == TAB_LANGUAGE_EN_X:
 | |
|                 GenUNIFlag = True
 | |
|             else:
 | |
|                 OnlyLANGUAGE_EN_X = False
 | |
|                 
 | |
|         for PcdError in Pcd.GetPcdErrorsList():
 | |
|             if PcdError.GetErrorNumber().startswith('0x') or PcdError.GetErrorNumber().startswith('0X'):
 | |
|                 for (Key, Value) in PcdError.GetErrorMessageList():
 | |
|                     if Key == TAB_LANGUAGE_EN_X:
 | |
|                         GenUNIFlag = True
 | |
|                     else:
 | |
|                         OnlyLANGUAGE_EN_X = False
 | |
|     if not GenUNIFlag:
 | |
|         return
 | |
|     elif OnlyLANGUAGE_EN_X:
 | |
|         return
 | |
|     else:
 | |
|         PackageObject.UNIFlag = True
 | |
|         
 | |
|     if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())):
 | |
|         os.makedirs(os.path.dirname(PackageObject.GetFullPath()))
 | |
|     
 | |
|     ContainerFile = GetUniFileName(os.path.dirname(PackageObject.GetFullPath()), PackageObject.GetBaseName())
 | |
| 
 | |
|     Content = UniFileHeader + '\r\n'
 | |
|     Content += '\r\n'
 | |
|     
 | |
|     Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) + '\r\n'
 | |
|         
 | |
|     Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \
 | |
|     + '\r\n'
 | |
|     
 | |
|     Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) + '\r\n'
 | |
|     
 | |
|     Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) + '\r\n'
 | |
|     
 | |
|     PromptGenList = []
 | |
|     HelpTextGenList = []    
 | |
|     for Pcd in PackageObject.GetPcdList():
 | |
|         # Generate Prompt for each Pcd
 | |
|         PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_PROMPT '
 | |
|         TokenValueList = []
 | |
|         for TxtObj in Pcd.GetPromptList():
 | |
|             Lang = TxtObj.GetLang()
 | |
|             PromptStr = TxtObj.GetString()
 | |
|             #
 | |
|             # Avoid generating the same PROMPT entry more than one time. 
 | |
|             #
 | |
|             if (PcdPromptStrName, Lang) not in PromptGenList:
 | |
|                 TokenValueList.append((Lang, PromptStr))
 | |
|                 PromptGenList.append((PcdPromptStrName, Lang))
 | |
|         PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + '\r\n'
 | |
|         if PromptString not in Content:
 | |
|             Content += PromptString
 | |
|             
 | |
|         # Generate Help String for each Pcd
 | |
|         PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_HELP '
 | |
|         TokenValueList = []
 | |
|         for TxtObj in Pcd.GetHelpTextList():
 | |
|             Lang = TxtObj.GetLang()
 | |
|             HelpStr = TxtObj.GetString()
 | |
|             #
 | |
|             # Avoid generating the same HELP entry more than one time. 
 | |
|             #
 | |
|             if (PcdHelpStrName, Lang) not in HelpTextGenList:
 | |
|                 TokenValueList.append((Lang, HelpStr))
 | |
|                 HelpTextGenList.append((PcdHelpStrName, Lang))
 | |
|         HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + '\r\n'
 | |
|         if HelpTextString not in Content:
 | |
|             Content += HelpTextString
 | |
|             
 | |
|         # Generate PcdError for each Pcd if ErrorNo exist.
 | |
|         for PcdError in Pcd.GetPcdErrorsList():
 | |
|             ErrorNo = PcdError.GetErrorNumber()
 | |
|             if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith(TAB_CAPHEX_START):
 | |
|                 PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \
 | |
|                     + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \
 | |
|                     + TAB_UNDERLINE_SPLIT + ErrorNo[2:]
 | |
|                 PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + '\r\n'
 | |
|                 if PcdErrString not in Content:
 | |
|                     Content += PcdErrString
 | |
|                     
 | |
|     File = codecs.open(ContainerFile, 'w', Encoding)
 | |
|     File.write(u'\uFEFF' + Content)
 | |
|     File.stream.close()
 | |
|     Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read())
 | |
|     Md5Sum = Md5Sigature.hexdigest()
 | |
|     if (ContainerFile, Md5Sum) not in PackageObject.FileList:
 | |
|         PackageObject.FileList.append((ContainerFile, Md5Sum))
 | |
| 
 | |
|     return ContainerFile
 | |
|     
 | |
| ## GenPcdErrComment
 | |
| #
 | |
| #  @param PcdErrObject:  PcdErrorObject
 | |
| #  
 | |
| #  @retval CommentStr:   Generated comment lines, with prefix "#"
 | |
| # 
 | |
| def GenPcdErrComment (PcdErrObject):
 | |
|     CommentStr = '' 
 | |
|     ErrorCode = PcdErrObject.GetErrorNumber()
 | |
|     ValidValueRange = PcdErrObject.GetValidValueRange()
 | |
|     if ValidValueRange:
 | |
|         CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDRANGE + TAB_SPACE_SPLIT 
 | |
|         if ErrorCode:
 | |
|             CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT
 | |
|         CommentStr += ValidValueRange + END_OF_LINE
 | |
|     
 | |
|     ValidValue = PcdErrObject.GetValidValue()
 | |
|     if ValidValue:
 | |
|         ValidValueList = \
 | |
|         [Value for Value in ValidValue.split(TAB_SPACE_SPLIT) if Value]
 | |
|         CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDLIST + TAB_SPACE_SPLIT
 | |
|         if ErrorCode:
 | |
|             CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT
 | |
|         CommentStr += TAB_COMMA_SPLIT.join(ValidValueList) + END_OF_LINE
 | |
|         
 | |
|     Expression = PcdErrObject.GetExpression()
 | |
|     if Expression:
 | |
|         CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_EXPRESSION + TAB_SPACE_SPLIT
 | |
|         if ErrorCode:
 | |
|             CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT
 | |
|         CommentStr += Expression + END_OF_LINE
 | |
|         
 | |
|     return CommentStr
 | |
| 
 |