]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dec.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Scripts / PackageDocumentTools / plugins / EdkPlugins / edk2 / model / dec.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 DECFile(ini.BaseINIFile):\r
13\r
14 def GetSectionInstance(self, parent, name, isCombined=False):\r
15 return DECSection(parent, name, isCombined)\r
16\r
17 def GetComponents(self):\r
18 return self.GetSectionByName('Components')\r
19\r
20 def GetPackageRootPath(self):\r
21 return os.path.dirname(self.GetFilename()).strip()\r
22\r
23 def GetBaseName(self):\r
24 return self.GetDefine("PACKAGE_NAME").strip()\r
25\r
26 def GetVersion(self):\r
27 return self.GetDefine("PACKAGE_VERSION").strip()\r
28\r
29 def GetSectionObjectsByName(self, name, arch=None):\r
30 arr = []\r
31 sects = self.GetSectionByName(name)\r
32 for sect in sects:\r
33 # skip unmatched archtecture content\r
34 if not sect.IsArchMatch(arch):\r
35 continue\r
36\r
37 for obj in sect.GetObjects():\r
38 arr.append(obj)\r
39\r
40 return arr\r
41\r
42class DECSection(ini.BaseINISection):\r
43 def GetSectionINIObject(self, parent):\r
44 type = self.GetType()\r
45\r
46 if type.lower().find('defines') != -1:\r
47 return DECDefineSectionObject(self)\r
48 if type.lower().find('includes') != -1:\r
49 return DECIncludeObject(self)\r
50 if type.lower().find('pcd') != -1:\r
51 return DECPcdObject(self)\r
52 if type.lower() == 'libraryclasses':\r
53 return DECLibraryClassObject(self)\r
54 if type.lower() == 'guids':\r
55 return DECGuidObject(self)\r
56 if type.lower() == 'ppis':\r
57 return DECPpiObject(self)\r
58 if type.lower() == 'protocols':\r
59 return DECProtocolObject(self)\r
60\r
61 return DECSectionObject(self)\r
62\r
63 def GetType(self):\r
64 arr = self._name.split('.')\r
65 return arr[0].strip()\r
66\r
67 def GetArch(self):\r
68 arr = self._name.split('.')\r
69 if len(arr) == 1:\r
70 return 'common'\r
71 return arr[1]\r
72\r
73 def IsArchMatch(self, arch):\r
4231a819 74 if arch is None or self.GetArch() == 'common':\r
7ccc9c95
YZ
75 return True\r
76\r
77 if self.GetArch().lower() != arch.lower():\r
78 return False\r
79\r
80 return True\r
81\r
82class DECSectionObject(ini.BaseINISectionObject):\r
83 def GetArch(self):\r
84 return self.GetParent().GetArch()\r
85\r
86class DECDefineSectionObject(DECSectionObject):\r
87 def __init__(self, parent):\r
88 DECSectionObject.__init__(self, parent)\r
89 self._key = None\r
90 self._value = None\r
91\r
92 def Parse(self):\r
93 assert (self._start == self._end), 'The object in define section must be in single line'\r
94\r
95 line = self.GetLineByOffset(self._start).strip()\r
96\r
97 line = line.split('#')[0]\r
98 arr = line.split('=')\r
99 if len(arr) != 2:\r
100 ErrorMsg('Invalid define section object',\r
101 self.GetFilename(),\r
102 self.GetParent().GetName()\r
103 )\r
104 return False\r
105\r
106 self._key = arr[0].strip()\r
107 self._value = arr[1].strip()\r
108\r
109 return True\r
110\r
111 def GetKey(self):\r
112 return self._key\r
113\r
114 def GetValue(self):\r
115 return self._value\r
116\r
117class DECGuidObject(DECSectionObject):\r
118 _objs = {}\r
119\r
120 def __init__(self, parent):\r
121 DECSectionObject.__init__(self, parent)\r
122 self._name = None\r
123\r
124 def Parse(self):\r
125 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
126 self._name = line.split('=')[0].strip()\r
127 self._guid = line.split('=')[1].strip()\r
128 objdict = DECGuidObject._objs\r
129 if self._name not in objdict.keys():\r
130 objdict[self._name] = [self]\r
131 else:\r
132 objdict[self._name].append(self)\r
133\r
134 return True\r
135\r
136 def GetName(self):\r
137 return self._name\r
138\r
139 def GetGuid(self):\r
140 return self._guid\r
141\r
142 def Destroy(self):\r
143 objdict = DECGuidObject._objs\r
144 objdict[self._name].remove(self)\r
145 if len(objdict[self._name]) == 0:\r
146 del objdict[self._name]\r
147\r
148 @staticmethod\r
149 def GetObjectDict():\r
150 return DECGuidObject._objs\r
151\r
152class DECPpiObject(DECSectionObject):\r
153 _objs = {}\r
154 def __init__(self, parent):\r
155 DECSectionObject.__init__(self, parent)\r
156 self._name = None\r
157\r
158 def Parse(self):\r
159 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
160 self._name = line.split('=')[0].strip()\r
161 self._guid = line.split('=')[1].strip()\r
162 objdict = DECPpiObject._objs\r
163 if self._name not in objdict.keys():\r
164 objdict[self._name] = [self]\r
165 else:\r
166 objdict[self._name].append(self)\r
167\r
168 return True\r
169\r
170 def GetName(self):\r
171 return self._name\r
172\r
173 def GetGuid(self):\r
174 return self._guid\r
175\r
176 def Destroy(self):\r
177 objdict = DECPpiObject._objs\r
178 objdict[self._name].remove(self)\r
179 if len(objdict[self._name]) == 0:\r
180 del objdict[self._name]\r
181\r
182 @staticmethod\r
183 def GetObjectDict():\r
184 return DECPpiObject._objs\r
185\r
186class DECProtocolObject(DECSectionObject):\r
187 _objs = {}\r
188\r
189 def __init__(self, parent):\r
190 DECSectionObject.__init__(self, parent)\r
191 self._name = None\r
192\r
193 def Parse(self):\r
194 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
195 self._name = line.split('=')[0].strip()\r
196 self._guid = line.split('=')[1].strip()\r
197 objdict = DECProtocolObject._objs\r
198 if self._name not in objdict.keys():\r
199 objdict[self._name] = [self]\r
200 else:\r
201 objdict[self._name].append(self)\r
202\r
203 return True\r
204\r
205 def GetName(self):\r
206 return self._name\r
207\r
208 def GetGuid(self):\r
209 return self._guid\r
210\r
211 def Destroy(self):\r
212 objdict = DECProtocolObject._objs\r
213 objdict[self._name].remove(self)\r
214 if len(objdict[self._name]) == 0:\r
215 del objdict[self._name]\r
216\r
217\r
218 @staticmethod\r
219 def GetObjectDict():\r
220 return DECProtocolObject._objs\r
221\r
222class DECLibraryClassObject(DECSectionObject):\r
223 _objs = {}\r
224\r
225 def __init__(self, parent):\r
226 DECSectionObject.__init__(self, parent)\r
227 self.mClassName = None\r
228 self.mHeaderFile = None\r
229\r
230 def Parse(self):\r
231 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
232 self.mClassName, self.mHeaderFile = line.split('|')\r
233 objdict = DECLibraryClassObject._objs\r
234 if self.mClassName not in objdict.keys():\r
235 objdict[self.mClassName] = [self]\r
236 else:\r
237 objdict[self.mClassName].append(self)\r
238 return True\r
239\r
240 def GetClassName(self):\r
241 return self.mClassName\r
242\r
243 def GetName(self):\r
244 return self.mClassName\r
245\r
246 def GetHeaderFile(self):\r
247 return self.mHeaderFile\r
248\r
249 def Destroy(self):\r
250 objdict = DECLibraryClassObject._objs\r
251 objdict[self.mClassName].remove(self)\r
252 if len(objdict[self.mClassName]) == 0:\r
253 del objdict[self.mClassName]\r
254\r
255 @staticmethod\r
256 def GetObjectDict():\r
257 return DECLibraryClassObject._objs\r
258\r
259class DECIncludeObject(DECSectionObject):\r
260 def __init__(self, parent):\r
261 DECSectionObject.__init__(self, parent)\r
262\r
263 def GetPath(self):\r
264 return self.GetLineByOffset(self._start).split('#')[0].strip()\r
265\r
266class DECPcdObject(DECSectionObject):\r
267 _objs = {}\r
268\r
269 def __init__(self, parent):\r
270 DECSectionObject.__init__(self, parent)\r
271 self.mPcdName = None\r
272 self.mPcdDefaultValue = None\r
273 self.mPcdDataType = None\r
274 self.mPcdToken = None\r
275\r
276 def Parse(self):\r
277 line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
278 (self.mPcdName, self.mPcdDefaultValue, self.mPcdDataType, self.mPcdToken) = line.split('|')\r
279 objdict = DECPcdObject._objs\r
280 if self.mPcdName not in objdict.keys():\r
281 objdict[self.mPcdName] = [self]\r
282 else:\r
283 objdict[self.mPcdName].append(self)\r
284\r
285 return True\r
286\r
287 def Destroy(self):\r
288 objdict = DECPcdObject._objs\r
289 objdict[self.mPcdName].remove(self)\r
290 if len(objdict[self.mPcdName]) == 0:\r
291 del objdict[self.mPcdName]\r
292\r
293 def GetPcdType(self):\r
294 return self.GetParent().GetType()\r
295\r
296 def GetPcdName(self):\r
297 return self.mPcdName\r
298\r
299 def GetPcdValue(self):\r
300 return self.mPcdDefaultValue\r
301\r
302 def GetPcdDataType(self):\r
303 return self.mPcdDataType\r
304\r
305 def GetPcdToken(self):\r
306 return self.mPcdToken\r
307\r
308 def GetName(self):\r
309 return self.GetPcdName().split('.')[1]\r
310\r
311 @staticmethod\r
312 def GetObjectDict():\r
313 return DECPcdObject._objs\r