]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/inf.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Scripts / PackageDocumentTools / plugins / EdkPlugins / edk2 / model / inf.py
CommitLineData
7ccc9c95
YZ
1## @file\r
2#\r
3# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4#\r
2e351cbe 5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
7ccc9c95
YZ
6#\r
7\r
9ab4ec51 8from plugins.EdkPlugins.basemodel import ini\r
7ccc9c95 9import re, os\r
9ab4ec51 10from plugins.EdkPlugins.basemodel.message import *\r
7ccc9c95
YZ
11\r
12class INFFile(ini.BaseINIFile):\r
13 _libobjs = {}\r
14\r
15 def GetSectionInstance(self, parent, name, isCombined=False):\r
16 return INFSection(parent, name, isCombined)\r
17\r
18 def GetProduceLibraryClass(self):\r
19 obj = self.GetDefine("LIBRARY_CLASS")\r
4231a819 20 if obj is None: return None\r
7ccc9c95
YZ
21\r
22 return obj.split('|')[0].strip()\r
23\r
24 def GetSectionObjectsByName(self, name, arch=None):\r
25 arr = []\r
26 sects = self.GetSectionByName(name)\r
27 for sect in sects:\r
28 # skip unmatched archtecture content\r
29 if not sect.IsArchMatch(arch):\r
30 continue\r
31\r
32 for obj in sect.GetObjects():\r
33 arr.append(obj)\r
34\r
35 return arr\r
36\r
37 def GetSourceObjects(self, arch=None, tool=None):\r
38 arr = []\r
39 sects = self.GetSectionByName('sources')\r
40 for sect in sects:\r
41 # skip unmatched archtecture content\r
42 if not sect.IsArchMatch(arch):\r
43 continue\r
44\r
45 for obj in sect.GetObjects():\r
46 if not obj.IsMatchFamily(tool):\r
47 continue\r
48 arr.append(obj)\r
49\r
50 return arr\r
51\r
52 def Parse(self):\r
53 if not ini.BaseINIFile.Parse(self):\r
54 return False\r
55 classname = self.GetProduceLibraryClass()\r
4231a819 56 if classname is not None:\r
7ccc9c95 57 libobjdict = INFFile._libobjs\r
27c4ceb4 58 if classname in libobjdict:\r
7ccc9c95
YZ
59 if self not in libobjdict[classname]:\r
60 libobjdict[classname].append(self)\r
61 else:\r
62 libobjdict[classname] = [self]\r
63\r
64 return True\r
65\r
66 def GetBaseName(self):\r
67 return self.GetDefine("BASE_NAME").strip()\r
68\r
69 def GetModuleRootPath(self):\r
70 return os.path.dirname(self.GetFilename())\r
71\r
72 def Clear(self):\r
73 classname = self.GetProduceLibraryClass()\r
4231a819 74 if classname is not None:\r
7ccc9c95
YZ
75 libobjdict = INFFile._libobjs\r
76 libobjdict[classname].remove(self)\r
77 if len(libobjdict[classname]) == 0:\r
78 del libobjdict[classname]\r
79 ini.BaseINIFile.Clear(self)\r
80\r
81\r
82class INFSection(ini.BaseINISection):\r
83 def GetSectionINIObject(self, parent):\r
84 type = self.GetType()\r
85\r
86 if type.lower() == 'libraryclasses':\r
87 return INFLibraryClassObject(self)\r
88 if type.lower() == 'sources':\r
89 return INFSourceObject(self)\r
90 if type.lower().find('pcd') != -1:\r
91 return INFPcdObject(self)\r
92 if type.lower() == 'packages':\r
93 return INFDependentPackageObject(self)\r
94 if type.lower() in ['guids', 'protocols', 'ppis']:\r
95 return INFGuidObject(self)\r
96 if type.lower() == 'defines':\r
97 return INFDefineSectionObject(self)\r
98 return INFSectionObject(self)\r
99\r
100 def GetType(self):\r
101 arr = self._name.split('.')\r
102 return arr[0].strip()\r
103\r
104 def GetArch(self):\r
105 arr = self._name.split('.')\r
106 if len(arr) == 1:\r
107 return 'common'\r
108 return arr[1]\r
109\r
110 def IsArchMatch(self, arch):\r
4231a819 111 if arch is None or self.GetArch() == 'common':\r
7ccc9c95
YZ
112 return True\r
113\r
114 if self.GetArch().lower() != arch.lower():\r
115 return False\r
116\r
117 return True\r
118\r
119class INFSectionObject(ini.BaseINISectionObject):\r
120 def GetArch(self):\r
121 return self.GetParent().GetArch()\r
122\r
123class INFDefineSectionObject(INFSectionObject):\r
124 def __init__(self, parent):\r
125 INFSectionObject.__init__(self, parent)\r
126 self._key = None\r
127 self._value = None\r
128\r
129 def Parse(self):\r
130 assert (self._start == self._end), 'The object in define section must be in single line'\r
131\r
132 line = self.GetLineByOffset(self._start).strip()\r
133\r
134 line = line.split('#')[0]\r
135 arr = line.split('=')\r
136 if len(arr) != 2:\r
137 ErrorMsg('Invalid define section object',\r
138 self.GetFilename(),\r
139 self._start\r
140 )\r
141 return False\r
142\r
143 self._key = arr[0].strip()\r
144 self._value = arr[1].strip()\r
145\r
146 return True\r
147\r
148 def GetKey(self):\r
149 return self._key\r
150\r
151 def GetValue(self):\r
152 return self._value\r
153\r
154class INFLibraryClassObject(INFSectionObject):\r
155 _objs = {}\r
156 def __init__(self, parent):\r
157 INFSectionObject.__init__(self, parent)\r
158 self._classname = None\r
159\r
160 def GetClass(self):\r
161 return self._classname\r
162\r
163 def Parse(self):\r
164 self._classname = self.GetLineByOffset(self._start).split('#')[0].strip()\r
165 objdict = INFLibraryClassObject._objs\r
27c4ceb4 166 if self._classname in objdict:\r
7ccc9c95
YZ
167 objdict[self._classname].append(self)\r
168 else:\r
169 objdict[self._classname] = [self]\r
170 return True\r
171\r
172 def Destroy(self):\r
173 objdict = INFLibraryClassObject._objs\r
174 objdict[self._classname].remove(self)\r
175 if len(objdict[self._classname]) == 0:\r
176 del objdict[self._classname]\r
177\r
178 def GetName(self):\r
179 return self._classname\r
180\r
181 @staticmethod\r
182 def GetObjectDict():\r
183 return INFLibraryClassObject._objs\r
184\r
185class INFDependentPackageObject(INFSectionObject):\r
186 def GetPath(self):\r
187 return self.GetLineByOffset(self._start).split('#')[0].strip()\r
188\r
189class INFSourceObject(INFSectionObject):\r
190 _objs = {}\r
191 def __init__(self, parent):\r
192 INFSectionObject.__init__(self, parent)\r
193\r
194 self.mSourcename = None\r
195 self.mToolCode = None\r
196 self.mFamily = None\r
197 self.mTagName = None\r
198 self.mFeaturePcd = None\r
199 self.mFilename = None\r
200\r
201 def GetSourcePath(self):\r
202 return self.mSourcename\r
203\r
204 def GetSourceFullPath(self):\r
205 path = os.path.dirname(self.GetFilename())\r
206 path = os.path.join(path, self.GetSourcePath())\r
207 return os.path.normpath(path)\r
208\r
209 def GetToolCode(self):\r
210 return self.mToolCode\r
211\r
212 def GetFamily(self):\r
213 return self.mFamily\r
214\r
215 def GetTagName(self):\r
216 return self.mTagName\r
217\r
218 def GetFeaturePcd(self):\r
219 return self.mFeaturePcd\r
220\r
221 def Parse(self):\r
222 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
223\r
224 arr = line.split('|')\r
225\r
226 self.mSourcename = arr[0].strip()\r
227 if len(arr) >= 2:\r
228 self.mFamily = arr[1].strip()\r
229 if len(arr) >= 3:\r
230 self.mTagName = arr[2].strip()\r
231 if len(arr) >= 4:\r
232 self.mToolCode = arr[3].strip()\r
233 if len(arr) >= 5:\r
234 self.mFeaturePcd = arr[4].strip()\r
235\r
236 self.mFilename = os.path.basename(self.GetSourceFullPath())\r
237 objdict = INFSourceObject._objs\r
27c4ceb4 238 if self.mFilename not in objdict:\r
7ccc9c95
YZ
239 objdict[self.mFilename] = [self]\r
240 else:\r
241 objdict[self.mFilename].append(self)\r
242\r
243 return True\r
244\r
245 def GetName(self):\r
246 return self.mFilename\r
247\r
248 def Destroy(self):\r
249 objdict = INFSourceObject._objs\r
250 objdict[self.mFilename].remove(self)\r
251 if len(objdict[self.mFilename]) == 0:\r
252 del objdict[self.mFilename]\r
253\r
254 def IsMatchFamily(self, family):\r
4231a819 255 if family is None:\r
7ccc9c95 256 return True\r
4231a819 257 if self.mFamily is not None:\r
7ccc9c95
YZ
258 if family.strip().lower() == self.mFamily.lower():\r
259 return True\r
260 else:\r
261 return False\r
262 else:\r
263 fname = self.GetSourcePath()\r
264 if fname.endswith('.S') and family.lower() != 'gcc':\r
265 return False\r
266 if fname.endswith('.s') and (self.GetArch().lower() != 'ipf' and self.GetArch().lower() != 'common'):\r
267 return False\r
268 if fname.lower().endswith('.asm') and (family.lower() != 'msft' and family.lower() != 'intel'):\r
269 return False\r
270 return True\r
271\r
272 @staticmethod\r
273 def GetObjectDict():\r
274 return INFSourceObject._objs\r
275\r
276class INFPcdObject(INFSectionObject):\r
277 _objs = {}\r
278\r
279 def __init__(self, parent):\r
280 INFSectionObject.__init__(self, parent)\r
281\r
282 self.mPcdType = None\r
283 self.mDefaultValue = None\r
284 self.mPcdName = None\r
285\r
286 @staticmethod\r
287 def GetObjectDict():\r
288 return INFPcdObject._objs\r
289\r
290 def Parse(self):\r
291 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
292\r
293 arr = line.split('|')\r
294 self.mPcdName = arr[0].strip()\r
295\r
296 if len(arr) >= 2:\r
297 self.mDefaultValue = arr[1].strip()\r
298\r
299 objdict = INFPcdObject._objs\r
27c4ceb4 300 if self.GetName() in objdict:\r
7ccc9c95
YZ
301 if self not in objdict[self.GetName()]:\r
302 objdict[self.GetName()].append(self)\r
303 else:\r
304 objdict[self.GetName()] = [self]\r
305 return True\r
306\r
307 def GetPcdName(self):\r
308 return self.mPcdName\r
309\r
310 def GetPcdType(self):\r
311 return self.GetParent().GetType()\r
312\r
313 def GetName(self):\r
314 return self.mPcdName.split('.')[1]\r
315\r
316 def Destroy(self):\r
317 objdict = INFPcdObject._objs\r
318 objdict[self.GetName()].remove(self)\r
319 if len(objdict[self.GetName()]) == 0:\r
320 del objdict[self.GetName()]\r
321\r
322class INFGuidObject(INFSectionObject):\r
323 def __init__(self, parent):\r
324 INFSectionObject.__init__(self, parent)\r
325 self._name = None\r
326\r
327 def Parse(self):\r
328 line = self.GetLineByOffset(self._start).strip().split('#')[0].split("|")[0]\r
329 self._name = line.strip()\r
330 return True\r
331\r
332 def GetName(self):\r
333 return self._name\r
334\r
335\r