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