]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py
BaseTools: Various typo
[mirror_edk2.git] / BaseTools / Source / Python / UPT / PomAdapter / InfPomAlignment.py
index 20daff0d3293daf502accf88daf8b793f1129e2b..d01481727b9e7d5033a40de607c5663867558df6 100644 (file)
@@ -1,11 +1,11 @@
 ## @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 - 2018, 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
-# distribution. The full text of the license may be found at \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
+# distribution. The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
@@ -18,21 +18,24 @@ 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
-from Library.String import GetSplitValueList\r
+from Library.StringUtils import FORMAT_INVALID\r
+from Library.StringUtils import PARSER_ERROR\r
+from Library.StringUtils import NormPath\r
+from Library.StringUtils import GetSplitValueList\r
 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,8 +50,8 @@ from Object.POM.ModuleObject import AsBuiltObject
 from PomAdapter.InfPomAlignmentMisc import GenModuleHeaderUserExt\r
 from PomAdapter.InfPomAlignmentMisc import GenBinaryData\r
 from Parser import InfParser\r
-\r
-\r
+from PomAdapter.DecPomAlignment import DecPomAlignment\r
+from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 \r
 ## InfPomAlignment\r
 #\r
@@ -56,13 +59,12 @@ from Parser import InfParser
 #\r
 class InfPomAlignment(ModuleObject):\r
     ## Construct of InfPomAlignment\r
-    # Skip means that UPT don't care the syntax of INF, this may be the not \r
-    # distributed INF files during creation or the INF files checked for \r
+    # Skip means that UPT don't care the syntax of INF, this may be the not\r
+    # distributed INF files during creation or the INF files checked for\r
     # dependency rule during remove.\r
     #\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,18 +82,20 @@ 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
     ##\r
-    # Generate all POM objects, the original input comes \r
+    # Generate all POM objects, the original input comes\r
     # from INF parser's output\r
     #\r
     def _GenInfPomObjects(self, Skip):\r
         #\r
-        # Call INF Parser to get information from INF file  \r
+        # Call INF Parser to get information from INF file\r
         #\r
         self.Parser = InfParser.InfParser(self.FileName, self.WorkSpace)\r
         self.FullPath = self.Parser.FullPath\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
@@ -130,11 +133,10 @@ class InfPomAlignment(ModuleObject):
         #\r
         # Should only have one ArchString Item.\r
         #\r
-        ArchString = RecordSet.keys()[0]\r
+        ArchString = list(RecordSet.keys())[0]\r
         ArchList = GetSplitValueList(ArchString, ' ')\r
         ArchList = ConvertArchList(ArchList)\r
         HasCalledFlag = False\r
-\r
         #\r
         # Get data from Sdict()\r
         #\r
@@ -142,44 +144,38 @@ class InfPomAlignment(ModuleObject):
         self.SetFileName(self.FileName)\r
         self.SetFullPath(self.FullPath)\r
         #\r
-        # The INF's filename (without the directory path or the extension) \r
-        # must be used for the value of the \r
+        # The INF's filename (without the directory path or the extension)\r
+        # must be used for the value of the\r
         # 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
-        if DefineObj.GetUefiSpecificationVersion() != None:\r
+        if DefineObj.GetUefiSpecificationVersion() is not None:\r
             __UefiVersion = DefineObj.GetUefiSpecificationVersion().GetValue()\r
             __UefiVersion = ConvertVersionToDecimal(__UefiVersion)\r
             self.SetUefiSpecificationVersion(str(__UefiVersion))\r
-        if DefineObj.GetPiSpecificationVersion() != None:\r
+        if DefineObj.GetPiSpecificationVersion() is not None:\r
             __PiVersion = DefineObj.GetPiSpecificationVersion().GetValue()\r
             __PiVersion = ConvertVersionToDecimal(__PiVersion)\r
 \r
             self.SetPiSpecificationVersion(str(__PiVersion))\r
-\r
         SpecList = DefineObj.GetSpecification()\r
         NewSpecList = []\r
         for SpecItem in SpecList:\r
@@ -188,9 +184,9 @@ class InfPomAlignment(ModuleObject):
 \r
         #\r
         # must exist items in INF define section\r
-        # MODULE_TYPE/BASE_NAME/INF_VERSION/FILE_GUID/VERSION_STRING \r
+        # MODULE_TYPE/BASE_NAME/INF_VERSION/FILE_GUID/VERSION_STRING\r
         #\r
-        if DefineObj.GetModuleType() == None:\r
+        if DefineObj.GetModuleType() is None:\r
             Logger.Error("InfParser", FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("MODULE_TYPE"), File=self.FullPath)\r
         else:\r
@@ -198,7 +194,7 @@ class InfPomAlignment(ModuleObject):
             ModuleType = DefineObj.GetModuleType().GetValue()\r
             if ModuleType:\r
                 #\r
-                # Drivers and applications are not allowed to have a MODULE_TYPE of "BASE". Only \r
+                # Drivers and applications are not allowed to have a MODULE_TYPE of "BASE". Only\r
                 # libraries are permitted to a have a MODULE_TYPE of "BASE".\r
                 #\r
                 if len(DefineObj.LibraryClass) == 0 and ModuleType == 'BASE':\r
@@ -209,22 +205,26 @@ class InfPomAlignment(ModuleObject):
                                  Line=DefineObj.ModuleType.CurrentLine.LineNo,\r
                                  ExtraData=DefineObj.ModuleType.CurrentLine.LineString)\r
                 self.LibModuleTypeList.append(ModuleType)\r
-        if DefineObj.GetBaseName() == None:\r
+        if DefineObj.GetBaseName() is None:\r
             Logger.Error("InfParser", FORMAT_INVALID,\r
                          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.GetInfVersion() == None:\r
+        if DefineObj.GetModuleUniFileName():\r
+            self.UniFileClassObject = UniFileClassObject([PathClass(DefineObj.GetModuleUniFileName())])\r
+        else:\r
+            self.UniFileClassObject = None\r
+        if DefineObj.GetInfVersion() is None:\r
             Logger.Error("InfParser", FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("INF_VERSION"), File=self.FullPath)\r
         else:\r
             self.SetVersion(DefineObj.GetInfVersion().GetValue())\r
-        if DefineObj.GetFileGuid() == None:\r
+        if DefineObj.GetFileGuid() is None:\r
             Logger.Error("InfParser", FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("FILE_GUID"), File=self.FullPath)\r
         else:\r
             self.SetGuid(DefineObj.GetFileGuid().GetValue())\r
-        if DefineObj.GetVersionString() == None:\r
+        if DefineObj.GetVersionString() is None:\r
             #\r
             # VERSION_STRING is missing from the [Defines] section, tools must assume that the module's version is 0.\r
             #\r
@@ -247,9 +247,8 @@ 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
+        # if there is Shadow, Should judge the MODULE_TYPE in\r
         # SEC, PEI_CORE and PEIM\r
         #\r
         if DefineObj.GetShadow():\r
@@ -257,14 +256,12 @@ class InfPomAlignment(ModuleObject):
             if not (ModuleTypeValue == 'SEC' or ModuleTypeValue == 'PEI_CORE' or ModuleTypeValue == 'PEIM'):\r
                 Logger.Error("InfParser", FORMAT_INVALID, ST.ERR_INF_PARSER_DEFINE_SHADOW_INVALID, File=self.FullPath)\r
 \r
-        if DefineObj.GetPcdIsDriver() != None:\r
+        if DefineObj.GetPcdIsDriver() is not 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
@@ -287,30 +283,47 @@ class InfPomAlignment(ModuleObject):
         self._GenSpecialComments()\r
         #\r
         # put all define statement into user-extension sections\r
-        #     \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
+        # the record is list of items formatted:\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
@@ -343,13 +356,13 @@ class InfPomAlignment(ModuleObject):
             self.SetExternList(self.GetExternList() + [Image])\r
         #\r
         # UNLOAD_IMAGE\r
-        # \r
+        #\r
         UnloadImageList = DefineObj.GetUnloadImages()\r
         for UnloadImage in UnloadImageList:\r
             Image = ExternObject()\r
             #\r
             # Future enhancement\r
-            #                \r
+            #\r
             Image.SetUnloadImage(UnloadImage.GetCName())\r
             self.SetExternList(self.GetExternList() + [Image])\r
         #\r
@@ -360,7 +373,7 @@ class InfPomAlignment(ModuleObject):
             Image = ExternObject()\r
             #\r
             # Future enhancement\r
-            #                  \r
+            #\r
             Image.SetConstructor(ConstructorItem.GetCName())\r
             self.SetExternList(self.GetExternList() + [Image])\r
         #\r
@@ -371,7 +384,7 @@ class InfPomAlignment(ModuleObject):
             Image = ExternObject()\r
             #\r
             # Future enhancement\r
-            #                \r
+            #\r
             Image.SetDestructor(DestructorItem.GetCName())\r
             self.SetExternList(self.GetExternList() + [Image])\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
@@ -471,11 +486,7 @@ class InfPomAlignment(ModuleObject):
             #\r
             # Get all LibraryClasses\r
             #\r
-            LibClassObj = self.Parser.InfLibraryClassSection.LibraryClasses\r
-            Keys = LibClassObj.keys()\r
-\r
-            for Key in Keys:\r
-                LibraryClassData = LibClassObj[Key]\r
+            for LibraryClassData in self.Parser.InfLibraryClassSection.LibraryClasses.values():\r
                 for Item in LibraryClassData:\r
                     LibraryClass = CommonObject.LibraryClassObject()\r
                     LibraryClass.SetUsage(DT.USAGE_ITEM_CONSUMES)\r
@@ -485,14 +496,14 @@ class InfPomAlignment(ModuleObject):
                     LibraryClass.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
                     LibraryClass.SetSupModuleList(Item.GetSupModuleList())\r
                     HelpStringObj = Item.GetHelpString()\r
-\r
-                    if HelpStringObj != None:\r
+                    if HelpStringObj is not 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 +519,6 @@ class InfPomAlignment(ModuleObject):
         # Get all Packages\r
         #\r
         PackageObj = self.Parser.InfPackageSection.Packages\r
-\r
         #\r
         # Go through each arch\r
         #\r
@@ -521,8 +531,7 @@ class InfPomAlignment(ModuleObject):
             PackageDependency.SetSupArchList(ConvertArchList(PackageItemObj.GetSupArchList()))\r
             PackageDependency.SetFeatureFlag(PackageItemObj.GetFeatureFlagExp())\r
 \r
-            PkgInfo = GetPkgInfoFromDec(os.path.normpath(os.path.join(self.WorkSpace,\r
-                                                                      NormPath(PackageItemObj.GetPackageName()))))\r
+            PkgInfo = GetPkgInfoFromDec(mws.join(self.WorkSpace, NormPath(PackageItemObj.GetPackageName())))\r
             if PkgInfo[1] and PkgInfo[2]:\r
                 PackageDependency.SetGuid(PkgInfo[1])\r
                 PackageDependency.SetVersion(PkgInfo[2])\r
@@ -546,13 +555,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 +578,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
@@ -602,8 +611,7 @@ class InfPomAlignment(ModuleObject):
                 SourceFile = Item.GetSourceFileName()\r
                 Family = Item.GetFamily()\r
                 FeatureFlag = Item.GetFeatureFlagExp()\r
-                SupArchList = ConvertArchList(Item.GetSupArchList())\r
-                SupArchList.sort()\r
+                SupArchList = sorted(ConvertArchList(Item.GetSupArchList()))\r
                 Source = SourceFileObject()\r
                 Source.SetSourceFile(SourceFile)\r
                 Source.SetFamily(Family)\r
@@ -631,16 +639,52 @@ class InfPomAlignment(ModuleObject):
                 UserExtension = CommonObject.UserExtensionObject()\r
                 UserId = UserExtensionDataObj.GetUserId()\r
                 if UserId.startswith('"') and UserId.endswith('"'):\r
-                    UserId = UserId[1:-1]                \r
+                    UserId = UserId[1:-1]\r
                 UserExtension.SetUserID(UserId)\r
                 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
+        #  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 +719,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 +761,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,10 +800,9 @@ 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
+        # If the INF file does not contain a [Sources] section, and the INF file does contain a [Binaries] section,\r
         # then the ModuleSurfaceArea.BinaryModule attribute must be set to true. Otherwise, do not use the attribute\r
         #\r
         if BinaryObj and not self.Parser.InfSourcesSection.GetSources():\r
@@ -772,14 +821,15 @@ 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
         #\r
         # BuildOption AsBuild Info\r
-        #            \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,12 +837,33 @@ 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
+                                                                       self.BinaryModule,\r
+                                                                       DecObjList)\r
 \r
         BinariesDict2 = {}\r
         for Key in BinariesDict:\r
@@ -801,7 +872,7 @@ class InfPomAlignment(ModuleObject):
                 BinariesDict2[Key] = ValueList\r
             else:\r
                 #\r
-                # if there is no TagName, ToolCode, HelpStr, \r
+                # if there is no TagName, ToolCode, HelpStr,\r
                 # then do not need to put them into userextension\r
                 #\r
                 (Target, Family, TagName, HelpStr) = ValueList[0]\r
@@ -856,11 +927,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 +946,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,10 +994,12 @@ 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
+                        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
@@ -932,10 +1013,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 +1032,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 +1054,24 @@ class InfPomAlignment(ModuleObject):
     #\r
     # @param ContainerFile: The Inf file full path\r
     #\r
-    def _GenMiscFiles(self, ContainerFile, Skip):\r
-        pass\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