]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py
BaseTools: Various typo
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / InfAsBuiltProcess.py
index 12c46f1954b810c7095194271985bea4e8796297..53b62621dc3405b499aaa25c8d2eadb130e94f47 100644 (file)
@@ -1,11 +1,11 @@
 ## @file\r
 # This file is used to provide method for process AsBuilt INF file. It will consumed by InfParser\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
@@ -19,12 +19,11 @@ InfAsBuiltProcess
 import os\r
 import re\r
 from Library import GlobalData\r
-\r
 import Logger.Log as Logger\r
 from Logger import StringTable as ST\r
 from Logger import ToolError\r
 \r
-from Library.String import GetSplitValueList\r
+from Library.StringUtils import GetSplitValueList\r
 from Library.Misc import GetHelpStringByRemoveHashKey\r
 from Library.Misc import ValidFile\r
 from Library.Misc import ProcessLineExtender\r
@@ -42,12 +41,12 @@ from Library import DataType as DT
 # @param WorkSpace. The WorkSpace directory used to combined with INF file path.\r
 #\r
 # @return GUID, Version\r
-def GetLibInstanceInfo(String, WorkSpace, LineNo):\r
-    \r
+def GetLibInstanceInfo(String, WorkSpace, LineNo, CurrentInfFileName):\r
+\r
     FileGuidString = ""\r
     VerString = ""\r
-    \r
-    OrignalString = String \r
+\r
+    OriginalString = String\r
     String = String.strip()\r
     if not String:\r
         return None, None\r
@@ -56,28 +55,48 @@ def GetLibInstanceInfo(String, WorkSpace, LineNo):
     #\r
     String = GetHelpStringByRemoveHashKey(String)\r
     String = String.strip()\r
-    \r
-    FileLinesList = GetFileLineContent(String, WorkSpace, LineNo, OrignalString)\r
 \r
-        \r
+    #\r
+    # To deal with library instance specified by GUID and version\r
+    #\r
+    RegFormatGuidPattern = re.compile("\s*([0-9a-fA-F]){8}-"\r
+                                       "([0-9a-fA-F]){4}-"\r
+                                       "([0-9a-fA-F]){4}-"\r
+                                       "([0-9a-fA-F]){4}-"\r
+                                       "([0-9a-fA-F]){12}\s*")\r
+    VersionPattern = re.compile('[\t\s]*\d+(\.\d+)?[\t\s]*')\r
+    GuidMatchedObj = RegFormatGuidPattern.search(String)\r
+\r
+    if String.upper().startswith('GUID') and GuidMatchedObj and 'Version' in String:\r
+        VersionStr = String[String.upper().find('VERSION') + 8:]\r
+        VersionMatchedObj = VersionPattern.search(VersionStr)\r
+        if VersionMatchedObj:\r
+            Guid = GuidMatchedObj.group().strip()\r
+            Version = VersionMatchedObj.group().strip()\r
+            return Guid, Version\r
+\r
+    #\r
+    # To deal with library instance specified by file name\r
+    #\r
+    FileLinesList = GetFileLineContent(String, WorkSpace, LineNo, OriginalString)\r
+\r
+\r
     ReFindFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$")\r
     ReFindVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$")\r
-    \r
-    FileLinesList = ProcessLineExtender(FileLinesList)\r
 \r
     for Line in FileLinesList:\r
         if ReFindFileGuidPattern.match(Line):\r
             FileGuidString = Line\r
         if ReFindVerStringPattern.match(Line):\r
             VerString = Line\r
-    \r
+\r
     if FileGuidString:\r
         FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1]\r
     if VerString:\r
         VerString = GetSplitValueList(VerString, '=', 1)[1]\r
-        \r
+\r
     return FileGuidString, VerString\r
-    \r
+\r
 ## GetPackageListInfo\r
 #\r
 # Get the package information from INF file.\r
@@ -86,47 +105,47 @@ def GetLibInstanceInfo(String, WorkSpace, LineNo):
 # @param WorkSpace. The WorkSpace directory used to combined with INF file path.\r
 #\r
 # @return GUID, Version\r
-def GetPackageListInfo(FileNameString, WorkSpace, LineNo): \r
+def GetPackageListInfo(FileNameString, WorkSpace, LineNo):\r
     PackageInfoList = []\r
     DefineSectionMacros = {}\r
     PackageSectionMacros = {}\r
-    \r
+\r
     FileLinesList = GetFileLineContent(FileNameString, WorkSpace, LineNo, '')\r
-    \r
+\r
     RePackageHeader = re.compile('^\s*\[Packages.*\].*$')\r
     ReDefineHeader = re.compile('^\s*\[Defines].*$')\r
-    \r
+\r
     PackageHederFlag = False\r
     DefineHeaderFlag = False\r
     LineNo = -1\r
     for Line in FileLinesList:\r
         LineNo += 1\r
         Line = Line.strip()\r
-        \r
+\r
         if Line.startswith('['):\r
             PackageHederFlag = False\r
-            DefineHeaderFlag = False            \r
-        \r
+            DefineHeaderFlag = False\r
+\r
         if Line.startswith("#"):\r
             continue\r
-        \r
+\r
         if not Line:\r
-            continue        \r
-        \r
+            continue\r
+\r
         #\r
-        # Found [Packages] section \r
+        # Found [Packages] section\r
         #\r
         if RePackageHeader.match(Line):\r
             PackageHederFlag = True\r
             continue\r
-        \r
+\r
         #\r
         # Found [Define] section\r
         #\r
         if ReDefineHeader.match(Line):\r
             DefineHeaderFlag = True\r
             continue\r
-        \r
+\r
         if DefineHeaderFlag:\r
             #\r
             # Find Macro\r
@@ -134,12 +153,12 @@ def GetPackageListInfo(FileNameString, WorkSpace, LineNo):
             Name, Value = MacroParser((Line, LineNo),\r
                                       FileNameString,\r
                                       DT.MODEL_META_DATA_HEADER,\r
-                                      DefineSectionMacros) \r
-                       \r
-            if Name != None:\r
-                DefineSectionMacros[Name] = Value               \r
+                                      DefineSectionMacros)\r
+\r
+            if Name is not None:\r
+                DefineSectionMacros[Name] = Value\r
                 continue\r
-            \r
+\r
         if PackageHederFlag:\r
 \r
             #\r
@@ -149,23 +168,23 @@ def GetPackageListInfo(FileNameString, WorkSpace, LineNo):
                                       FileNameString,\r
                                       DT.MODEL_META_DATA_PACKAGE,\r
                                       DefineSectionMacros)\r
-            if Name != None:\r
-                PackageSectionMacros[Name] = Value               \r
+            if Name is not None:\r
+                PackageSectionMacros[Name] = Value\r
                 continue\r
-            \r
+\r
             #\r
             # Replace with Local section Macro and [Defines] section Macro.\r
-            #            \r
+            #\r
             Line = InfExpandMacro(Line, (FileNameString, Line, LineNo), DefineSectionMacros, PackageSectionMacros, True)\r
-            \r
+\r
             Line = GetSplitValueList(Line, "#", 1)[0]\r
             Line = GetSplitValueList(Line, "|", 1)[0]\r
             PackageInfoList.append(Line)\r
-     \r
-    return PackageInfoList    \r
-    \r
+\r
+    return PackageInfoList\r
+\r
 def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):\r
-    \r
+\r
     if not LineNo:\r
         LineNo = -1\r
 \r
@@ -174,46 +193,97 @@ def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):
     #\r
     FullFileName = os.path.normpath(os.path.realpath(os.path.join(WorkSpace, FileName)))\r
     if not (ValidFile(FullFileName)):\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID,\r
-                     ST.ERR_FILELIST_EXIST%(FileName),\r
-                     File=GlobalData.gINF_MODULE_NAME,\r
-                     Line=LineNo, \r
-                     ExtraData=OriginalString)\r
-    \r
+        return []\r
+\r
     #\r
     # Validate file exist/format.\r
     #\r
-    if IsValidPath(FileName, WorkSpace):\r
-        IsValidFileFlag = True\r
-    else:\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID,\r
-                     ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(FileName),\r
-                     File=GlobalData.gINF_MODULE_NAME, \r
-                     Line=LineNo, \r
-                     ExtraData=OriginalString)\r
-        return False\r
-    \r
+    if not IsValidPath(FileName, WorkSpace):\r
+        return []\r
+\r
     FileLinesList = []\r
-    \r
-    if IsValidFileFlag:  \r
+\r
+    try:\r
+        FullFileName = FullFileName.replace('\\', '/')\r
+        Inputfile = open(FullFileName, "r")\r
         try:\r
-            FullFileName = FullFileName.replace('\\', '/')\r
-            Inputfile = open(FullFileName, "rb", 0)\r
-            try:\r
-                FileLinesList = Inputfile.readlines()\r
-            except BaseException:\r
-                Logger.Error("InfParser", ToolError.FILE_READ_FAILURE, ST.ERR_FILE_OPEN_FAILURE, File=FullFileName)\r
-            finally:\r
-                Inputfile.close()\r
+            FileLinesList = Inputfile.readlines()\r
         except BaseException:\r
-            Logger.Error("InfParser", \r
-                         ToolError.FILE_READ_FAILURE, \r
-                         ST.ERR_FILE_OPEN_FAILURE,\r
-                         File=FullFileName)\r
-        \r
-        FileLinesList = ProcessLineExtender(FileLinesList)\r
-    \r
+            Logger.Error("InfParser", ToolError.FILE_READ_FAILURE, ST.ERR_FILE_OPEN_FAILURE, File=FullFileName)\r
+        finally:\r
+            Inputfile.close()\r
+    except BaseException:\r
+        Logger.Error("InfParser",\r
+                     ToolError.FILE_READ_FAILURE,\r
+                     ST.ERR_FILE_OPEN_FAILURE,\r
+                     File=FullFileName)\r
+\r
+    FileLinesList = ProcessLineExtender(FileLinesList)\r
+\r
     return FileLinesList\r
-    
\ No newline at end of file
+\r
+##\r
+# Get all INF files from current workspace\r
+#\r
+#\r
+def GetInfsFromWorkSpace(WorkSpace):\r
+    InfFiles = []\r
+    for top, dirs, files in os.walk(WorkSpace):\r
+        dirs = dirs # just for pylint\r
+        for File in files:\r
+            if File.upper().endswith(".INF"):\r
+                InfFiles.append(os.path.join(top, File))\r
+\r
+    return InfFiles\r
+\r
+##\r
+# Get GUID and version from library instance file\r
+#\r
+#\r
+def GetGuidVerFormLibInstance(Guid, Version, WorkSpace, CurrentInfFileName):\r
+    for InfFile in GetInfsFromWorkSpace(WorkSpace):\r
+        try:\r
+            if InfFile.strip().upper() == CurrentInfFileName.strip().upper():\r
+                continue\r
+            InfFile = InfFile.replace('\\', '/')\r
+            if InfFile not in GlobalData.gLIBINSTANCEDICT:\r
+                InfFileObj = open(InfFile, "r")\r
+                GlobalData.gLIBINSTANCEDICT[InfFile] = InfFileObj\r
+            else:\r
+                InfFileObj = GlobalData.gLIBINSTANCEDICT[InfFile]\r
+\r
+        except BaseException:\r
+            Logger.Error("InfParser",\r
+                         ToolError.FILE_READ_FAILURE,\r
+                         ST.ERR_FILE_OPEN_FAILURE,\r
+                         File=InfFile)\r
+        try:\r
+            FileLinesList = InfFileObj.readlines()\r
+            FileLinesList = ProcessLineExtender(FileLinesList)\r
+\r
+            ReFindFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$")\r
+            ReFindVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$")\r
+\r
+            for Line in FileLinesList:\r
+                if ReFindFileGuidPattern.match(Line):\r
+                    FileGuidString = Line\r
+                if ReFindVerStringPattern.match(Line):\r
+                    VerString = Line\r
+\r
+            if FileGuidString:\r
+                FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1]\r
+            if VerString:\r
+                VerString = GetSplitValueList(VerString, '=', 1)[1]\r
+\r
+            if FileGuidString.strip().upper() == Guid.upper() and \\r
+                VerString.strip().upper() == Version.upper():\r
+                return Guid, Version\r
+\r
+        except BaseException:\r
+            Logger.Error("InfParser", ToolError.FILE_READ_FAILURE, ST.ERR_FILE_OPEN_FAILURE, File=InfFile)\r
+        finally:\r
+            InfFileObj.close()\r
+\r
+    return '', ''\r
+\r
+\r