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