]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py
BaseTools/UPT: Porting UPT Tool from Python2 to Python3
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / InfAsBuiltProcess.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is used to provide method for process AsBuilt INF file. It will consumed by InfParser\r
3#\r
64285f15 4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 5#\r
f7496d71
LG
6# This program and the accompanying materials are licensed and made available\r
7# under the terms and conditions of the BSD License which accompanies this\r
8# distribution. The full text of the license may be found at\r
4234283c
LG
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13'''\r
14InfAsBuiltProcess\r
15'''\r
16## Import modules\r
17#\r
18\r
19import os\r
20import re\r
21from Library import GlobalData\r
4234283c
LG
22import Logger.Log as Logger\r
23from Logger import StringTable as ST\r
24from Logger import ToolError\r
25\r
64285f15 26from Library.StringUtils import GetSplitValueList\r
4234283c
LG
27from Library.Misc import GetHelpStringByRemoveHashKey\r
28from Library.Misc import ValidFile\r
29from Library.Misc import ProcessLineExtender\r
30from Library.ParserValidate import IsValidPath\r
31from Library.Parsing import MacroParser\r
32from Parser.InfParserMisc import InfExpandMacro\r
33\r
34from Library import DataType as DT\r
35\r
36## GetLibInstanceInfo\r
37#\r
38# Get the information from Library Instance INF file.\r
39#\r
40# @param string. A string start with # and followed by INF file path\r
41# @param WorkSpace. The WorkSpace directory used to combined with INF file path.\r
42#\r
43# @return GUID, Version\r
4afd3d04
LG
44def GetLibInstanceInfo(String, WorkSpace, LineNo, CurrentInfFileName):\r
45\r
4234283c
LG
46 FileGuidString = ""\r
47 VerString = ""\r
4afd3d04
LG
48\r
49 OrignalString = String\r
4234283c
LG
50 String = String.strip()\r
51 if not String:\r
52 return None, None\r
53 #\r
54 # Remove "#" characters at the beginning\r
55 #\r
56 String = GetHelpStringByRemoveHashKey(String)\r
57 String = String.strip()\r
4afd3d04
LG
58\r
59 #\r
60 # To deal with library instance specified by GUID and version\r
61 #\r
62 RegFormatGuidPattern = re.compile("\s*([0-9a-fA-F]){8}-"\r
63 "([0-9a-fA-F]){4}-"\r
64 "([0-9a-fA-F]){4}-"\r
65 "([0-9a-fA-F]){4}-"\r
66 "([0-9a-fA-F]){12}\s*")\r
67 VersionPattern = re.compile('[\t\s]*\d+(\.\d+)?[\t\s]*')\r
68 GuidMatchedObj = RegFormatGuidPattern.search(String)\r
69\r
70 if String.upper().startswith('GUID') and GuidMatchedObj and 'Version' in String:\r
71 VersionStr = String[String.upper().find('VERSION') + 8:]\r
72 VersionMatchedObj = VersionPattern.search(VersionStr)\r
73 if VersionMatchedObj:\r
74 Guid = GuidMatchedObj.group().strip()\r
75 Version = VersionMatchedObj.group().strip()\r
421ccda3 76 return Guid, Version\r
4afd3d04
LG
77\r
78 #\r
79 # To deal with library instance specified by file name\r
80 #\r
4234283c
LG
81 FileLinesList = GetFileLineContent(String, WorkSpace, LineNo, OrignalString)\r
82\r
4afd3d04 83\r
4234283c
LG
84 ReFindFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$")\r
85 ReFindVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$")\r
4234283c
LG
86\r
87 for Line in FileLinesList:\r
88 if ReFindFileGuidPattern.match(Line):\r
89 FileGuidString = Line\r
90 if ReFindVerStringPattern.match(Line):\r
91 VerString = Line\r
4afd3d04 92\r
4234283c
LG
93 if FileGuidString:\r
94 FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1]\r
95 if VerString:\r
96 VerString = GetSplitValueList(VerString, '=', 1)[1]\r
4afd3d04 97\r
4234283c 98 return FileGuidString, VerString\r
4afd3d04 99\r
4234283c
LG
100## GetPackageListInfo\r
101#\r
102# Get the package information from INF file.\r
103#\r
104# @param string. A string start with # and followed by INF file path\r
105# @param WorkSpace. The WorkSpace directory used to combined with INF file path.\r
106#\r
107# @return GUID, Version\r
421ccda3 108def GetPackageListInfo(FileNameString, WorkSpace, LineNo):\r
4234283c
LG
109 PackageInfoList = []\r
110 DefineSectionMacros = {}\r
111 PackageSectionMacros = {}\r
421ccda3 112\r
4234283c 113 FileLinesList = GetFileLineContent(FileNameString, WorkSpace, LineNo, '')\r
421ccda3 114\r
4234283c
LG
115 RePackageHeader = re.compile('^\s*\[Packages.*\].*$')\r
116 ReDefineHeader = re.compile('^\s*\[Defines].*$')\r
421ccda3 117\r
4234283c
LG
118 PackageHederFlag = False\r
119 DefineHeaderFlag = False\r
120 LineNo = -1\r
121 for Line in FileLinesList:\r
122 LineNo += 1\r
123 Line = Line.strip()\r
421ccda3 124\r
4234283c
LG
125 if Line.startswith('['):\r
126 PackageHederFlag = False\r
421ccda3
HC
127 DefineHeaderFlag = False\r
128\r
4234283c
LG
129 if Line.startswith("#"):\r
130 continue\r
421ccda3 131\r
4234283c 132 if not Line:\r
421ccda3
HC
133 continue\r
134\r
4234283c 135 #\r
f7496d71 136 # Found [Packages] section\r
4234283c
LG
137 #\r
138 if RePackageHeader.match(Line):\r
139 PackageHederFlag = True\r
140 continue\r
421ccda3 141\r
4234283c
LG
142 #\r
143 # Found [Define] section\r
144 #\r
145 if ReDefineHeader.match(Line):\r
146 DefineHeaderFlag = True\r
147 continue\r
421ccda3 148\r
4234283c
LG
149 if DefineHeaderFlag:\r
150 #\r
151 # Find Macro\r
152 #\r
153 Name, Value = MacroParser((Line, LineNo),\r
154 FileNameString,\r
155 DT.MODEL_META_DATA_HEADER,\r
421ccda3
HC
156 DefineSectionMacros)\r
157\r
4231a819 158 if Name is not None:\r
421ccda3 159 DefineSectionMacros[Name] = Value\r
4234283c 160 continue\r
421ccda3 161\r
4234283c
LG
162 if PackageHederFlag:\r
163\r
164 #\r
165 # Find Macro\r
166 #\r
167 Name, Value = MacroParser((Line, LineNo),\r
168 FileNameString,\r
169 DT.MODEL_META_DATA_PACKAGE,\r
170 DefineSectionMacros)\r
4231a819 171 if Name is not None:\r
421ccda3 172 PackageSectionMacros[Name] = Value\r
4234283c 173 continue\r
421ccda3 174\r
4234283c
LG
175 #\r
176 # Replace with Local section Macro and [Defines] section Macro.\r
f7496d71 177 #\r
4234283c 178 Line = InfExpandMacro(Line, (FileNameString, Line, LineNo), DefineSectionMacros, PackageSectionMacros, True)\r
421ccda3 179\r
4234283c
LG
180 Line = GetSplitValueList(Line, "#", 1)[0]\r
181 Line = GetSplitValueList(Line, "|", 1)[0]\r
182 PackageInfoList.append(Line)\r
421ccda3
HC
183\r
184 return PackageInfoList\r
185\r
4234283c 186def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):\r
421ccda3 187\r
4234283c
LG
188 if not LineNo:\r
189 LineNo = -1\r
190\r
191 #\r
192 # Validate file name exist.\r
193 #\r
194 FullFileName = os.path.normpath(os.path.realpath(os.path.join(WorkSpace, FileName)))\r
195 if not (ValidFile(FullFileName)):\r
421ccda3
HC
196 return []\r
197\r
4234283c
LG
198 #\r
199 # Validate file exist/format.\r
200 #\r
4afd3d04 201 if not IsValidPath(FileName, WorkSpace):\r
421ccda3
HC
202 return []\r
203\r
4234283c 204 FileLinesList = []\r
421ccda3 205\r
4afd3d04
LG
206 try:\r
207 FullFileName = FullFileName.replace('\\', '/')\r
1b2e0772 208 Inputfile = open(FullFileName, "r")\r
4234283c 209 try:\r
4afd3d04 210 FileLinesList = Inputfile.readlines()\r
4234283c 211 except BaseException:\r
4afd3d04
LG
212 Logger.Error("InfParser", ToolError.FILE_READ_FAILURE, ST.ERR_FILE_OPEN_FAILURE, File=FullFileName)\r
213 finally:\r
214 Inputfile.close()\r
215 except BaseException:\r
216 Logger.Error("InfParser",\r
217 ToolError.FILE_READ_FAILURE,\r
218 ST.ERR_FILE_OPEN_FAILURE,\r
219 File=FullFileName)\r
421ccda3 220\r
4afd3d04 221 FileLinesList = ProcessLineExtender(FileLinesList)\r
421ccda3 222\r
4234283c 223 return FileLinesList\r
4afd3d04
LG
224\r
225##\r
226# Get all INF files from current workspace\r
227#\r
228#\r
229def GetInfsFromWorkSpace(WorkSpace):\r
230 InfFiles = []\r
231 for top, dirs, files in os.walk(WorkSpace):\r
232 dirs = dirs # just for pylint\r
233 for File in files:\r
234 if File.upper().endswith(".INF"):\r
235 InfFiles.append(os.path.join(top, File))\r
236\r
237 return InfFiles\r
238\r
239##\r
240# Get GUID and version from library instance file\r
241#\r
242#\r
243def GetGuidVerFormLibInstance(Guid, Version, WorkSpace, CurrentInfFileName):\r
244 for InfFile in GetInfsFromWorkSpace(WorkSpace):\r
245 try:\r
246 if InfFile.strip().upper() == CurrentInfFileName.strip().upper():\r
247 continue\r
248 InfFile = InfFile.replace('\\', '/')\r
249 if InfFile not in GlobalData.gLIBINSTANCEDICT:\r
250 InfFileObj = open(InfFile, "rb", 0)\r
251 GlobalData.gLIBINSTANCEDICT[InfFile] = InfFileObj\r
252 else:\r
253 InfFileObj = GlobalData.gLIBINSTANCEDICT[InfFile]\r
254\r
255 except BaseException:\r
256 Logger.Error("InfParser",\r
257 ToolError.FILE_READ_FAILURE,\r
258 ST.ERR_FILE_OPEN_FAILURE,\r
259 File=InfFile)\r
260 try:\r
261 FileLinesList = InfFileObj.readlines()\r
262 FileLinesList = ProcessLineExtender(FileLinesList)\r
263\r
264 ReFindFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$")\r
265 ReFindVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$")\r
266\r
267 for Line in FileLinesList:\r
268 if ReFindFileGuidPattern.match(Line):\r
269 FileGuidString = Line\r
270 if ReFindVerStringPattern.match(Line):\r
271 VerString = Line\r
272\r
273 if FileGuidString:\r
274 FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1]\r
275 if VerString:\r
276 VerString = GetSplitValueList(VerString, '=', 1)[1]\r
277\r
278 if FileGuidString.strip().upper() == Guid.upper() and \\r
279 VerString.strip().upper() == Version.upper():\r
280 return Guid, Version\r
281\r
282 except BaseException:\r
283 Logger.Error("InfParser", ToolError.FILE_READ_FAILURE, ST.ERR_FILE_OPEN_FAILURE, File=InfFile)\r
284 finally:\r
285 InfFileObj.close()\r
286\r
287 return '', ''\r
288\r
289\r