]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py
BaseTools: Replace StandardError with Expression
[mirror_edk2.git] / BaseTools / Source / Python / UPT / PomAdapter / DecPomAlignment.py
index cb8aa187881bbc1ef1e59bb794e346cdc99ca9e2..074aa311f31da7e9574a8a7245c450d5e27d6353 100644 (file)
@@ -1,7 +1,7 @@
 ## @file DecPomAlignment.py\r
 # This file contained the adapter for convert INF parser object to POM Object\r
 #\r
 ## @file DecPomAlignment.py\r
 # This file contained the adapter for convert INF parser object to POM Object\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2016, 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
 # 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
@@ -15,6 +15,7 @@
 '''\r
 DecPomAlignment\r
 '''\r
 '''\r
 DecPomAlignment\r
 '''\r
+from __future__ import print_function\r
 \r
 ##\r
 # Import Modules\r
 \r
 ##\r
 # Import Modules\r
@@ -23,9 +24,11 @@ import os.path
 from os import sep\r
 import platform\r
 \r
 from os import sep\r
 import platform\r
 \r
+import re\r
 import Logger.Log as Logger\r
 from Logger import StringTable as ST\r
 from Logger.ToolError import UPT_MUL_DEC_ERROR\r
 import Logger.Log as Logger\r
 from Logger import StringTable as ST\r
 from Logger.ToolError import UPT_MUL_DEC_ERROR\r
+from Logger.ToolError import FORMAT_INVALID\r
 \r
 from Library.Parsing import NormPath\r
 from Library.DataType import ARCH_LIST\r
 \r
 from Library.Parsing import NormPath\r
 from Library.DataType import ARCH_LIST\r
@@ -36,10 +39,9 @@ from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
 from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
 from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
+from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
 from Library.DataType import TAB_ARCH_COMMON\r
 from Library.DataType import TAB_ARCH_COMMON\r
-from Library.CommentParsing import ParseHeaderCommentSection\r
 from Library.DataType import TAB_INCLUDES\r
 from Library.DataType import TAB_INCLUDES\r
-from Library.CommentParsing import ParseGenericComment\r
 from Library.DataType import TAB_LIBRARY_CLASSES\r
 from Library.DataType import TAB_PCDS\r
 from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL\r
 from Library.DataType import TAB_LIBRARY_CLASSES\r
 from Library.DataType import TAB_PCDS\r
 from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL\r
@@ -49,12 +51,34 @@ from Library.DataType import TAB_PCDS_DYNAMIC_EX_NULL
 from Library.DataType import TAB_PCDS_DYNAMIC_NULL\r
 from Library.DataType import TAB_PTR_TYPE_PCD\r
 from Library.DataType import ITEM_UNDEFINED\r
 from Library.DataType import TAB_PCDS_DYNAMIC_NULL\r
 from Library.DataType import TAB_PTR_TYPE_PCD\r
 from Library.DataType import ITEM_UNDEFINED\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_US\r
+from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
+from Library.DataType import TAB_BINARY_HEADER_USERID\r
+from Library.DataType import TAB_LANGUAGE_EN_X\r
+from Library.DataType import TAB_LANGUAGE_EN\r
+from Library.DataType import TAB_STR_TOKENCNAME\r
+from Library.DataType import TAB_STR_TOKENPROMPT\r
+from Library.DataType import TAB_STR_TOKENHELP\r
+from Library.DataType import TAB_STR_TOKENERR\r
+from Library.DataType import TAB_HEX_START\r
+from Library.DataType import TAB_SPLIT\r
+import Library.DataType as DT\r
+from Library.CommentParsing import ParseHeaderCommentSection\r
+from Library.CommentParsing import ParseGenericComment\r
 from Library.CommentParsing import ParseDecPcdGenericComment\r
 from Library.CommentParsing import ParseDecPcdTailComment\r
 from Library.Misc import GetFiles\r
 from Library.Misc import Sdict\r
 from Library.CommentParsing import ParseDecPcdGenericComment\r
 from Library.CommentParsing import ParseDecPcdTailComment\r
 from Library.Misc import GetFiles\r
 from Library.Misc import Sdict\r
+from Library.Misc import GetRelativePath\r
+from Library.Misc import PathClass\r
+from Library.Misc import ValidateUNIFilePath\r
+from Library.UniClassObject import UniFileClassObject\r
+from Library.UniClassObject import ConvertSpecialUnicodes\r
+from Library.UniClassObject import GetLanguageCode1766\r
+from Library.ParserValidate import IsValidPath\r
 from Parser.DecParser import Dec\r
 from Parser.DecParser import Dec\r
-\r
 from Object.POM.PackageObject import PackageObject\r
 from Object.POM.CommonObject import UserExtensionObject\r
 from Object.POM.CommonObject import IncludeObject\r
 from Object.POM.PackageObject import PackageObject\r
 from Object.POM.CommonObject import UserExtensionObject\r
 from Object.POM.CommonObject import IncludeObject\r
@@ -64,6 +88,8 @@ from Object.POM.CommonObject import PpiObject
 from Object.POM.CommonObject import LibraryClassObject\r
 from Object.POM.CommonObject import PcdObject\r
 from Object.POM.CommonObject import TextObject\r
 from Object.POM.CommonObject import LibraryClassObject\r
 from Object.POM.CommonObject import PcdObject\r
 from Object.POM.CommonObject import TextObject\r
+from Object.POM.CommonObject import MiscFileObject\r
+from Object.POM.CommonObject import FileObject\r
 \r
 \r
 ## DecPomAlignment\r
 \r
 \r
 ## DecPomAlignment\r
@@ -78,6 +104,8 @@ class DecPomAlignment(PackageObject):
         self.SupArchList = ARCH_LIST\r
         self.CheckMulDec = CheckMulDec\r
         self.DecParser = None\r
         self.SupArchList = ARCH_LIST\r
         self.CheckMulDec = CheckMulDec\r
         self.DecParser = None\r
+        self.UniFileClassObject = None\r
+        self.PcdDefaultValueDict = {}\r
         \r
         #\r
         # Load Dec file\r
         \r
         #\r
         # Load Dec file\r
@@ -104,8 +132,8 @@ class DecPomAlignment(PackageObject):
         self.SetFullPath(Filename)\r
         self.SetRelaPath(Path)\r
         self.SetFileName(Name)\r
         self.SetFullPath(Filename)\r
         self.SetRelaPath(Path)\r
         self.SetFileName(Name)\r
-        self.SetPackagePath(Path[Path.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
-        self.SetCombinePath(Filename[Filename.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
+        self.SetPackagePath(GetRelativePath(Path, self.WorkspaceDir))   \r
+        self.SetCombinePath(GetRelativePath(Filename, self.WorkspaceDir))\r
         \r
         self.DecParser = Dec(Filename)\r
     \r
         \r
         self.DecParser = Dec(Filename)\r
     \r
@@ -164,8 +192,8 @@ class DecPomAlignment(PackageObject):
         # Generate user extensions\r
         #\r
         self.GenUserExtensions()\r
         # Generate user extensions\r
         #\r
         self.GenUserExtensions()\r
-    \r
-    ## Generate user extention\r
+        \r
+    ## Generate user extension\r
     #\r
     #\r
     def GenUserExtensions(self):\r
     #\r
     #\r
     def GenUserExtensions(self):\r
@@ -182,6 +210,11 @@ class DecPomAlignment(PackageObject):
             Identifier = Item.IdString\r
             if Identifier.startswith('"') and Identifier.endswith('"'):\r
                 Identifier = Identifier[1:-1]\r
             Identifier = Item.IdString\r
             if Identifier.startswith('"') and Identifier.endswith('"'):\r
                 Identifier = Identifier[1:-1]\r
+            #\r
+            # Generate miscellaneous files of DEC file\r
+            #\r
+            if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
+                self.GenMiscFiles(Item.UserString)\r
             UserExtension.SetIdentifier(Identifier)\r
             UserExtension.SetStatement(Item.UserString)\r
             UserExtension.SetSupArchList(\r
             UserExtension.SetIdentifier(Identifier)\r
             UserExtension.SetStatement(Item.UserString)\r
             UserExtension.SetSupArchList(\r
@@ -190,7 +223,39 @@ class DecPomAlignment(PackageObject):
             self.SetUserExtensionList(\r
                 self.GetUserExtensionList() + [UserExtension]\r
             )\r
             self.SetUserExtensionList(\r
                 self.GetUserExtensionList() + [UserExtension]\r
             )\r
-    \r
+\r
+        # Add Private sections to UserExtension\r
+        if self.DecParser.GetPrivateSections():\r
+            PrivateUserExtension = UserExtensionObject()\r
+            PrivateUserExtension.SetStatement(self.DecParser.GetPrivateSections())\r
+            PrivateUserExtension.SetIdentifier(DT.TAB_PRIVATE)\r
+            PrivateUserExtension.SetUserID(DT.TAB_INTEL)\r
+            self.SetUserExtensionList(self.GetUserExtensionList() + [PrivateUserExtension])\r
+            \r
+    ## Generate miscellaneous files on DEC file\r
+    #\r
+    #\r
+    def GenMiscFiles(self, Content):\r
+        MiscFileObj = MiscFileObject()\r
+        for Line in Content.splitlines():\r
+            FileName = ''\r
+            if '#' in Line:\r
+                FileName = Line[:Line.find('#')]\r
+            else:\r
+                FileName = Line\r
+            if FileName:\r
+                if IsValidPath(FileName, self.GetRelaPath()):\r
+                    FileObj = FileObject()\r
+                    FileObj.SetURI(FileName)\r
+                    MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r
+                else:\r
+                    Logger.Error("InfParser", \r
+                                 FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r
+                                 File=self.GetFileName(),\r
+                                 ExtraData=Line)   \r
+        self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r
+        \r
     ## Generate Package Header\r
     #\r
     # Gen Package Header of Dec as <Key> = <Value>\r
     ## Generate Package Header\r
     #\r
     # Gen Package Header of Dec as <Key> = <Value>\r
@@ -210,7 +275,8 @@ class DecPomAlignment(PackageObject):
             # put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION\r
             #\r
             SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \\r
             # put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION\r
             #\r
             SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \\r
-                TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, TAB_DEC_DEFINES_DEC_SPECIFICATION]\r
+                TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, \\r
+                TAB_DEC_DEFINES_DEC_SPECIFICATION, TAB_DEC_DEFINES_PKG_UNI_FILE]\r
             if Item.Key in SkipItemList:\r
                 continue\r
             DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON\r
             if Item.Key in SkipItemList:\r
                 continue\r
             DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON\r
@@ -221,6 +287,12 @@ class DecPomAlignment(PackageObject):
 #                     DefObj.GetPackageVersion())\r
         self.SetName(os.path.splitext(self.GetFileName())[0])\r
         self.SetGuid(DefObj.GetPackageGuid())\r
 #                     DefObj.GetPackageVersion())\r
         self.SetName(os.path.splitext(self.GetFileName())[0])\r
         self.SetGuid(DefObj.GetPackageGuid())\r
+        if DefObj.GetPackageUniFile():\r
+            ValidateUNIFilePath(DefObj.GetPackageUniFile())\r
+            self.UniFileClassObject = \\r
+            UniFileClassObject([PathClass(os.path.join(DefObj.GetPackagePath(), DefObj.GetPackageUniFile()))])\r
+        else:\r
+            self.UniFileClassObject = None\r
      \r
         if DefinesDict:\r
             UserExtension = UserExtensionObject()\r
      \r
         if DefinesDict:\r
             UserExtension = UserExtensionObject()\r
@@ -232,16 +304,80 @@ class DecPomAlignment(PackageObject):
             )\r
 \r
         #\r
             )\r
 \r
         #\r
-        # Get All header comment section information\r
+        # Get File header information\r
         #\r
         #\r
+        if self.UniFileClassObject:\r
+            Lang = TAB_LANGUAGE_EN_X\r
+        else:\r
+            Lang = TAB_LANGUAGE_EN_US\r
         Abstract, Description, Copyright, License = \\r
             ParseHeaderCommentSection(self.DecParser.GetHeadComment(),\r
                                       ContainerFile)\r
         Abstract, Description, Copyright, License = \\r
             ParseHeaderCommentSection(self.DecParser.GetHeadComment(),\r
                                       ContainerFile)\r
-        self.SetAbstract(Abstract)\r
-        self.SetDescription(Description)\r
-        self.SetCopyright(Copyright)\r
-        self.SetLicense(License)\r
+        if Abstract:\r
+            self.SetAbstract((Lang, Abstract))\r
+        if Description:\r
+            self.SetDescription((Lang, Description))\r
+        if Copyright:\r
+            self.SetCopyright(('', Copyright))\r
+        if License:\r
+            self.SetLicense(('', License))\r
     \r
     \r
+        #\r
+        # Get Binary header information\r
+        #\r
+        if self.DecParser.BinaryHeadComment:\r
+            Abstract, Description, Copyright, License = \\r
+                ParseHeaderCommentSection(self.DecParser.BinaryHeadComment,\r
+                                      ContainerFile, True)\r
+                \r
+            if not Abstract  or not Description or not Copyright or not License:\r
+                Logger.Error('MkPkg',\r
+                             FORMAT_INVALID,\r
+                             ST.ERR_INVALID_BINARYHEADER_FORMAT,\r
+                             ContainerFile)\r
+            else:\r
+                self.SetBinaryHeaderAbstract((Lang, Abstract))\r
+                self.SetBinaryHeaderDescription((Lang, Description))\r
+                self.SetBinaryHeaderCopyright(('', Copyright))\r
+                self.SetBinaryHeaderLicense(('', License))\r
+\r
+        BinaryAbstractList = []\r
+        BinaryDescriptionList = []\r
+        \r
+        #Get Binary header from UNI file\r
+        # Initialize the UniStrDict dictionary, top keys are language codes\r
+        UniStrDict = {}\r
+        if self.UniFileClassObject:\r
+            UniStrDict = self.UniFileClassObject.OrderedStringList\r
+            for Lang in UniStrDict:\r
+                for StringDefClassObject in UniStrDict[Lang]:\r
+                    Lang = GetLanguageCode1766(Lang)\r
+                    if StringDefClassObject.StringName == TAB_DEC_BINARY_ABSTRACT:\r
+                        if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
+                        not in self.GetBinaryHeaderAbstract():\r
+                            BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+                    if StringDefClassObject.StringName == TAB_DEC_BINARY_DESCRIPTION:\r
+                        if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
+                        not in self.GetBinaryHeaderDescription():\r
+                            BinaryDescriptionList.append((Lang, \r
+                                                          ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+        #Combine Binary header from DEC file and UNI file\r
+        BinaryAbstractList = self.GetBinaryHeaderAbstract() + BinaryAbstractList\r
+        BinaryDescriptionList = self.GetBinaryHeaderDescription() + BinaryDescriptionList\r
+        BinaryCopyrightList = self.GetBinaryHeaderCopyright()\r
+        BinaryLicenseList = self.GetBinaryHeaderLicense()\r
+        #Generate the UserExtensionObject for TianoCore."BinaryHeader"\r
+        if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
+            BinaryUserExtension = UserExtensionObject()\r
+            BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
+            BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
+            BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
+            BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
+            BinaryUserExtension.SetIdentifier(TAB_BINARY_HEADER_IDENTIFIER)\r
+            BinaryUserExtension.SetUserID(TAB_BINARY_HEADER_USERID)\r
+            self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
+            \r
+            \r
     ## GenIncludes\r
     #\r
     # Gen Includes of Dec\r
     ## GenIncludes\r
     #\r
     # Gen Includes of Dec\r
@@ -257,7 +393,7 @@ class DecPomAlignment(PackageObject):
         IncObj = self.DecParser.GetIncludeSectionObject()\r
         for Item in IncObj.GetAllIncludes():\r
             IncludePath = os.path.normpath(Item.File)\r
         IncObj = self.DecParser.GetIncludeSectionObject()\r
         for Item in IncObj.GetAllIncludes():\r
             IncludePath = os.path.normpath(Item.File)\r
-            if platform.system() != 'Windows':\r
+            if platform.system() != 'Windows' and platform.system() != 'Microsoft':\r
                 IncludePath = IncludePath.replace('\\', '/')\r
             if IncludePath in IncludesDict:\r
                 if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:\r
                 IncludePath = IncludePath.replace('\\', '/')\r
             if IncludePath in IncludesDict:\r
                 if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:\r
@@ -401,6 +537,8 @@ class DecPomAlignment(PackageObject):
             ListObject.SetGuid(Value)\r
             ListObject.SetSupArchList(Item.GetArchList())\r
             if HelpTxt:\r
             ListObject.SetGuid(Value)\r
             ListObject.SetSupArchList(Item.GetArchList())\r
             if HelpTxt:\r
+                if self.UniFileClassObject:\r
+                    HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
                 ListObject.SetHelpTextList([HelpTxt])\r
             \r
             DeclarationsList.append(ListObject)\r
                 ListObject.SetHelpTextList([HelpTxt])\r
             \r
             DeclarationsList.append(ListObject)\r
@@ -437,6 +575,8 @@ class DecPomAlignment(PackageObject):
             HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
                                           Item.GetTailComment(), None, '@libraryclass')\r
             if HelpTxt:\r
             HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
                                           Item.GetTailComment(), None, '@libraryclass')\r
             if HelpTxt:\r
+                if self.UniFileClassObject:\r
+                    HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
                 LibraryClass.SetHelpTextList([HelpTxt])\r
             LibraryClassDeclarations.append(LibraryClass)\r
         \r
                 LibraryClass.SetHelpTextList([HelpTxt])\r
             LibraryClassDeclarations.append(LibraryClass)\r
         \r
@@ -452,7 +592,6 @@ class DecPomAlignment(PackageObject):
     #\r
     def GenPcds(self, ContainerFile):\r
         Logger.Debug(2, "Generate %s ..." % TAB_PCDS)\r
     #\r
     def GenPcds(self, ContainerFile):\r
         Logger.Debug(2, "Generate %s ..." % TAB_PCDS)\r
-        \r
         PcdObj = self.DecParser.GetPcdSectionObject()\r
         #\r
         # Get all Pcds\r
         PcdObj = self.DecParser.GetPcdSectionObject()\r
         #\r
         # Get all Pcds\r
@@ -464,6 +603,37 @@ class DecPomAlignment(PackageObject):
             (TAB_PCDS_FEATURE_FLAG_NULL,        'FeaturePcd'),\r
             (TAB_PCDS_DYNAMIC_EX_NULL,          'PcdEx'), \r
             (TAB_PCDS_DYNAMIC_NULL,             'Pcd')]\r
             (TAB_PCDS_FEATURE_FLAG_NULL,        'FeaturePcd'),\r
             (TAB_PCDS_DYNAMIC_EX_NULL,          'PcdEx'), \r
             (TAB_PCDS_DYNAMIC_NULL,             'Pcd')]\r
+        \r
+        PromptStrList = []\r
+        HelpStrList = []\r
+        PcdErrStrList = []\r
+        # Initialize UniStrDict dictionary, top keys are language codes\r
+        UniStrDict = {}\r
+        StrList = []\r
+        \r
+        Language = ''\r
+        if self.UniFileClassObject:\r
+            Language = TAB_LANGUAGE_EN_X\r
+        else:\r
+            Language = TAB_LANGUAGE_EN_US\r
+            \r
+        if self.UniFileClassObject:\r
+            UniStrDict = self.UniFileClassObject.OrderedStringList\r
+            for Lang in UniStrDict:\r
+                for StringDefClassObject in UniStrDict[Lang]:\r
+                    StrList = StringDefClassObject.StringName.split('_')\r
+                    # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_PROMPT\r
+                    if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENPROMPT:\r
+                        PromptStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+                                              StringDefClassObject.StringValue))\r
+                    # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_HELP\r
+                    if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENHELP:\r
+                        HelpStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+                                            StringDefClassObject.StringValue))\r
+                    # StringName format is STR_<TOKENSPACECNAME>_ERR_##\r
+                    if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[2] == TAB_STR_TOKENERR:\r
+                        PcdErrStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+                                              StringDefClassObject.StringValue))\r
         #\r
         # For each PCD type\r
         #\r
         #\r
         # For each PCD type\r
         #\r
@@ -478,15 +648,234 @@ class DecPomAlignment(PackageObject):
                         ContainerFile,\r
                         (Item.TokenSpaceGuidCName, Item.TokenCName,\r
                         Item.DefaultValue, Item.DatumType, Item.TokenValue,\r
                         ContainerFile,\r
                         (Item.TokenSpaceGuidCName, Item.TokenCName,\r
                         Item.DefaultValue, Item.DatumType, Item.TokenValue,\r
-                        Type, Item.GetHeadComment(), Item.GetTailComment(),\r
-                        '')\r
-                    )\r
+                        Type, Item.GetHeadComment(), Item.GetTailComment(),''),\r
+                        Language,\r
+                        self.DecParser.GetDefineSectionMacro()\r
+                        )\r
                 PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))\r
                 PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))\r
+                \r
+                #\r
+                # Get PCD error message from PCD error comment section in DEC file\r
+                #\r
+                for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+                    if (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber()) \\r
+                        in self.DecParser.PcdErrorCommentDict:\r
+                        Key = (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber())\r
+                        PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
+                                                      [(Language, self.DecParser.PcdErrorCommentDict[Key])])\r
+                \r
+                for Index in range(0, len(PromptStrList)):\r
+                    StrNameList = PromptStrList[Index][1].split('_')\r
+                    if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+                    StrNameList[2].lower() == Item.TokenCName.lower():\r
+                        TxtObj = TextObject()\r
+                        TxtObj.SetLang(PromptStrList[Index][0])\r
+                        TxtObj.SetString(PromptStrList[Index][2])\r
+                        for Prompt in PcdDeclaration.GetPromptList():\r
+                            if Prompt.GetLang() == TxtObj.GetLang() and \\r
+                                Prompt.GetString() == TxtObj.GetString():\r
+                                break\r
+                        else:\r
+                            PcdDeclaration.SetPromptList(PcdDeclaration.GetPromptList() + [TxtObj])\r
+                        \r
+                for Index in range(0, len(HelpStrList)):\r
+                    StrNameList = HelpStrList[Index][1].split('_')\r
+                    if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+                    StrNameList[2].lower() == Item.TokenCName.lower():\r
+                        TxtObj = TextObject()\r
+                        TxtObj.SetLang(HelpStrList[Index][0])\r
+                        TxtObj.SetString(HelpStrList[Index][2])\r
+                        for HelpStrObj in PcdDeclaration.GetHelpTextList():\r
+                            if HelpStrObj.GetLang() == TxtObj.GetLang() and \\r
+                                HelpStrObj.GetString() == TxtObj.GetString():\r
+                                break\r
+                        else:\r
+                            PcdDeclaration.SetHelpTextList(PcdDeclaration.GetHelpTextList() + [TxtObj])\r
+\r
+                #\r
+                # Get PCD error message from UNI file\r
+                #\r
+                for Index in range(0, len(PcdErrStrList)):\r
+                    StrNameList = PcdErrStrList[Index][1].split('_')\r
+                    if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+                        StrNameList[2].lower() == TAB_STR_TOKENERR.lower():\r
+                        for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+                            if PcdErr.GetErrorNumber().lower() == (TAB_HEX_START + StrNameList[3]).lower() and \\r
+                                (PcdErrStrList[Index][0], PcdErrStrList[Index][2]) not in PcdErr.GetErrorMessageList():\r
+                                PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
+                                                            [(PcdErrStrList[Index][0], PcdErrStrList[Index][2])])\r
+                              \r
+                #\r
+                # Check to prevent missing error message if a Pcd has the error code.\r
+                #\r
+                for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+                    if PcdErr.GetErrorNumber().strip():\r
+                        if not PcdErr.GetErrorMessageList():\r
+                            Logger.Error('UPT',\r
+                                         FORMAT_INVALID,\r
+                                         ST.ERR_DECPARSE_PCD_UNMATCHED_ERRORCODE % PcdErr.GetErrorNumber(),\r
+                                         ContainerFile,\r
+                                         PcdErr.GetLineNum(),\r
+                                         PcdErr.GetFileLine())                        \r
+                    \r
                 PcdDeclarations.append(PcdDeclaration)\r
                 PcdDeclarations.append(PcdDeclaration)\r
-  \r
         self.SetPcdList(self.GetPcdList() + PcdDeclarations)\r
         self.SetPcdList(self.GetPcdList() + PcdDeclarations)\r
+        self.CheckPcdValue()\r
+        \r
+    ##\r
+    # Get error message via language\r
+    # @param ErrorMessageList: Error message tuple list the language and its message\r
+    # @param Lang: the language of setting\r
+    # @return: the error message described in the related UNI file\r
+    def GetEnErrorMessage(self, ErrorMessageList):\r
+        if self.FullPath:\r
+            pass\r
+        Lang = TAB_LANGUAGE_EN_US\r
+        for (Language, Message) in ErrorMessageList:\r
+            if Language == Lang:\r
+                return Message\r
+        for (Language, Message) in ErrorMessageList:\r
+            if Language.find(TAB_LANGUAGE_EN) >= 0:\r
+                return Message\r
+        else:\r
+            try:\r
+                return ErrorMessageList[0][1]\r
+            except IndexError:\r
+                return ''\r
+        return ''    \r
+        \r
+    ##\r
+    # Replace the strings for Python eval function.\r
+    # @param ReplaceValue: The string that needs to be replaced. \r
+    # @return: The string was replaced, then eval function is always making out it.     \r
+    def ReplaceForEval(self, ReplaceValue, IsRange=False, IsExpr=False):\r
+        if self.FullPath:\r
+            pass\r
+        #\r
+        # deal with "NOT EQ", "NOT LT", "NOT GT", "NOT LE", "NOT GE", "NOT NOT" \r
+        #\r
+        NOTNOT_Pattern = '[\t\s]*NOT[\t\s]+NOT[\t\s]*'\r
+        NOTGE_Pattern = '[\t\s]*NOT[\t\s]+GE[\t\s]*'\r
+        NOTLE_Pattern = '[\t\s]*NOT[\t\s]+LE[\t\s]*'\r
+        NOTGT_Pattern = '[\t\s]*NOT[\t\s]+GT[\t\s]*'\r
+        NOTLT_Pattern = '[\t\s]*NOT[\t\s]+LT[\t\s]*'\r
+        NOTEQ_Pattern = '[\t\s]*NOT[\t\s]+EQ[\t\s]*'\r
+        ReplaceValue = re.compile(NOTNOT_Pattern).sub('', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTLT_Pattern).sub('x >= ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTGT_Pattern).sub('x <= ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTLE_Pattern).sub('x > ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTGE_Pattern).sub('x < ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTEQ_Pattern).sub('x != ', ReplaceValue)\r
+        \r
+        if IsRange:\r
+            ReplaceValue = ReplaceValue.replace('EQ', 'x ==')\r
+            ReplaceValue = ReplaceValue.replace('LT', 'x <')\r
+            ReplaceValue = ReplaceValue.replace('LE', 'x <=')\r
+            ReplaceValue = ReplaceValue.replace('GT', 'x >')\r
+            ReplaceValue = ReplaceValue.replace('GE', 'x >=')\r
+            ReplaceValue = ReplaceValue.replace('XOR', 'x ^')\r
+        elif IsExpr:\r
+            ReplaceValue = ReplaceValue.replace('EQ', '==')\r
+            ReplaceValue = ReplaceValue.replace('NE', '!=')\r
+            ReplaceValue = ReplaceValue.replace('LT', '<')\r
+            ReplaceValue = ReplaceValue.replace('LE', '<=')\r
+            ReplaceValue = ReplaceValue.replace('GT', '>')\r
+            ReplaceValue = ReplaceValue.replace('GE', '>=')  \r
+            ReplaceValue = ReplaceValue.replace('XOR', '^')  \r
+            \r
+        ReplaceValue = ReplaceValue.replace('AND', 'and')\r
+        ReplaceValue = ReplaceValue.replace('&&', ' and ')\r
+        ReplaceValue = ReplaceValue.replace('xor', '^')\r
+        ReplaceValue = ReplaceValue.replace('OR', 'or')\r
+        ReplaceValue = ReplaceValue.replace('||', ' or ')\r
+        ReplaceValue = ReplaceValue.replace('NOT', 'not')\r
+        if ReplaceValue.find('!') >= 0 and ReplaceValue[ReplaceValue.index('!') + 1] != '=':\r
+            ReplaceValue = ReplaceValue.replace('!', ' not ')        \r
+        if '.' in ReplaceValue:\r
+            Pattern = '[a-zA-Z0-9]{1,}\.[a-zA-Z0-9]{1,}'\r
+            MatchedList = re.findall(Pattern, ReplaceValue)\r
+            for MatchedItem in MatchedList:\r
+                if MatchedItem not in self.PcdDefaultValueDict:\r
+                    Logger.Error("Dec File Parser", FORMAT_INVALID, Message=ST.ERR_DECPARSE_PCD_NODEFINED % MatchedItem,\r
+                                     File=self.FullPath)\r
+                    \r
+                ReplaceValue = ReplaceValue.replace(MatchedItem, self.PcdDefaultValueDict[MatchedItem])\r
+\r
+        return ReplaceValue\r
+\r
+    ##\r
+    # Check pcd's default value according to the pcd's description\r
+    #\r
+    def CheckPcdValue(self):\r
+        for Pcd in self.GetPcdList():\r
+            self.PcdDefaultValueDict[TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName())).strip()] = \\r
+            Pcd.GetDefaultValue()\r
+        \r
+        for Pcd in self.GetPcdList():\r
+            ValidationExpressions = []\r
+            PcdGuidName = TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()))\r
+            Valids = Pcd.GetPcdErrorsList()\r
+            for Valid in Valids:\r
+                Expression = Valid.GetExpression()\r
+                if Expression:\r
+                    #\r
+                    # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+                    #\r
+                    QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+                    QuotedMatchedObj = re.search(QUOTED_PATTERN, Expression)\r
+                    if QuotedMatchedObj:\r
+                        MatchedStr = QuotedMatchedObj.group().strip()\r
+                        if MatchedStr.startswith('L'):\r
+                            Expression = Expression.replace(MatchedStr, MatchedStr[1:].strip())  \r
+\r
+                    Expression = self.ReplaceForEval(Expression, IsExpr=True)\r
+                    Expression = Expression.replace(PcdGuidName, 'x')\r
+                    Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+                    ValidationExpressions.append((Expression, Message))                   \r
+                \r
+                ValidList = Valid.GetValidValue()\r
+                if ValidList:\r
+                    ValidValue = 'x in %s' % [eval(v) for v in ValidList.split(' ') if v]\r
+                    Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+                    ValidationExpressions.append((ValidValue, Message))\r
+                    \r
+                ValidValueRange = Valid.GetValidValueRange()                \r
+                if ValidValueRange:\r
+                    ValidValueRange = self.ReplaceForEval(ValidValueRange, IsRange=True)\r
+                    if ValidValueRange.find('-') >= 0:\r
+                        ValidValueRange = ValidValueRange.replace('-', '<= x <=')\r
+                    elif not ValidValueRange.startswith('x ') and not ValidValueRange.startswith('not ') \\r
+                        and not ValidValueRange.startswith('not(') and not ValidValueRange.startswith('('):\r
+                        ValidValueRange = 'x %s' % ValidValueRange\r
+                    Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+                    ValidationExpressions.append((ValidValueRange, Message))\r
+                    \r
+            DefaultValue = self.PcdDefaultValueDict[PcdGuidName.strip()]\r
+            #\r
+            # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+            #\r
+            QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+            QuotedMatchedObj = re.search(QUOTED_PATTERN, DefaultValue)\r
+            if QuotedMatchedObj:\r
+                MatchedStr = QuotedMatchedObj.group().strip()\r
+                if MatchedStr.startswith('L'):\r
+                    DefaultValue = DefaultValue.replace(MatchedStr, MatchedStr[1:].strip())\r
+                    \r
+            try:\r
+                DefaultValue = eval(DefaultValue.replace('TRUE', 'True').replace('true', 'True')\r
+                                        .replace('FALSE', 'False').replace('false', 'False'))\r
+            except BaseException:\r
+                pass\r
+\r
+            for (Expression, Msg) in ValidationExpressions:\r
+                try:\r
+                    if not eval(Expression, {'x':DefaultValue}):\r
+                        Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData='%s, value = %s' %\\r
+                                     (PcdGuidName, DefaultValue), Message=Msg, File=self.FullPath)\r
+                except TypeError:\r
+                    Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData=PcdGuidName, \\r
+                                    Message=Msg, File=self.FullPath)\r
 \r
 \r
-    \r
     ## GenModuleFileList\r
     #\r
     def GenModuleFileList(self, ContainerFile):        \r
     ## GenModuleFileList\r
     #\r
     def GenModuleFileList(self, ContainerFile):        \r
@@ -514,47 +903,47 @@ class DecPomAlignment(PackageObject):
     # Print all members and their values of Package class\r
     #\r
     def ShowPackage(self):\r
     # Print all members and their values of Package class\r
     #\r
     def ShowPackage(self):\r
-        print '\nName =', self.GetName()\r
-        print '\nBaseName =', self.GetBaseName()\r
-        print '\nVersion =', self.GetVersion() \r
-        print '\nGuid =', self.GetGuid()\r
+        print('\nName =', self.GetName())\r
+        print('\nBaseName =', self.GetBaseName())\r
+        print('\nVersion =', self.GetVersion())\r
+        print('\nGuid =', self.GetGuid())\r
         \r
         \r
-        print '\nStandardIncludes = %d ' \\r
-            % len(self.GetStandardIncludeFileList()),\r
+        print('\nStandardIncludes = %d ' \\r
+            % len(self.GetStandardIncludeFileList()), end=' ')\r
         for Item in self.GetStandardIncludeFileList():\r
         for Item in self.GetStandardIncludeFileList():\r
-            print Item.GetFilePath(), '  ', Item.GetSupArchList()\r
-        print '\nPackageIncludes = %d \n' \\r
-            % len(self.GetPackageIncludeFileList()),\r
+            print(Item.GetFilePath(), '  ', Item.GetSupArchList())\r
+        print('\nPackageIncludes = %d \n' \\r
+            % len(self.GetPackageIncludeFileList()), end=' ')\r
         for Item in self.GetPackageIncludeFileList():\r
         for Item in self.GetPackageIncludeFileList():\r
-            print Item.GetFilePath(), '  ', Item.GetSupArchList()\r
+            print(Item.GetFilePath(), '  ', Item.GetSupArchList())\r
              \r
              \r
-        print '\nGuids =', self.GetGuidList()\r
+        print('\nGuids =', self.GetGuidList())\r
         for Item in self.GetGuidList():\r
         for Item in self.GetGuidList():\r
-            print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
-        print '\nProtocols =', self.GetProtocolList()\r
+            print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
+        print('\nProtocols =', self.GetProtocolList())\r
         for Item in self.GetProtocolList():\r
         for Item in self.GetProtocolList():\r
-            print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
-        print '\nPpis =', self.GetPpiList()\r
+            print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
+        print('\nPpis =', self.GetPpiList())\r
         for Item in self.GetPpiList():\r
         for Item in self.GetPpiList():\r
-            print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()\r
-        print '\nLibraryClasses =', self.GetLibraryClassList()\r
+            print(Item.GetCName(), Item.GetGuid(), Item.GetSupArchList())\r
+        print('\nLibraryClasses =', self.GetLibraryClassList())\r
         for Item in self.GetLibraryClassList():\r
         for Item in self.GetLibraryClassList():\r
-            print Item.GetLibraryClass(), Item.GetRecommendedInstance(), \\r
-            Item.GetSupArchList()\r
-        print '\nPcds =', self.GetPcdList()\r
+            print(Item.GetLibraryClass(), Item.GetRecommendedInstance(), \\r
+            Item.GetSupArchList())\r
+        print('\nPcds =', self.GetPcdList())\r
         for Item in self.GetPcdList():\r
         for Item in self.GetPcdList():\r
-            print 'CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \\r
+            print('CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \\r
                 Item.GetTokenSpaceGuidCName(), \\r
                 'DefaultValue=', Item.GetDefaultValue(), \\r
                 'ValidUsage=', Item.GetValidUsage(), \\r
                 'SupArchList', Item.GetSupArchList(), \\r
                 Item.GetTokenSpaceGuidCName(), \\r
                 'DefaultValue=', Item.GetDefaultValue(), \\r
                 'ValidUsage=', Item.GetValidUsage(), \\r
                 'SupArchList', Item.GetSupArchList(), \\r
-                'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType()\r
+                'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType())\r
  \r
         for Item in self.GetMiscFileList():\r
  \r
         for Item in self.GetMiscFileList():\r
-            print Item.GetName()\r
+            print(Item.GetName())\r
             for FileObjectItem in Item.GetFileList():\r
             for FileObjectItem in Item.GetFileList():\r
-                print FileObjectItem.GetURI()\r
-        print '****************\n'\r
+                print(FileObjectItem.GetURI())\r
+        print('****************\n')\r
 \r
 ## GenPcdDeclaration\r
 #\r
 \r
 ## GenPcdDeclaration\r
 #\r
@@ -562,9 +951,11 @@ class DecPomAlignment(PackageObject):
 # @param PcdInfo:         Pcd information, of format (TokenGuidCName, \r
 #                         TokenName, Value, DatumType, Token, Type, \r
 #                         GenericComment, TailComment, Arch)\r
 # @param PcdInfo:         Pcd information, of format (TokenGuidCName, \r
 #                         TokenName, Value, DatumType, Token, Type, \r
 #                         GenericComment, TailComment, Arch)\r
+# @param Language: The language of HelpText, Prompt \r
 # \r
 # \r
-def GenPcdDeclaration(ContainerFile, PcdInfo):\r
+def GenPcdDeclaration(ContainerFile, PcdInfo, Language, MacroReplaceDict):\r
     HelpStr = ''\r
     HelpStr = ''\r
+    PromptStr = ''\r
     TailHelpStr = ''\r
     TokenGuidCName, TokenName, Value, DatumType, Token, Type, \\r
         GenericComment, TailComment, Arch = PcdInfo\r
     TailHelpStr = ''\r
     TokenGuidCName, TokenName, Value, DatumType, Token, Type, \\r
         GenericComment, TailComment, Arch = PcdInfo\r
@@ -585,10 +976,13 @@ def GenPcdDeclaration(ContainerFile, PcdInfo):
     Pcd.SetSupArchList(SupArchList)\r
     \r
     if GenericComment:\r
     Pcd.SetSupArchList(SupArchList)\r
     \r
     if GenericComment:\r
-        HelpStr, PcdErr = ParseDecPcdGenericComment(GenericComment, \r
-                                                    ContainerFile)\r
-        if PcdErr:\r
-            Pcd.SetPcdErrorsList([PcdErr])\r
+        HelpStr, PcdErrList, PromptStr = ParseDecPcdGenericComment(GenericComment, \r
+                                                                   ContainerFile, \r
+                                                                   TokenGuidCName, \r
+                                                                   TokenName,\r
+                                                                   MacroReplaceDict)\r
+        if PcdErrList:\r
+            Pcd.SetPcdErrorsList(PcdErrList)\r
 \r
     if TailComment:\r
         SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment, \r
 \r
     if TailComment:\r
         SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment, \r
@@ -600,8 +994,14 @@ def GenPcdDeclaration(ContainerFile, PcdInfo):
         HelpStr += '\n'\r
     HelpStr += TailHelpStr\r
     if HelpStr:\r
         HelpStr += '\n'\r
     HelpStr += TailHelpStr\r
     if HelpStr:\r
-        HelpTxtObj = TextObject()   \r
+        HelpTxtObj = TextObject()\r
+        HelpTxtObj.SetLang(Language)   \r
         HelpTxtObj.SetString(HelpStr)\r
         Pcd.SetHelpTextList([HelpTxtObj])\r
         HelpTxtObj.SetString(HelpStr)\r
         Pcd.SetHelpTextList([HelpTxtObj])\r
+    if PromptStr:\r
+        TxtObj = TextObject()\r
+        TxtObj.SetLang(Language)\r
+        TxtObj.SetString(PromptStr)\r
+        Pcd.SetPromptList([TxtObj])\r
 \r
     return Pcd\r
 \r
     return Pcd\r