## @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
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
# @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
#\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
# @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
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
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
#\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