From f215e02bf85f68d3a6106c2a1f4f7f063f819064 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 11 Apr 2024 10:17:27 +0200 Subject: Adding upstream version 7.0.14-dfsg. Signed-off-by: Daniel Baumann --- .../Source/Python/UPT/GenMetaFile/GenDecFile.py | 683 +++++++++++++++++++++ 1 file changed, 683 insertions(+) create mode 100755 src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py (limited to 'src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py') diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py new file mode 100755 index 00000000..6d79278c --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py @@ -0,0 +1,683 @@ +## @file GenDecFile.py +# +# This file contained the logical of transfer package object to DEC files. +# +# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +''' +GenDEC +''' +import os +import stat +import codecs +from hashlib 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.StringUtils import GetUniFileName + +def GenPcd(Package, Content): + # + # generate [Pcd] section + # .||| + # + 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 = sorted(Pcd.GetSupArchList()) + 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.]' 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 = sorted(Guid.GetSupArchList()) + 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 = sorted(Protocol.GetSupArchList()) + 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 = sorted(Ppi.GetSupArchList()) + 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 = sorted(LibraryClass.GetSupArchList()) + SortedArch = ' '.join(ArchList) + if SortedArch in NewSectionDict: + NewSectionDict[SortedArch] = \ + NewSectionDict[SortedArch] + [Statement] + else: + NewSectionDict[SortedArch] = [Statement] + + Content += GenSection('LibraryClasses', NewSectionDict, True, True) + + # + # Generate '# [Error.]' 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() + Md5Signature = md5(__FileHookOpen__(str(ContainerFile), 'rb').read()) + Md5Sum = Md5Signature.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 + -- cgit v1.2.3