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