]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py
BaseTools/UPT: Fix an issue of storing wrong PCD into XML file.
[mirror_edk2.git] / BaseTools / Source / Python / UPT / PomAdapter / InfPomAlignment.py
index 20daff0d3293daf502accf88daf8b793f1129e2b..22e9ef5fc0a302bf5ca97db19edfc775b3f33062 100644 (file)
@@ -1,7 +1,7 @@
 ## @file InfPomAlignment.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 - 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
@@ -18,10 +18,8 @@ InfPomAlignment
 # Import modules\r
 #\r
 import os.path\r
-\r
 from Logger import StringTable as ST\r
 import Logger.Log as Logger\r
-\r
 from Library.String import FORMAT_INVALID\r
 from Library.String import PARSER_ERROR\r
 from Library.String import NormPath\r
@@ -29,10 +27,15 @@ from Library.String import GetSplitValueList
 from Library.Misc import ConvertVersionToDecimal\r
 from Library.Misc import GetHelpStringByRemoveHashKey\r
 from Library.Misc import ConvertArchList\r
+from Library.Misc import GetRelativePath\r
+from Library.Misc import PathClass\r
 from Library.Parsing import GetPkgInfoFromDec\r
+from Library.UniClassObject import UniFileClassObject\r
+from Library.UniClassObject import ConvertSpecialUnicodes\r
+from Library.UniClassObject import GetLanguageCode1766\r
 from Library import DataType as DT\r
 from Library import GlobalData\r
-\r
+from Library.ParserValidate import IsValidPath\r
 from Object.POM import CommonObject\r
 from Object.POM.ModuleObject import ModuleObject\r
 from Object.POM.ModuleObject import ExternObject\r
@@ -47,7 +50,7 @@ from Object.POM.ModuleObject import AsBuiltObject
 from PomAdapter.InfPomAlignmentMisc import GenModuleHeaderUserExt\r
 from PomAdapter.InfPomAlignmentMisc import GenBinaryData\r
 from Parser import InfParser\r
-\r
+from PomAdapter.DecPomAlignment import DecPomAlignment\r
 \r
 \r
 ## InfPomAlignment\r
@@ -62,7 +65,6 @@ class InfPomAlignment(ModuleObject):
     #\r
     def __init__(self, FileName, WorkSpace=None, PackagePath='', Skip=False):\r
         ModuleObject.__init__(self)\r
-\r
         self.Parser = None\r
         self.FileName = FileName\r
         self.WorkSpace = WorkSpace\r
@@ -72,7 +74,7 @@ class InfPomAlignment(ModuleObject):
         self.ModulePath = ''\r
         self.WorkspaceDir = " "\r
         self.CustomMakefile = []\r
-\r
+        self.UniFileClassObject = None\r
         self.SetPackagePath(PackagePath)\r
         #\r
         # Call GenInfPomObjects function to fill POM object.\r
@@ -80,8 +82,10 @@ class InfPomAlignment(ModuleObject):
         if Skip:\r
             OrigConfig = Logger.SUPRESS_ERROR\r
             Logger.SUPRESS_ERROR = True\r
-            self._GenInfPomObjects(Skip)\r
-            Logger.SUPRESS_ERROR = OrigConfig\r
+            try:\r
+                self._GenInfPomObjects(Skip)\r
+            finally:\r
+                Logger.SUPRESS_ERROR = OrigConfig\r
         else:\r
             self._GenInfPomObjects(Skip)\r
 \r
@@ -111,7 +115,6 @@ class InfPomAlignment(ModuleObject):
         self._GenGuidProtocolPpis(DT.TAB_PROTOCOLS)\r
         self._GenGuidProtocolPpis(DT.TAB_PPIS)\r
         self._GenDepexes()\r
-        self._GenMiscFiles(self.FullPath, Skip)\r
 \r
     ## Convert [Defines] section content to InfDefObject\r
     #\r
@@ -134,7 +137,6 @@ class InfPomAlignment(ModuleObject):
         ArchList = GetSplitValueList(ArchString, ' ')\r
         ArchList = ConvertArchList(ArchList)\r
         HasCalledFlag = False\r
-\r
         #\r
         # Get data from Sdict()\r
         #\r
@@ -147,26 +149,21 @@ class InfPomAlignment(ModuleObject):
         # ModuleSurfaceArea.Header.Name element\r
         #\r
         self.SetName(os.path.splitext(os.path.basename(self.FileName))[0])\r
-\r
         self.WorkspaceDir = " "\r
         #\r
         # CombinePath and ModulePath\r
         #\r
-        PathCount = self.FullPath.upper().find(self.WorkSpace.upper()) + len(self.WorkSpace) + 1\r
-        CombinePath = self.FullPath[PathCount:]\r
+        CombinePath = GetRelativePath(self.FullPath, self.WorkSpace)\r
         self.SetCombinePath(CombinePath)\r
-\r
         ModulePath = os.path.split(CombinePath)[0]\r
         ModuleRelativePath = ModulePath\r
         if self.GetPackagePath() != '':\r
-            ModuleRelativePath = ModulePath[ModulePath.find(self.GetPackagePath()) + len(self.GetPackagePath()) + 1:]\r
+            ModuleRelativePath = GetRelativePath(ModulePath, self.GetPackagePath())\r
         self.SetModulePath(ModuleRelativePath)\r
-\r
         #\r
         # For Define Seciton Items.\r
         #\r
         DefineObj = ValueList\r
-\r
         #\r
         # Convert UEFI/PI version to decimal number\r
         #\r
@@ -179,7 +176,6 @@ class InfPomAlignment(ModuleObject):
             __PiVersion = ConvertVersionToDecimal(__PiVersion)\r
 \r
             self.SetPiSpecificationVersion(str(__PiVersion))\r
-\r
         SpecList = DefineObj.GetSpecification()\r
         NewSpecList = []\r
         for SpecItem in SpecList:\r
@@ -214,6 +210,10 @@ class InfPomAlignment(ModuleObject):
                          ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("BASE_NAME"), File=self.FullPath)\r
         else:\r
             self.SetBaseName(DefineObj.GetBaseName().GetValue())\r
+        if DefineObj.GetModuleUniFileName():\r
+            self.UniFileClassObject = UniFileClassObject([PathClass(DefineObj.GetModuleUniFileName())])\r
+        else:\r
+            self.UniFileClassObject = None\r
         if DefineObj.GetInfVersion() == None:\r
             Logger.Error("InfParser", FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("INF_VERSION"), File=self.FullPath)\r
@@ -247,7 +247,6 @@ class InfPomAlignment(ModuleObject):
                 #\r
                 Logger.Error("Parser", PARSER_ERROR, ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, ExtraData=self.FullPath,\r
                              RaiseError=Logger.IS_RAISE_ERROR)\r
-\r
         #\r
         # if there is Shadow, Should judge the MODULE_TYPE in \r
         # SEC, PEI_CORE and PEIM\r
@@ -259,12 +258,10 @@ class InfPomAlignment(ModuleObject):
 \r
         if DefineObj.GetPcdIsDriver() != None:\r
             self.SetPcdIsDriver(DefineObj.GetPcdIsDriver().GetValue())\r
-\r
         #\r
         # LIBRARY_CLASS\r
         #\r
         self._GenModuleHeaderLibClass(DefineObj, ArchList)\r
-\r
         #\r
         # CUSTOM_MAKEFILE\r
         #\r
@@ -276,7 +273,6 @@ class InfPomAlignment(ModuleObject):
         if not HasCalledFlag:\r
             self._GenModuleHeaderExterns(DefineObj)\r
             HasCalledFlag = True\r
-\r
         #\r
         # each module has only one module header\r
         #\r
@@ -289,28 +285,45 @@ class InfPomAlignment(ModuleObject):
         # put all define statement into user-extension sections\r
         #     \r
         DefinesDictNew = GenModuleHeaderUserExt(DefineObj, ArchString)\r
-\r
         if DefinesDictNew:\r
             UserExtension = CommonObject.UserExtensionObject()\r
             UserExtension.SetDefinesDict(DefinesDictNew)\r
             UserExtension.SetIdentifier('DefineModifiers')\r
             UserExtension.SetUserID('EDK2')\r
             self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
-\r
         #\r
         # Get all meta-file header information\r
         # the record is list of items formated: \r
         # [LineValue, Arch, StartLine, ID, Third]\r
         #\r
-\r
         InfHeaderObj = self.Parser.InfHeader\r
         #\r
         # Put header information into POM object\r
         #\r
-        self.SetAbstract(InfHeaderObj.GetAbstract())\r
-        self.SetDescription(InfHeaderObj.GetDescription())\r
-        self.SetCopyright(InfHeaderObj.GetCopyright())\r
-        self.SetLicense(InfHeaderObj.GetLicense())\r
+        if self.UniFileClassObject:\r
+            Lang = DT.TAB_LANGUAGE_EN_X\r
+        else:\r
+            Lang = DT.TAB_LANGUAGE_EN_US\r
+        if InfHeaderObj.GetAbstract():\r
+            self.SetAbstract((Lang, InfHeaderObj.GetAbstract()))\r
+        if InfHeaderObj.GetDescription():\r
+            self.SetDescription((Lang, InfHeaderObj.GetDescription()))\r
+        if InfHeaderObj.GetCopyright():\r
+            self.SetCopyright(('', InfHeaderObj.GetCopyright()))\r
+        if InfHeaderObj.GetLicense():\r
+            self.SetLicense(('', InfHeaderObj.GetLicense()))\r
+        #\r
+        # Put Binary header information into POM object\r
+        #\r
+        InfBinaryHeaderObj = self.Parser.InfBinaryHeader\r
+        if InfBinaryHeaderObj.GetAbstract():\r
+            self.SetBinaryHeaderAbstract((Lang, InfBinaryHeaderObj.GetAbstract()))\r
+        if InfBinaryHeaderObj.GetDescription():\r
+            self.SetBinaryHeaderDescription((Lang, InfBinaryHeaderObj.GetDescription()))\r
+        if InfBinaryHeaderObj.GetCopyright():\r
+            self.SetBinaryHeaderCopyright(('', InfBinaryHeaderObj.GetCopyright()))\r
+        if InfBinaryHeaderObj.GetLicense():\r
+            self.SetBinaryHeaderLicense(('', InfBinaryHeaderObj.GetLicense()))\r
 \r
     ## GenModuleHeaderLibClass\r
     #\r
@@ -390,6 +403,8 @@ class InfPomAlignment(ModuleObject):
                     Hob.SetSupArchList(Item.GetSupArchList())\r
                     if Item.GetHelpString():\r
                         HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextObj.SetString(Item.GetHelpString())\r
                         Hob.SetHelpTextList([HelpTextObj])\r
                     HobList.append(Hob)\r
@@ -402,6 +417,8 @@ class InfPomAlignment(ModuleObject):
                     Event.SetUsage(Item.GetUsage())\r
                     if Item.GetHelpString():\r
                         HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextObj.SetString(Item.GetHelpString())\r
                         Event.SetHelpTextList([HelpTextObj])\r
                     EventList.append(Event)\r
@@ -414,6 +431,8 @@ class InfPomAlignment(ModuleObject):
                     BootMode.SetUsage(Item.GetUsage())\r
                     if Item.GetHelpString():\r
                         HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextObj.SetString(Item.GetHelpString())\r
                         BootMode.SetHelpTextList([HelpTextObj])\r
                     BootModeList.append(BootMode)\r
@@ -433,18 +452,14 @@ class InfPomAlignment(ModuleObject):
         BuildOptionsList = self.Parser.InfBuildOptionSection.GetBuildOptions()\r
         if not GlobalData.gIS_BINARY_INF:\r
             BuildOptionDict = {}\r
-\r
             for BuildOptionObj in BuildOptionsList:\r
                 ArchList = BuildOptionObj.GetSupArchList()\r
                 ArchList = ConvertArchList(ArchList)\r
                 BuildOptionsContent = BuildOptionObj.GetContent()\r
                 ArchString = ' '.join(ArchList)\r
-\r
                 if not BuildOptionsContent:\r
                     continue\r
-\r
                 BuildOptionDict[ArchString] = BuildOptionsContent\r
-\r
             if not BuildOptionDict:\r
                 return\r
             UserExtension = CommonObject.UserExtensionObject()\r
@@ -473,7 +488,6 @@ class InfPomAlignment(ModuleObject):
             #\r
             LibClassObj = self.Parser.InfLibraryClassSection.LibraryClasses\r
             Keys = LibClassObj.keys()\r
-\r
             for Key in Keys:\r
                 LibraryClassData = LibClassObj[Key]\r
                 for Item in LibraryClassData:\r
@@ -485,14 +499,14 @@ class InfPomAlignment(ModuleObject):
                     LibraryClass.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
                     LibraryClass.SetSupModuleList(Item.GetSupModuleList())\r
                     HelpStringObj = Item.GetHelpString()\r
-\r
                     if HelpStringObj != None:\r
                         CommentString = GetHelpStringByRemoveHashKey(HelpStringObj.HeaderComments +\r
                                                                      HelpStringObj.TailComments)\r
                         HelpTextHeaderObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextHeaderObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextHeaderObj.SetString(CommentString)\r
                         LibraryClass.SetHelpTextList([HelpTextHeaderObj])\r
-\r
                     self.SetLibraryClassList(self.GetLibraryClassList() + [LibraryClass])\r
 \r
     ## GenPackages\r
@@ -508,7 +522,6 @@ class InfPomAlignment(ModuleObject):
         # Get all Packages\r
         #\r
         PackageObj = self.Parser.InfPackageSection.Packages\r
-\r
         #\r
         # Go through each arch\r
         #\r
@@ -546,13 +559,11 @@ class InfPomAlignment(ModuleObject):
     def _GenPcds(self):\r
         if not GlobalData.gIS_BINARY_INF:\r
             Logger.Debug(2, "Generate %s ..." % DT.TAB_PCDS)\r
-\r
             #\r
             # Get all Pcds\r
             #\r
             PcdObj = self.Parser.InfPcdSection.Pcds\r
             KeysList = PcdObj.keys()\r
-\r
             #\r
             # Go through each arch\r
             #\r
@@ -571,6 +582,8 @@ class InfPomAlignment(ModuleObject):
                             Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
                             Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
                             HelpTextObj = CommonObject.TextObject()\r
+                            if self.UniFileClassObject:\r
+                                HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                             HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
                             Pcd.SetHelpTextList([HelpTextObj])\r
                             PcdList = self.GetPcdList()\r
@@ -636,11 +649,47 @@ class InfPomAlignment(ModuleObject):
                 Identifier = UserExtensionDataObj.GetIdString()\r
                 if Identifier.startswith('"') and Identifier.endswith('"'):\r
                     Identifier = Identifier[1:-1]\r
+                #\r
+                # Generate miscellaneous files on INF file\r
+                #\r
+                if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
+                    self._GenMiscFiles(UserExtensionDataObj.GetContent())\r
                 UserExtension.SetIdentifier(Identifier)\r
                 UserExtension.SetStatement(UserExtensionDataObj.GetContent())\r
                 UserExtension.SetSupArchList(ConvertArchList(UserExtensionDataObj.GetSupArchList()))\r
                 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
-\r
+                \r
+        #\r
+        #  Gen UserExtensions of TianoCore."BinaryHeader"\r
+        #\r
+        \r
+        #Get Binary header from INF file\r
+        BinaryAbstractList = self.BinaryHeaderAbstractList\r
+        BinaryDescriptionList = self.BinaryHeaderDescriptionList\r
+        BinaryCopyrightList = self.BinaryHeaderCopyrightList\r
+        BinaryLicenseList = self.BinaryHeaderLicenseList\r
+        #Get Binary header from UNI file\r
+        # Initialize UniStrDict, the 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 == DT.TAB_INF_BINARY_ABSTRACT:\r
+                        BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+                    if StringDefClassObject.StringName == DT.TAB_INF_BINARY_DESCRIPTION:\r
+                        BinaryDescriptionList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+        if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
+            BinaryUserExtension = CommonObject.UserExtensionObject()\r
+            BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
+            BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
+            BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
+            BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
+            BinaryUserExtension.SetIdentifier(DT.TAB_BINARY_HEADER_IDENTIFIER)\r
+            BinaryUserExtension.SetUserID(DT.TAB_BINARY_HEADER_USERID)\r
+            self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
+            \r
     def _GenDepexesList(self, SmmDepexList, DxeDepexList, PeiDepexList):\r
         if SmmDepexList:\r
             self.SetSmmDepex(SmmDepexList)\r
@@ -675,10 +724,14 @@ class InfPomAlignment(ModuleObject):
             ModuleType = Depex.GetModuleType()\r
             ModuleTypeList = []\r
             if IsLibraryClass:\r
-                if not self.GetIsLibraryModList():\r
+                if self.GetModuleType() == 'BASE' and not ModuleType:\r
+                    Logger.Error("\nMkPkg", PARSER_ERROR,\r
+                                 ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_BASE_LIBRARY_CLASS,\r
+                                 self.GetFullPath(), RaiseError=True)\r
+                if self.GetModuleType() != 'BASE' and not self.GetIsLibraryModList():\r
                     Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_LIBRARY_CLASS,\r
                                  self.GetFullPath(), RaiseError=True)\r
-                if ModuleType and ModuleType not in self.GetIsLibraryModList():\r
+                if self.GetModuleType() != 'BASE' and ModuleType and ModuleType not in self.GetIsLibraryModList():\r
                     Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
                                  self.GetFullPath(), RaiseError=True)\r
                 if ModuleType:\r
@@ -713,6 +766,8 @@ class InfPomAlignment(ModuleObject):
                 DepexIns.SetFeatureFlag(Depex.GetFeatureFlagExp())\r
                 if Depex.HelpString:\r
                     HelpIns = CommonObject.TextObject()\r
+                    if self.UniFileClassObject:\r
+                        HelpIns.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                     HelpIns.SetString(GetHelpStringByRemoveHashKey(Depex.HelpString))\r
                     DepexIns.SetHelpText(HelpIns)\r
 \r
@@ -750,7 +805,6 @@ class InfPomAlignment(ModuleObject):
         BinaryObj = self.Parser.InfBinariesSection.GetBinary()\r
 \r
         BinaryData = BinaryObj.keys()\r
-        BinaryData.sort()\r
 \r
         #\r
         # If the INF file does not contain a [Sources] section, and the INF file does contain a [Binaries] section, \r
@@ -772,6 +826,7 @@ class InfPomAlignment(ModuleObject):
             AsBuildLibIns = AsBuildLibraryClassObject()\r
             AsBuildLibIns.SetLibGuid(LibItem.GetFileGuid())\r
             AsBuildLibIns.SetLibVersion(LibItem.GetVersion())\r
+            AsBuildLibIns.SetSupArchList(LibItem.GetSupArchList())\r
             AsBuildLibraryClassList.append(AsBuildLibIns)\r
         AsBuildIns.SetLibraryInstancesList(AsBuildLibraryClassList)\r
 \r
@@ -779,7 +834,7 @@ class InfPomAlignment(ModuleObject):
         # BuildOption AsBuild Info\r
         #            \r
         for BuildOptionItem in self.Parser.InfBuildOptionSection.GetBuildOptions():\r
-            AsBuildBuildOptionList += BuildOptionItem.GetAsBuildList()\r
+            AsBuildBuildOptionList.append(BuildOptionItem)\r
         AsBuildIns.SetBuildFlagsList(AsBuildBuildOptionList)\r
 \r
         #\r
@@ -787,13 +842,34 @@ class InfPomAlignment(ModuleObject):
         #\r
         AsBuildIns = self._GenAsBuiltPcds(self.Parser.InfPcdSection.GetPcds(), AsBuildIns)\r
 \r
+        #\r
+        # Parse the DEC file that contains the GUID value of the GUID CName which is used by\r
+        # SUBTYPE_GUID type binary file in the Binaries section in the INF file\r
+        #\r
+        DecObjList = []\r
+        if not self.PackagePath:\r
+            WorkSpace = os.path.normpath(self.WorkSpace)\r
+            TempPath = ModulePath = os.path.normpath(self.ModulePath)\r
+            while ModulePath:\r
+                TempPath = ModulePath\r
+                ModulePath = os.path.dirname(ModulePath)\r
+            PackageName = TempPath\r
+            DecFilePath = os.path.normpath(os.path.join(WorkSpace, PackageName))  \r
+            if DecFilePath:\r
+                for File in os.listdir(DecFilePath):\r
+                    if File.upper().endswith('.DEC'):\r
+                        DecFileFullPath = os.path.normpath(os.path.join(DecFilePath, File))\r
+                        DecObjList.append(DecPomAlignment(DecFileFullPath, self.WorkSpace))\r
+                        \r
+        \r
         BinariesDict, AsBuildIns, BinaryFileObjectList = GenBinaryData(BinaryData, BinaryObj,\r
                                                                        BinariesDict,\r
                                                                        AsBuildIns,\r
                                                                        BinaryFileObjectList,\r
                                                                        self.GetSupArchList(),\r
-                                                                       self.BinaryModule)\r
-\r
+                                                                       self.BinaryModule,\r
+                                                                       DecObjList)\r
+                \r
         BinariesDict2 = {}\r
         for Key in BinariesDict:\r
             ValueList = BinariesDict[Key]\r
@@ -856,11 +932,15 @@ class InfPomAlignment(ModuleObject):
                 Pcd.SetItemType(PcdItem[0])\r
                 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
                 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
-                HelpTextObj = CommonObject.TextObject()\r
-                HelpTextObj.SetString(PcdItemObj.GetHelpStringList())\r
-                Pcd.SetHelpTextList([HelpTextObj])\r
+                Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
+                for CommentItem in PcdItemObj.GetHelpStringList():\r
+                    HelpTextObj = CommonObject.TextObject()\r
+                    if self.UniFileClassObject:\r
+                        HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                    HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
+                    Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
                 AsBuildPatchPcdList.append(Pcd)\r
-            else:\r
+            elif PcdItem[0].upper() == DT.TAB_INF_PCD_EX.upper():\r
                 PcdItemObj = PcdItem[1]\r
                 Pcd = CommonObject.PcdObject()\r
                 Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue())\r
@@ -871,9 +951,13 @@ class InfPomAlignment(ModuleObject):
                 Pcd.SetItemType(PcdItem[0])\r
                 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
                 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
-                HelpTextObj = CommonObject.TextObject()\r
-                HelpTextObj.SetString(PcdItemObj.GetHelpStringList())\r
-                Pcd.SetHelpTextList([HelpTextObj])\r
+                Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
+                for CommentItem in PcdItemObj.GetHelpStringList():\r
+                    HelpTextObj = CommonObject.TextObject()\r
+                    if self.UniFileClassObject:\r
+                        HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                    HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
+                    Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
                 AsBuildPcdExList.append(Pcd)\r
         AsBuildIns.SetPatchPcdList(AsBuildPatchPcdList)\r
         AsBuildIns.SetPcdExList(AsBuildPcdExList)\r
@@ -915,11 +999,13 @@ class InfPomAlignment(ModuleObject):
                         ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
                         ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
                         HelpString = GuidComentItem.GetHelpStringItem()\r
-                        HelpTxtTailObj = CommonObject.TextObject()\r
-                        HelpTxtTailObj.SetString(HelpString)\r
-\r
-                        ListObject.SetHelpTextList([HelpTxtTailObj])\r
-\r
+                        if HelpString.strip():\r
+                            HelpTxtTailObj = CommonObject.TextObject()\r
+                            if self.UniFileClassObject:\r
+                                HelpTxtTailObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                            HelpTxtTailObj.SetString(HelpString)\r
+                            ListObject.SetHelpTextList([HelpTxtTailObj])\r
+                            \r
                         GuidProtocolPpiList.append(ListObject)\r
         elif Type == DT.TAB_PROTOCOLS:\r
             ProtocolData = ProtocolObj.keys()\r
@@ -932,10 +1018,13 @@ class InfPomAlignment(ModuleObject):
                     ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
                     ListObject.SetNotify(CommentItem.GetNotify())\r
                     ListObject.SetUsage(CommentItem.GetUsageItem())\r
-                    HelpTxtObj = CommonObject.TextObject()\r
                     HelpString = CommentItem.GetHelpStringItem()\r
-                    HelpTxtObj.SetString(HelpString)\r
-                    ListObject.SetHelpTextList([HelpTxtObj])\r
+                    if HelpString.strip():\r
+                        HelpTxtObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTxtObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                        HelpTxtObj.SetString(HelpString)\r
+                        ListObject.SetHelpTextList([HelpTxtObj])\r
                     GuidProtocolPpiList.append(ListObject)\r
         elif Type == DT.TAB_PPIS:\r
             PpiData = PpisObj.keys()\r
@@ -948,10 +1037,13 @@ class InfPomAlignment(ModuleObject):
                     ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
                     ListObject.SetNotify(CommentItem.GetNotify())\r
                     ListObject.SetUsage(CommentItem.GetUsage())\r
-                    HelpTextObj = CommonObject.TextObject()\r
                     HelpString = CommentItem.GetHelpStringItem()\r
-                    HelpTextObj.SetString(HelpString)\r
-                    ListObject.SetHelpTextList([HelpTextObj])\r
+                    if HelpString.strip():\r
+                        HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                        HelpTextObj.SetString(HelpString)\r
+                        ListObject.SetHelpTextList([HelpTextObj])\r
                     GuidProtocolPpiList.append(ListObject)\r
 \r
         if Type == DT.TAB_GUIDS:\r
@@ -967,6 +1059,24 @@ class InfPomAlignment(ModuleObject):
     #\r
     # @param ContainerFile: The Inf file full path\r
     #\r
-    def _GenMiscFiles(self, ContainerFile, Skip):\r
-        pass\r
-\r
+    def _GenMiscFiles(self, Content):\r
+        MiscFileObj = CommonObject.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, GlobalData.gINF_MODULE_DIR):\r
+                    FileObj = CommonObject.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=GlobalData.gINF_MODULE_NAME,\r
+                                 ExtraData=Line)   \r
+        self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r
+        \r