#\r
# This file contained the logical of transfer package object to DEC files.\r
#\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
#\r
# This program and the accompanying materials are licensed and made available \r
# under the terms and conditions of the BSD License which accompanies this \r
'''\r
GenDEC\r
'''\r
-\r
+import os\r
+import stat\r
+import codecs\r
+import md5\r
+from Core.FileHook import __FileHookOpen__\r
from Library.Parsing import GenSection\r
from Library.CommentGenerating import GenHeaderCommentSection\r
from Library.CommentGenerating import GenGenericCommentF\r
from Library.Misc import GuidStringToGuidStructureString\r
from Library.Misc import SaveFileOnChange\r
from Library.Misc import ConvertPath\r
+from Library.Misc import GetLocalValue\r
from Library.DataType import TAB_SPACE_SPLIT\r
from Library.DataType import TAB_COMMA_SPLIT\r
+from Library.DataType import END_OF_LINE\r
from Library.DataType import TAB_ARCH_COMMON\r
+from Library.DataType import TAB_VALUE_SPLIT\r
+from Library.DataType import TAB_COMMENT_SPLIT\r
+from Library.DataType import TAB_PCD_VALIDRANGE\r
+from Library.DataType import TAB_PCD_VALIDLIST\r
+from Library.DataType import TAB_PCD_EXPRESSION\r
from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME\r
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
-\r
+from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
+from Library.DataType import TAB_DEC_PACKAGE_ABSTRACT\r
+from Library.DataType import TAB_DEC_PACKAGE_DESCRIPTION\r
+from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r
+from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r
+from Library.DataType import TAB_LANGUAGE_EN_X\r
+from Library.DataType import TAB_BINARY_HEADER_USERID\r
+from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
+from Library.DataType import TAB_COMMENT_EDK1_SPLIT\r
+from Library.DataType import TAB_ENCODING_UTF16LE\r
+from Library.DataType import TAB_CAPHEX_START\r
+from Library.DataType import TAB_HEX_START\r
+from Library.DataType import TAB_UNDERLINE_SPLIT\r
+from Library.DataType import TAB_STR_TOKENERR\r
+from Library.DataType import TAB_STR_TOKENCNAME\r
+from Library.DataType import TAB_PCD_ERROR_SECTION_COMMENT\r
+from Library.DataType import TAB_PCD_ERROR\r
+from Library.DataType import TAB_SECTION_START\r
+from Library.DataType import TAB_SECTION_END\r
+from Library.DataType import TAB_SPLIT\r
+from Library.UniClassObject import FormatUniEntry\r
\r
def GenPcd(Package, Content):\r
#\r
HelpTextList = Pcd.GetHelpTextList()\r
HelpStr = _GetHelpStr(HelpTextList)\r
CommentStr = GenGenericCommentF(HelpStr, 2)\r
-\r
+ \r
+ PromptList = Pcd.GetPromptList()\r
+ PromptStr = _GetHelpStr(PromptList)\r
+ CommentStr += GenGenericCommentF(PromptStr.strip(), 1, True)\r
+ \r
PcdErrList = Pcd.GetPcdErrorsList()\r
- if PcdErrList:\r
- CommentStr += GenPcdErrComment(PcdErrList[0])\r
+ for PcdErr in PcdErrList:\r
+ CommentStr += GenPcdErrComment(PcdErr)\r
Statement = CommentStr\r
-\r
+ \r
CName = Pcd.GetCName()\r
TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()\r
DefaultValue = Pcd.GetDefaultValue()\r
NewSectionDict[SortedArch] = [Statement] \r
\r
for ValidUsage in ValidUsageDict:\r
- Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage])\r
+ Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage], True, True)\r
\r
return Content\r
\r
+def GenPcdErrorMsgSection(Package, Content):\r
+ if not Package.PcdErrorCommentDict:\r
+ return Content\r
+ \r
+ #\r
+ # Generate '# [Error.<TokenSpcCName>]' section\r
+ #\r
+ Content += END_OF_LINE + END_OF_LINE\r
+ SectionComment = TAB_COMMENT_SPLIT + END_OF_LINE\r
+ SectionComment += TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_ERROR_SECTION_COMMENT + END_OF_LINE\r
+ SectionComment += TAB_COMMENT_SPLIT + END_OF_LINE\r
+ TokenSpcCNameList = []\r
+ \r
+ #\r
+ # Get TokenSpcCName list in PcdErrorCommentDict in Package object\r
+ #\r
+ for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
+ if TokenSpcCName not in TokenSpcCNameList:\r
+ TokenSpcCNameList.append(TokenSpcCName)\r
+ \r
+ for TokenSpcCNameItem in TokenSpcCNameList:\r
+ SectionName = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SECTION_START + TAB_PCD_ERROR + \\r
+ TAB_SPLIT + TokenSpcCNameItem + TAB_SECTION_END + END_OF_LINE\r
+ Content += SectionComment\r
+ Content += SectionName\r
+ for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
+ if TokenSpcCNameItem == TokenSpcCName:\r
+ PcdErrorMsg = GetLocalValue(Package.PcdErrorCommentDict[(TokenSpcCName, ErrorNumber)])\r
+ SectionItem = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SPACE_SPLIT + \\r
+ ErrorNumber + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT + \\r
+ PcdErrorMsg + END_OF_LINE\r
+ Content += SectionItem\r
+ \r
+ Content += TAB_COMMENT_SPLIT\r
+ return Content\r
+ \r
def GenGuidProtocolPpi(Package, Content):\r
#\r
# generate [Guids] section\r
#\r
NewSectionDict = {}\r
+\r
+ LeftOffset = 46\r
+ # Get the line offset need\r
+ # If the real one < the min one, use the min one\r
+ # else use the real one\r
+ for Guid in Package.GetGuidList():\r
+ if len(Guid.GetCName()) > LeftOffset:\r
+ LeftOffset = len(Guid.GetCName())\r
+\r
+ # Generate\r
for Guid in Package.GetGuidList():\r
#\r
# Generate generic comment\r
Statement = CommentStr\r
CName = Guid.GetCName()\r
Value = GuidStringToGuidStructureString(Guid.GetGuid())\r
- Statement += CName + ' = ' + Value\r
+ Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
#\r
# generate tail comment\r
#\r
else:\r
NewSectionDict[SortedArch] = [Statement] \r
\r
- Content += GenSection('Guids', NewSectionDict) \r
+ Content += GenSection('Guids', NewSectionDict, True, True)\r
\r
#\r
# generate [Protocols] section\r
#\r
NewSectionDict = {}\r
+ LeftOffset = 46\r
+ # Get the line offset need\r
+ # If the real one < the min one, use the min one\r
+ # else use the real one\r
+ for Protocol in Package.GetProtocolList():\r
+ if len(Protocol.GetCName()) > LeftOffset:\r
+ LeftOffset = len(Protocol.GetCName())\r
+\r
for Protocol in Package.GetProtocolList():\r
#\r
# Generate generic comment\r
Statement = CommentStr \r
CName = Protocol.GetCName()\r
Value = GuidStringToGuidStructureString(Protocol.GetGuid())\r
- Statement += CName + ' = ' + Value\r
+ Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
\r
#\r
# generate tail comment\r
else:\r
NewSectionDict[SortedArch] = [Statement] \r
\r
- Content += GenSection('Protocols', NewSectionDict) \r
+ Content += GenSection('Protocols', NewSectionDict, True, True) \r
\r
#\r
# generate [Ppis] section\r
#\r
NewSectionDict = {}\r
+ LeftOffset = 46\r
+ # Get the line offset need\r
+ # If the real one < the min one, use the min one\r
+ # else use the real one\r
+ for Ppi in Package.GetPpiList():\r
+ if len(Ppi.GetCName()) > LeftOffset:\r
+ LeftOffset = len(Ppi.GetCName())\r
+\r
for Ppi in Package.GetPpiList():\r
#\r
# Generate generic comment\r
Statement = CommentStr\r
CName = Ppi.GetCName()\r
Value = GuidStringToGuidStructureString(Ppi.GetGuid())\r
- Statement += CName + ' = ' + Value\r
+ Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
\r
#\r
# generate tail comment\r
else:\r
NewSectionDict[SortedArch] = [Statement] \r
\r
- Content += GenSection('Ppis', NewSectionDict)\r
+ Content += GenSection('Ppis', NewSectionDict, True, True)\r
\r
return Content\r
\r
#\r
# @param Package: A Package \r
#\r
-def PackageToDec(Package):\r
+def PackageToDec(Package, DistHeader = None):\r
#\r
# Init global information for the file\r
#\r
ContainerFile = Package.GetFullPath()\r
\r
Content = ''\r
+ \r
#\r
- # generate header comment section\r
+ # Generate file header \r
#\r
- Content += GenHeaderCommentSection(Package.GetAbstract(), \\r
- Package.GetDescription(), \\r
- Package.GetCopyright(), \\r
- Package.GetLicense())\r
- \r
+ PackageAbstract = GetLocalValue(Package.GetAbstract())\r
+ PackageDescription = GetLocalValue(Package.GetDescription())\r
+ PackageCopyright = ''\r
+ PackageLicense = ''\r
+ for (Lang, Copyright) in Package.GetCopyright():\r
+ if Lang:\r
+ pass\r
+ PackageCopyright = Copyright\r
+ for (Lang, License) in Package.GetLicense():\r
+ if Lang:\r
+ pass\r
+ PackageLicense = License\r
+ if not PackageAbstract and DistHeader:\r
+ PackageAbstract = GetLocalValue(DistHeader.GetAbstract())\r
+ if not PackageDescription and DistHeader:\r
+ PackageDescription = GetLocalValue(DistHeader.GetDescription())\r
+ if not PackageCopyright and DistHeader:\r
+ for (Lang, Copyright) in DistHeader.GetCopyright():\r
+ PackageCopyright = Copyright\r
+ if not PackageLicense and DistHeader:\r
+ for (Lang, License) in DistHeader.GetLicense():\r
+ PackageLicense = License\r
+ \r
+ #\r
+ # Generate header comment section of DEC file\r
+ #\r
+ Content += GenHeaderCommentSection(PackageAbstract, \\r
+ PackageDescription, \\r
+ PackageCopyright, \\r
+ PackageLicense)\r
+\r
+ #\r
+ # Generate Binary header \r
+ #\r
+ for UserExtension in Package.GetUserExtensionList():\r
+ if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
+ and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
+ PackageBinaryAbstract = GetLocalValue(UserExtension.GetBinaryAbstract())\r
+ PackageBinaryDescription = GetLocalValue(UserExtension.GetBinaryDescription())\r
+ PackageBinaryCopyright = ''\r
+ PackageBinaryLicense = ''\r
+ for (Lang, Copyright) in UserExtension.GetBinaryCopyright():\r
+ PackageBinaryCopyright = Copyright\r
+ for (Lang, License) in UserExtension.GetBinaryLicense():\r
+ PackageBinaryLicense = License \r
+ if PackageBinaryAbstract and PackageBinaryDescription and \\r
+ PackageBinaryCopyright and PackageBinaryLicense:\r
+ Content += GenHeaderCommentSection(PackageBinaryAbstract, \r
+ PackageBinaryDescription, \r
+ PackageBinaryCopyright, \r
+ PackageBinaryLicense,\r
+ True)\r
+\r
+ #\r
+ # Generate PACKAGE_UNI_FILE for the Package\r
+ #\r
+ FileHeader = GenHeaderCommentSection(PackageAbstract, PackageDescription, PackageCopyright, PackageLicense, False, \\r
+ TAB_COMMENT_EDK1_SPLIT)\r
+ GenPackageUNIEncodeFile(Package, FileHeader)\r
+\r
#\r
# for each section, maintain a dict, sorted arch will be its key, \r
#statement list will be its data\r
#\r
# generate [Defines] section \r
#\r
+ LeftOffset = 31\r
NewSectionDict = {TAB_ARCH_COMMON : []}\r
SpecialItemList = []\r
\r
- Statement = '%s = %s' % (TAB_DEC_DEFINES_DEC_SPECIFICATION, '0x00010017')\r
+ Statement = (u'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION).ljust(LeftOffset) + u'= %s' % '0x00010017'\r
SpecialItemList.append(Statement)\r
\r
BaseName = Package.GetBaseName()\r
if BaseName.startswith('.') or BaseName.startswith('-'):\r
BaseName = '_' + BaseName\r
- Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_NAME, BaseName)\r
+ Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_NAME).ljust(LeftOffset) + u'= %s' % BaseName\r
SpecialItemList.append(Statement)\r
- Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_VERSION, Package.GetVersion())\r
+\r
+ Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION).ljust(LeftOffset) + u'= %s' % Package.GetVersion()\r
SpecialItemList.append(Statement)\r
- Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_GUID, Package.GetGuid())\r
- SpecialItemList.append(Statement) \r
+\r
+ Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID).ljust(LeftOffset) + u'= %s' % Package.GetGuid()\r
+ SpecialItemList.append(Statement)\r
+\r
+ if Package.UNIFlag:\r
+ Statement = (u'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE).ljust(LeftOffset) + u'= %s' % Package.GetBaseName() + '.uni'\r
+ SpecialItemList.append(Statement) \r
+\r
for SortedArch in NewSectionDict:\r
NewSectionDict[SortedArch] = \\r
NewSectionDict[SortedArch] + SpecialItemList\r
else:\r
NewSectionDict[SortedArch] = [ConvertPath(Statement)]\r
\r
- Content += GenSection('Includes', NewSectionDict) \r
+ Content += GenSection('Includes', NewSectionDict)\r
\r
+ #\r
+ # generate [guids][protocols][ppis] sections\r
+ #\r
Content = GenGuidProtocolPpi(Package, Content)\r
\r
#\r
HelpTextList = LibraryClass.GetHelpTextList()\r
HelpStr = _GetHelpStr(HelpTextList)\r
if HelpStr:\r
- HelpStr = '@libraryclass ' + HelpStr\r
- CommentStr = GenGenericCommentF(HelpStr, 2)\r
+ HelpStr = '@libraryclass' + HelpStr\r
+ CommentStr = GenGenericCommentF(HelpStr, 2, False, True)\r
\r
Statement = CommentStr\r
Name = LibraryClass.GetLibraryClass()\r
else:\r
NewSectionDict[SortedArch] = [Statement] \r
\r
- Content += GenSection('LibraryClasses', NewSectionDict)\r
+ Content += GenSection('LibraryClasses', NewSectionDict, True, True)\r
\r
- Content = GenPcd(Package, Content)\r
+ #\r
+ # Generate '# [Error.<TokenSpcCName>]' section\r
+ #\r
+ Content = GenPcdErrorMsgSection(Package, Content)\r
\r
+ Content = GenPcd(Package, Content)\r
+\r
#\r
# generate [UserExtensions] section\r
#\r
NewSectionDict = {}\r
for UserExtension in Package.GetUserExtensionList():\r
+ if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID and \\r
+ UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
+ continue\r
Statement = UserExtension.GetStatement()\r
if not Statement:\r
continue\r
+ else:\r
+ LineList = Statement.split('\n')\r
+ NewStatement = ""\r
+ for Line in LineList:\r
+ NewStatement += " %s\n" % Line\r
\r
SectionList = []\r
SectionName = 'UserExtensions'\r
SectionList.append(SectionName + '.' + Arch)\r
SectionName = ', '.join(SectionList)\r
SectionName = ''.join(['[', SectionName, ']\n'])\r
- Content += '\n\n' + SectionName + Statement\r
+ Content += '\n' + SectionName + NewStatement\r
\r
SaveFileOnChange(ContainerFile, Content, False)\r
+ if DistHeader.ReadOnly:\r
+ os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)\r
+ else:\r
+ os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)\r
return ContainerFile\r
\r
+## GenPackageUNIEncodeFile\r
+# GenPackageUNIEncodeFile, default is a UCS-2LE encode file\r
+#\r
+def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCODING_UTF16LE):\r
+ GenUNIFlag = False\r
+ OnlyLANGUAGE_EN_X = True\r
+ BinaryAbstract = []\r
+ BinaryDescription = []\r
+ #\r
+ # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE, \r
+ # then the PACKAGE_UNI_FILE must be created.\r
+ #\r
+ for (Key, Value) in PackageObject.GetAbstract() + PackageObject.GetDescription():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ \r
+ for UserExtension in PackageObject.GetUserExtensionList():\r
+ if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
+ and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
+ for (Key, Value) in UserExtension.GetBinaryAbstract():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ BinaryAbstract.append((Key, Value))\r
+\r
+ for (Key, Value) in UserExtension.GetBinaryDescription():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ BinaryDescription.append((Key, Value))\r
+\r
+ for Pcd in PackageObject.GetPcdList():\r
+ for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList():\r
+ if TxtObj.GetLang() == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ \r
+ for PcdError in Pcd.GetPcdErrorsList():\r
+ if PcdError.GetErrorNumber().startswith('0x') or PcdError.GetErrorNumber().startswith('0X'):\r
+ for (Key, Value) in PcdError.GetErrorMessageList():\r
+ if Key == TAB_LANGUAGE_EN_X:\r
+ GenUNIFlag = True\r
+ else:\r
+ OnlyLANGUAGE_EN_X = False\r
+ if not GenUNIFlag:\r
+ return\r
+ elif OnlyLANGUAGE_EN_X:\r
+ return\r
+ else:\r
+ PackageObject.UNIFlag = True\r
+ \r
+ if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())):\r
+ os.makedirs(os.path.dirname(PackageObject.GetFullPath()))\r
+ ContainerFile = os.path.normpath(os.path.join(os.path.dirname(PackageObject.GetFullPath()), \r
+ (PackageObject.GetBaseName() + '.uni')))\r
+ \r
+ Content = UniFileHeader + os.linesep\r
+ Content += os.linesep\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) \\r
+ + os.linesep\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \\r
+ + os.linesep\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) \\r
+ + os.linesep\r
+ \r
+ Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) \\r
+ + os.linesep\r
+ \r
+ PromptGenList = []\r
+ HelpTextGenList = [] \r
+ for Pcd in PackageObject.GetPcdList():\r
+ # Generate Prompt for each Pcd\r
+ PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_PROMPT '\r
+ TokenValueList = []\r
+ for TxtObj in Pcd.GetPromptList():\r
+ Lang = TxtObj.GetLang()\r
+ PromptStr = TxtObj.GetString()\r
+ #\r
+ # Avoid generating the same PROMPT entry more than one time. \r
+ #\r
+ if (PcdPromptStrName, Lang) not in PromptGenList:\r
+ TokenValueList.append((Lang, PromptStr))\r
+ PromptGenList.append((PcdPromptStrName, Lang))\r
+ PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + os.linesep\r
+ if PromptString not in Content:\r
+ Content += PromptString\r
+ \r
+ # Generate Help String for each Pcd\r
+ PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_HELP '\r
+ TokenValueList = []\r
+ for TxtObj in Pcd.GetHelpTextList():\r
+ Lang = TxtObj.GetLang()\r
+ HelpStr = TxtObj.GetString()\r
+ #\r
+ # Avoid generating the same HELP entry more than one time. \r
+ #\r
+ if (PcdHelpStrName, Lang) not in HelpTextGenList:\r
+ TokenValueList.append((Lang, HelpStr))\r
+ HelpTextGenList.append((PcdHelpStrName, Lang))\r
+ HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + os.linesep\r
+ if HelpTextString not in Content:\r
+ Content += HelpTextString\r
+ \r
+ # Generate PcdError for each Pcd if ErrorNo exist.\r
+ for PcdError in Pcd.GetPcdErrorsList():\r
+ ErrorNo = PcdError.GetErrorNumber()\r
+ if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith(TAB_CAPHEX_START):\r
+ PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \\r
+ + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \\r
+ + TAB_UNDERLINE_SPLIT + ErrorNo[2:]\r
+ PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + os.linesep\r
+ if PcdErrString not in Content:\r
+ Content += PcdErrString\r
+ \r
+ File = codecs.open(ContainerFile, 'w', Encoding)\r
+ File.write(u'\uFEFF' + Content)\r
+ File.stream.close()\r
+ Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read())\r
+ Md5Sum = Md5Sigature.hexdigest()\r
+ if (ContainerFile, Md5Sum) not in PackageObject.FileList:\r
+ PackageObject.FileList.append((ContainerFile, Md5Sum))\r
+\r
+ return ContainerFile\r
+ \r
## GenPcdErrComment\r
#\r
# @param PcdErrObject: PcdErrorObject\r
# @retval CommentStr: Generated comment lines, with prefix "#"\r
# \r
def GenPcdErrComment (PcdErrObject):\r
- EndOfLine = "\n" \r
+ CommentStr = '' \r
+ ErrorCode = PcdErrObject.GetErrorNumber()\r
ValidValueRange = PcdErrObject.GetValidValueRange()\r
if ValidValueRange:\r
- CommentStr = "# @ValidRange " + ValidValueRange + EndOfLine\r
+ CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDRANGE + TAB_SPACE_SPLIT \r
+ if ErrorCode:\r
+ CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
+ CommentStr += ValidValueRange + END_OF_LINE\r
\r
ValidValue = PcdErrObject.GetValidValue()\r
if ValidValue:\r
ValidValueList = \\r
[Value for Value in ValidValue.split(TAB_SPACE_SPLIT) if Value]\r
- CommentStr = \\r
- "# @ValidList " + TAB_COMMA_SPLIT.join(ValidValueList) + EndOfLine\r
+ CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDLIST + TAB_SPACE_SPLIT\r
+ if ErrorCode:\r
+ CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
+ CommentStr += TAB_COMMA_SPLIT.join(ValidValueList) + END_OF_LINE\r
\r
Expression = PcdErrObject.GetExpression()\r
if Expression:\r
- CommentStr = "# @Expression " + Expression + EndOfLine\r
+ CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_EXPRESSION + TAB_SPACE_SPLIT\r
+ if ErrorCode:\r
+ CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
+ CommentStr += Expression + END_OF_LINE\r
\r
return CommentStr\r
\r