]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/inf.py
3 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
8 from plugins
.EdkPlugins
.basemodel
import ini
10 from plugins
.EdkPlugins
.basemodel
.message
import *
12 class INFFile(ini
.BaseINIFile
):
15 def GetSectionInstance(self
, parent
, name
, isCombined
=False):
16 return INFSection(parent
, name
, isCombined
)
18 def GetProduceLibraryClass(self
):
19 obj
= self
.GetDefine("LIBRARY_CLASS")
20 if obj
is None: return None
22 return obj
.split('|')[0].strip()
24 def GetSectionObjectsByName(self
, name
, arch
=None):
26 sects
= self
.GetSectionByName(name
)
28 # skip unmatched archtecture content
29 if not sect
.IsArchMatch(arch
):
32 for obj
in sect
.GetObjects():
37 def GetSourceObjects(self
, arch
=None, tool
=None):
39 sects
= self
.GetSectionByName('sources')
41 # skip unmatched archtecture content
42 if not sect
.IsArchMatch(arch
):
45 for obj
in sect
.GetObjects():
46 if not obj
.IsMatchFamily(tool
):
53 if not ini
.BaseINIFile
.Parse(self
):
55 classname
= self
.GetProduceLibraryClass()
56 if classname
is not None:
57 libobjdict
= INFFile
._libobjs
58 if classname
in libobjdict
:
59 if self
not in libobjdict
[classname
]:
60 libobjdict
[classname
].append(self
)
62 libobjdict
[classname
] = [self
]
66 def GetBaseName(self
):
67 return self
.GetDefine("BASE_NAME").strip()
69 def GetModuleRootPath(self
):
70 return os
.path
.dirname(self
.GetFilename())
73 classname
= self
.GetProduceLibraryClass()
74 if classname
is not None:
75 libobjdict
= INFFile
._libobjs
76 libobjdict
[classname
].remove(self
)
77 if len(libobjdict
[classname
]) == 0:
78 del libobjdict
[classname
]
79 ini
.BaseINIFile
.Clear(self
)
82 class INFSection(ini
.BaseINISection
):
83 def GetSectionINIObject(self
, parent
):
86 if type.lower() == 'libraryclasses':
87 return INFLibraryClassObject(self
)
88 if type.lower() == 'sources':
89 return INFSourceObject(self
)
90 if type.lower().find('pcd') != -1:
91 return INFPcdObject(self
)
92 if type.lower() == 'packages':
93 return INFDependentPackageObject(self
)
94 if type.lower() in ['guids', 'protocols', 'ppis']:
95 return INFGuidObject(self
)
96 if type.lower() == 'defines':
97 return INFDefineSectionObject(self
)
98 return INFSectionObject(self
)
101 arr
= self
._name
.split('.')
102 return arr
[0].strip()
105 arr
= self
._name
.split('.')
110 def IsArchMatch(self
, arch
):
111 if arch
is None or self
.GetArch() == 'common':
114 if self
.GetArch().lower() != arch
.lower():
119 class INFSectionObject(ini
.BaseINISectionObject
):
121 return self
.GetParent().GetArch()
123 class INFDefineSectionObject(INFSectionObject
):
124 def __init__(self
, parent
):
125 INFSectionObject
.__init
__(self
, parent
)
130 assert (self
._start
== self
._end
), 'The object in define section must be in single line'
132 line
= self
.GetLineByOffset(self
._start
).strip()
134 line
= line
.split('#')[0]
135 arr
= line
.split('=')
137 ErrorMsg('Invalid define section object',
143 self
._key
= arr
[0].strip()
144 self
._value
= arr
[1].strip()
154 class INFLibraryClassObject(INFSectionObject
):
156 def __init__(self
, parent
):
157 INFSectionObject
.__init
__(self
, parent
)
158 self
._classname
= None
161 return self
._classname
164 self
._classname
= self
.GetLineByOffset(self
._start
).split('#')[0].strip()
165 objdict
= INFLibraryClassObject
._objs
166 if self
._classname
in objdict
:
167 objdict
[self
._classname
].append(self
)
169 objdict
[self
._classname
] = [self
]
173 objdict
= INFLibraryClassObject
._objs
174 objdict
[self
._classname
].remove(self
)
175 if len(objdict
[self
._classname
]) == 0:
176 del objdict
[self
._classname
]
179 return self
._classname
183 return INFLibraryClassObject
._objs
185 class INFDependentPackageObject(INFSectionObject
):
187 return self
.GetLineByOffset(self
._start
).split('#')[0].strip()
189 class INFSourceObject(INFSectionObject
):
191 def __init__(self
, parent
):
192 INFSectionObject
.__init
__(self
, parent
)
194 self
.mSourcename
= None
195 self
.mToolCode
= None
198 self
.mFeaturePcd
= None
199 self
.mFilename
= None
201 def GetSourcePath(self
):
202 return self
.mSourcename
204 def GetSourceFullPath(self
):
205 path
= os
.path
.dirname(self
.GetFilename())
206 path
= os
.path
.join(path
, self
.GetSourcePath())
207 return os
.path
.normpath(path
)
209 def GetToolCode(self
):
210 return self
.mToolCode
215 def GetTagName(self
):
218 def GetFeaturePcd(self
):
219 return self
.mFeaturePcd
222 line
= self
.GetLineByOffset(self
._start
).strip().split('#')[0]
224 arr
= line
.split('|')
226 self
.mSourcename
= arr
[0].strip()
228 self
.mFamily
= arr
[1].strip()
230 self
.mTagName
= arr
[2].strip()
232 self
.mToolCode
= arr
[3].strip()
234 self
.mFeaturePcd
= arr
[4].strip()
236 self
.mFilename
= os
.path
.basename(self
.GetSourceFullPath())
237 objdict
= INFSourceObject
._objs
238 if self
.mFilename
not in objdict
:
239 objdict
[self
.mFilename
] = [self
]
241 objdict
[self
.mFilename
].append(self
)
246 return self
.mFilename
249 objdict
= INFSourceObject
._objs
250 objdict
[self
.mFilename
].remove(self
)
251 if len(objdict
[self
.mFilename
]) == 0:
252 del objdict
[self
.mFilename
]
254 def IsMatchFamily(self
, family
):
257 if self
.mFamily
is not None:
258 if family
.strip().lower() == self
.mFamily
.lower():
263 fname
= self
.GetSourcePath()
264 if fname
.endswith('.S') and family
.lower() != 'gcc':
266 if fname
.endswith('.s') and (self
.GetArch().lower() != 'ipf' and self
.GetArch().lower() != 'common'):
268 if fname
.lower().endswith('.asm') and (family
.lower() != 'msft' and family
.lower() != 'intel'):
274 return INFSourceObject
._objs
276 class INFPcdObject(INFSectionObject
):
279 def __init__(self
, parent
):
280 INFSectionObject
.__init
__(self
, parent
)
283 self
.mDefaultValue
= None
288 return INFPcdObject
._objs
291 line
= self
.GetLineByOffset(self
._start
).strip().split('#')[0]
293 arr
= line
.split('|')
294 self
.mPcdName
= arr
[0].strip()
297 self
.mDefaultValue
= arr
[1].strip()
299 objdict
= INFPcdObject
._objs
300 if self
.GetName() in objdict
:
301 if self
not in objdict
[self
.GetName()]:
302 objdict
[self
.GetName()].append(self
)
304 objdict
[self
.GetName()] = [self
]
307 def GetPcdName(self
):
310 def GetPcdType(self
):
311 return self
.GetParent().GetType()
314 return self
.mPcdName
.split('.')[1]
317 objdict
= INFPcdObject
._objs
318 objdict
[self
.GetName()].remove(self
)
319 if len(objdict
[self
.GetName()]) == 0:
320 del objdict
[self
.GetName()]
322 class INFGuidObject(INFSectionObject
):
323 def __init__(self
, parent
):
324 INFSectionObject
.__init
__(self
, parent
)
328 line
= self
.GetLineByOffset(self
._start
).strip().split('#')[0].split("|")[0]
329 self
._name
= line
.strip()