]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py
Sync BaseTools Branch (version r2271) to EDKII main trunk.
[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
4# Copyright (c) 2011, 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
22\r
23import Logger.Log as Logger\r
24from Logger import StringTable as ST\r
25from Logger import ToolError\r
26\r
27from Library.String import GetSplitValueList\r
28from Library.Misc import GetHelpStringByRemoveHashKey\r
29from Library.Misc import ValidFile\r
30from Library.Misc import ProcessLineExtender\r
31from Library.ParserValidate import IsValidPath\r
32from Library.Parsing import MacroParser\r
33from Parser.InfParserMisc import InfExpandMacro\r
34\r
35from Library import DataType as DT\r
36\r
37## GetLibInstanceInfo\r
38#\r
39# Get the information from Library Instance INF file.\r
40#\r
41# @param string. A string start with # and followed by INF file path\r
42# @param WorkSpace. The WorkSpace directory used to combined with INF file path.\r
43#\r
44# @return GUID, Version\r
45def GetLibInstanceInfo(String, WorkSpace, LineNo):\r
46 \r
47 FileGuidString = ""\r
48 VerString = ""\r
49 \r
50 OrignalString = String \r
51 String = String.strip()\r
52 if not String:\r
53 return None, None\r
54 #\r
55 # Remove "#" characters at the beginning\r
56 #\r
57 String = GetHelpStringByRemoveHashKey(String)\r
58 String = String.strip()\r
59 \r
60 FileLinesList = GetFileLineContent(String, WorkSpace, LineNo, OrignalString)\r
61\r
62 \r
63 ReFindFileGuidPattern = re.compile("^\s*FILE_GUID\s*=.*$")\r
64 ReFindVerStringPattern = re.compile("^\s*VERSION_STRING\s*=.*$")\r
65 \r
66 FileLinesList = ProcessLineExtender(FileLinesList)\r
67\r
68 for Line in FileLinesList:\r
69 if ReFindFileGuidPattern.match(Line):\r
70 FileGuidString = Line\r
71 if ReFindVerStringPattern.match(Line):\r
72 VerString = Line\r
73 \r
74 if FileGuidString:\r
75 FileGuidString = GetSplitValueList(FileGuidString, '=', 1)[1]\r
76 if VerString:\r
77 VerString = GetSplitValueList(VerString, '=', 1)[1]\r
78 \r
79 return FileGuidString, VerString\r
80 \r
81## GetPackageListInfo\r
82#\r
83# Get the package information from INF file.\r
84#\r
85# @param string. A string start with # and followed by INF file path\r
86# @param WorkSpace. The WorkSpace directory used to combined with INF file path.\r
87#\r
88# @return GUID, Version\r
89def GetPackageListInfo(FileNameString, WorkSpace, LineNo): \r
90 PackageInfoList = []\r
91 DefineSectionMacros = {}\r
92 PackageSectionMacros = {}\r
93 \r
94 FileLinesList = GetFileLineContent(FileNameString, WorkSpace, LineNo, '')\r
95 \r
96 RePackageHeader = re.compile('^\s*\[Packages.*\].*$')\r
97 ReDefineHeader = re.compile('^\s*\[Defines].*$')\r
98 \r
99 PackageHederFlag = False\r
100 DefineHeaderFlag = False\r
101 LineNo = -1\r
102 for Line in FileLinesList:\r
103 LineNo += 1\r
104 Line = Line.strip()\r
105 \r
106 if Line.startswith('['):\r
107 PackageHederFlag = False\r
108 DefineHeaderFlag = False \r
109 \r
110 if Line.startswith("#"):\r
111 continue\r
112 \r
113 if not Line:\r
114 continue \r
115 \r
116 #\r
117 # Found [Packages] section \r
118 #\r
119 if RePackageHeader.match(Line):\r
120 PackageHederFlag = True\r
121 continue\r
122 \r
123 #\r
124 # Found [Define] section\r
125 #\r
126 if ReDefineHeader.match(Line):\r
127 DefineHeaderFlag = True\r
128 continue\r
129 \r
130 if DefineHeaderFlag:\r
131 #\r
132 # Find Macro\r
133 #\r
134 Name, Value = MacroParser((Line, LineNo),\r
135 FileNameString,\r
136 DT.MODEL_META_DATA_HEADER,\r
137 DefineSectionMacros) \r
138 \r
139 if Name != None:\r
140 DefineSectionMacros[Name] = Value \r
141 continue\r
142 \r
143 if PackageHederFlag:\r
144\r
145 #\r
146 # Find Macro\r
147 #\r
148 Name, Value = MacroParser((Line, LineNo),\r
149 FileNameString,\r
150 DT.MODEL_META_DATA_PACKAGE,\r
151 DefineSectionMacros)\r
152 if Name != None:\r
153 PackageSectionMacros[Name] = Value \r
154 continue\r
155 \r
156 #\r
157 # Replace with Local section Macro and [Defines] section Macro.\r
158 # \r
159 Line = InfExpandMacro(Line, (FileNameString, Line, LineNo), DefineSectionMacros, PackageSectionMacros, True)\r
160 \r
161 Line = GetSplitValueList(Line, "#", 1)[0]\r
162 Line = GetSplitValueList(Line, "|", 1)[0]\r
163 PackageInfoList.append(Line)\r
164 \r
165 return PackageInfoList \r
166 \r
167def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):\r
168 \r
169 if not LineNo:\r
170 LineNo = -1\r
171\r
172 #\r
173 # Validate file name exist.\r
174 #\r
175 FullFileName = os.path.normpath(os.path.realpath(os.path.join(WorkSpace, FileName)))\r
176 if not (ValidFile(FullFileName)):\r
177 Logger.Error("InfParser", \r
178 ToolError.FORMAT_INVALID,\r
179 ST.ERR_FILELIST_EXIST%(FileName),\r
180 File=GlobalData.gINF_MODULE_NAME,\r
181 Line=LineNo, \r
182 ExtraData=OriginalString)\r
183 \r
184 #\r
185 # Validate file exist/format.\r
186 #\r
187 if IsValidPath(FileName, WorkSpace):\r
188 IsValidFileFlag = True\r
189 else:\r
190 Logger.Error("InfParser", \r
191 ToolError.FORMAT_INVALID,\r
192 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(FileName),\r
193 File=GlobalData.gINF_MODULE_NAME, \r
194 Line=LineNo, \r
195 ExtraData=OriginalString)\r
196 return False\r
197 \r
198 FileLinesList = []\r
199 \r
200 if IsValidFileFlag: \r
201 try:\r
202 FullFileName = FullFileName.replace('\\', '/')\r
203 Inputfile = open(FullFileName, "rb", 0)\r
204 try:\r
205 FileLinesList = Inputfile.readlines()\r
206 except BaseException:\r
207 Logger.Error("InfParser", ToolError.FILE_READ_FAILURE, ST.ERR_FILE_OPEN_FAILURE, File=FullFileName)\r
208 finally:\r
209 Inputfile.close()\r
210 except BaseException:\r
211 Logger.Error("InfParser", \r
212 ToolError.FILE_READ_FAILURE, \r
213 ST.ERR_FILE_OPEN_FAILURE,\r
214 File=FullFileName)\r
215 \r
216 FileLinesList = ProcessLineExtender(FileLinesList)\r
217 \r
218 return FileLinesList\r
219