]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py
BaseTools: Adjust the spaces around commas and colons
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / InfAsBuiltProcess.py
... / ...
CommitLineData
1## @file\r
2# This file is used to provide method for process AsBuilt INF file. It will consumed by InfParser\r
3#\r
4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
5#\r
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
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
22import Logger.Log as Logger\r
23from Logger import StringTable as ST\r
24from Logger import ToolError\r
25\r
26from Library.StringUtils import GetSplitValueList\r
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
44def GetLibInstanceInfo(String, WorkSpace, LineNo, CurrentInfFileName):\r
45\r
46 FileGuidString = ""\r
47 VerString = ""\r
48\r
49 OrignalString = String\r
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
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
76 return Guid, Version\r
77\r
78 #\r
79 # To deal with library instance specified by file name\r
80 #\r
81 FileLinesList = GetFileLineContent(String, WorkSpace, LineNo, OrignalString)\r
82\r
83\r
84 ReFindFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$")\r
85 ReFindVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$")\r
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
92\r
93 if FileGuidString:\r
94 FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1]\r
95 if VerString:\r
96 VerString = GetSplitValueList(VerString, '=', 1)[1]\r
97\r
98 return FileGuidString, VerString\r
99\r
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
108def GetPackageListInfo(FileNameString, WorkSpace, LineNo):\r
109 PackageInfoList = []\r
110 DefineSectionMacros = {}\r
111 PackageSectionMacros = {}\r
112\r
113 FileLinesList = GetFileLineContent(FileNameString, WorkSpace, LineNo, '')\r
114\r
115 RePackageHeader = re.compile('^\s*\[Packages.*\].*$')\r
116 ReDefineHeader = re.compile('^\s*\[Defines].*$')\r
117\r
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
124\r
125 if Line.startswith('['):\r
126 PackageHederFlag = False\r
127 DefineHeaderFlag = False\r
128\r
129 if Line.startswith("#"):\r
130 continue\r
131\r
132 if not Line:\r
133 continue\r
134\r
135 #\r
136 # Found [Packages] section \r
137 #\r
138 if RePackageHeader.match(Line):\r
139 PackageHederFlag = True\r
140 continue\r
141\r
142 #\r
143 # Found [Define] section\r
144 #\r
145 if ReDefineHeader.match(Line):\r
146 DefineHeaderFlag = True\r
147 continue\r
148\r
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
156 DefineSectionMacros)\r
157\r
158 if Name is not None:\r
159 DefineSectionMacros[Name] = Value\r
160 continue\r
161\r
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
171 if Name is not None:\r
172 PackageSectionMacros[Name] = Value\r
173 continue\r
174\r
175 #\r
176 # Replace with Local section Macro and [Defines] section Macro.\r
177 # \r
178 Line = InfExpandMacro(Line, (FileNameString, Line, LineNo), DefineSectionMacros, PackageSectionMacros, True)\r
179\r
180 Line = GetSplitValueList(Line, "#", 1)[0]\r
181 Line = GetSplitValueList(Line, "|", 1)[0]\r
182 PackageInfoList.append(Line)\r
183\r
184 return PackageInfoList\r
185\r
186def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):\r
187\r
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
196 return []\r
197\r
198 #\r
199 # Validate file exist/format.\r
200 #\r
201 if not IsValidPath(FileName, WorkSpace):\r
202 return []\r
203\r
204 FileLinesList = []\r
205\r
206 try:\r
207 FullFileName = FullFileName.replace('\\', '/')\r
208 Inputfile = open(FullFileName, "rb", 0)\r
209 try:\r
210 FileLinesList = Inputfile.readlines()\r
211 except BaseException:\r
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
220\r
221 FileLinesList = ProcessLineExtender(FileLinesList)\r
222\r
223 return FileLinesList\r
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