]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
This patch is going to:
[mirror_edk2.git] / BaseTools / Source / Python / UPT / GenMetaFile / GenDecFile.py
index 575c216e589e55e0cd5557639d95bf4b25c87e25..d886958f97f1cd2d850380e3c9cf3c79cc76e4f0 100644 (file)
@@ -2,7 +2,7 @@
 #\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
@@ -25,14 +29,41 @@ from Library.CommentGenerating import _GetHelpStr
 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
@@ -47,12 +78,16 @@ def GenPcd(Package, Content):
         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
@@ -96,15 +131,61 @@ def GenPcd(Package, Content):
             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
@@ -116,7 +197,7 @@ def GenGuidProtocolPpi(Package, Content):
         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
@@ -131,12 +212,20 @@ def GenGuidProtocolPpi(Package, Content):
         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
@@ -148,7 +237,7 @@ def GenGuidProtocolPpi(Package, Content):
         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
@@ -164,12 +253,20 @@ def GenGuidProtocolPpi(Package, Content):
         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
@@ -181,7 +278,7 @@ def GenGuidProtocolPpi(Package, Content):
         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
@@ -197,7 +294,7 @@ def GenGuidProtocolPpi(Package, Content):
         else:\r
             NewSectionDict[SortedArch] = [Statement]            \r
 \r
-    Content += GenSection('Ppis', NewSectionDict)\r
+    Content += GenSection('Ppis', NewSectionDict, True, True)\r
     \r
     return Content\r
 \r
@@ -207,21 +304,77 @@ def GenGuidProtocolPpi(Package, Content):
 #\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
@@ -233,21 +386,29 @@ def PackageToDec(Package):
     #\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
@@ -269,8 +430,11 @@ def PackageToDec(Package):
             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
@@ -284,8 +448,8 @@ def PackageToDec(Package):
         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
@@ -306,18 +470,31 @@ def PackageToDec(Package):
         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
@@ -335,11 +512,147 @@ def PackageToDec(Package):
                 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
@@ -347,21 +660,30 @@ def PackageToDec(Package):
 #  @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