]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/Object/Parser/InfLibraryClassesObject.py
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfLibraryClassesObject.py
1 ## @file
2 # This file is used to define class objects of INF file [LibraryClasses] section.
3 # It will consumed by InfParser.
4 #
5 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
6 #
7 # This program and the accompanying materials are licensed and made available
8 # under the terms and conditions of the BSD License which accompanies this
9 # distribution. The full text of the license may be found at
10 # http://opensource.org/licenses/bsd-license.php
11 #
12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 '''
16 InfLibraryClassesObject
17 '''
18
19 from Logger import StringTable as ST
20 from Logger import ToolError
21 import Logger.Log as Logger
22 from Library import GlobalData
23
24 from Library.Misc import Sdict
25 from Object.Parser.InfCommonObject import CurrentLine
26 from Library.ExpressionValidate import IsValidFeatureFlagExp
27 from Library.ParserValidate import IsValidLibName
28
29 ## GetArchModuleType
30 #
31 # Get Arch List and ModuleType List
32 #
33 def GetArchModuleType(KeyList):
34 __SupArchList = []
35 __SupModuleList = []
36
37 for (ArchItem, ModuleItem) in KeyList:
38 #
39 # Validate Arch
40 #
41 if (ArchItem == '' or ArchItem is None):
42 ArchItem = 'COMMON'
43
44 if (ModuleItem == '' or ModuleItem is None):
45 ModuleItem = 'COMMON'
46
47 if ArchItem not in __SupArchList:
48 __SupArchList.append(ArchItem)
49
50 List = ModuleItem.split('|')
51 for Entry in List:
52 if Entry not in __SupModuleList:
53 __SupModuleList.append(Entry)
54
55 return (__SupArchList, __SupModuleList)
56
57
58 class InfLibraryClassItem():
59 def __init__(self, LibName='', FeatureFlagExp='', HelpString=None):
60 self.LibName = LibName
61 self.FeatureFlagExp = FeatureFlagExp
62 self.HelpString = HelpString
63 self.CurrentLine = CurrentLine()
64 self.SupArchList = []
65 self.SupModuleList = []
66 self.FileGuid = ''
67 self.Version = ''
68
69 def SetLibName(self, LibName):
70 self.LibName = LibName
71 def GetLibName(self):
72 return self.LibName
73
74 def SetHelpString(self, HelpString):
75 self.HelpString = HelpString
76 def GetHelpString(self):
77 return self.HelpString
78
79 def SetFeatureFlagExp(self, FeatureFlagExp):
80 self.FeatureFlagExp = FeatureFlagExp
81 def GetFeatureFlagExp(self):
82 return self.FeatureFlagExp
83
84 def SetSupArchList(self, SupArchList):
85 self.SupArchList = SupArchList
86 def GetSupArchList(self):
87 return self.SupArchList
88
89 def SetSupModuleList(self, SupModuleList):
90 self.SupModuleList = SupModuleList
91 def GetSupModuleList(self):
92 return self.SupModuleList
93
94 #
95 # As Build related information
96 #
97 def SetFileGuid(self, FileGuid):
98 self.FileGuid = FileGuid
99 def GetFileGuid(self):
100 return self.FileGuid
101
102 def SetVersion(self, Version):
103 self.Version = Version
104 def GetVersion(self):
105 return self.Version
106
107 ## INF LibraryClass Section
108 #
109 #
110 #
111 class InfLibraryClassObject():
112 def __init__(self):
113 self.LibraryClasses = Sdict()
114 #
115 # Macro defined in this section should be only used in this section.
116 #
117 self.Macros = {}
118
119 ##SetLibraryClasses
120 #
121 #
122 # @param HelpString: It can be a common comment or contain a recommend
123 # instance.
124 #
125 def SetLibraryClasses(self, LibContent, KeyList=None):
126 #
127 # Validate Arch
128 #
129 (__SupArchList, __SupModuleList) = GetArchModuleType(KeyList)
130
131 for LibItem in LibContent:
132 LibItemObj = InfLibraryClassItem()
133 if not GlobalData.gIS_BINARY_INF:
134 HelpStringObj = LibItem[1]
135 LibItemObj.CurrentLine.SetFileName(LibItem[2][2])
136 LibItemObj.CurrentLine.SetLineNo(LibItem[2][1])
137 LibItemObj.CurrentLine.SetLineString(LibItem[2][0])
138 LibItem = LibItem[0]
139 if HelpStringObj is not None:
140 LibItemObj.SetHelpString(HelpStringObj)
141 if len(LibItem) >= 1:
142 if LibItem[0].strip() != '':
143 if IsValidLibName(LibItem[0].strip()):
144 if LibItem[0].strip() != 'NULL':
145 LibItemObj.SetLibName(LibItem[0])
146 else:
147 Logger.Error("InfParser",
148 ToolError.FORMAT_INVALID,
149 ST.ERR_INF_PARSER_DEFINE_LIB_NAME_INVALID,
150 File=GlobalData.gINF_MODULE_NAME,
151 Line=LibItemObj.CurrentLine.GetLineNo(),
152 ExtraData=LibItemObj.CurrentLine.GetLineString())
153 else:
154 Logger.Error("InfParser",
155 ToolError.FORMAT_INVALID,
156 ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (LibItem[0]),
157 File=GlobalData.gINF_MODULE_NAME,
158 Line=LibItemObj.CurrentLine.GetLineNo(),
159 ExtraData=LibItemObj.CurrentLine.GetLineString())
160 else:
161 Logger.Error("InfParser",
162 ToolError.FORMAT_INVALID,
163 ST.ERR_INF_PARSER_LIBRARY_SECTION_LIBNAME_MISSING,
164 File=GlobalData.gINF_MODULE_NAME,
165 Line=LibItemObj.CurrentLine.GetLineNo(),
166 ExtraData=LibItemObj.CurrentLine.GetLineString())
167 if len(LibItem) == 2:
168 if LibItem[1].strip() == '':
169 Logger.Error("InfParser",
170 ToolError.FORMAT_INVALID,
171 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,
172 File=GlobalData.gINF_MODULE_NAME,
173 Line=LibItemObj.CurrentLine.GetLineNo(),
174 ExtraData=LibItemObj.CurrentLine.GetLineString())
175 #
176 # Validate FFE
177 #
178 FeatureFlagRtv = IsValidFeatureFlagExp(LibItem[1].strip())
179 if not FeatureFlagRtv[0]:
180 Logger.Error("InfParser",
181 ToolError.FORMAT_INVALID,
182 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),
183 File=GlobalData.gINF_MODULE_NAME,
184 Line=LibItemObj.CurrentLine.GetLineNo(),
185 ExtraData=LibItemObj.CurrentLine.GetLineString())
186 LibItemObj.SetFeatureFlagExp(LibItem[1].strip())
187
188 #
189 # Invalid strings
190 #
191 if len(LibItem) < 1 or len(LibItem) > 2:
192 Logger.Error("InfParser",
193 ToolError.FORMAT_INVALID,
194 ST.ERR_INF_PARSER_LIBRARY_SECTION_CONTENT_ERROR,
195 File=GlobalData.gINF_MODULE_NAME,
196 Line=LibItemObj.CurrentLine.GetLineNo(),
197 ExtraData=LibItemObj.CurrentLine.GetLineString())
198
199 LibItemObj.SetSupArchList(__SupArchList)
200 LibItemObj.SetSupModuleList(__SupModuleList)
201
202 #
203 # Determine Library class duplicate. Follow below rule:
204 #
205 # A library class keyword must not be duplicated within a
206 # [LibraryClasses] section. Library class keywords may appear in
207 # multiple architectural and module type [LibraryClasses] sections.
208 # A library class keyword listed in an architectural or module type
209 # [LibraryClasses] section must not be listed in the common
210 # architectural or module type [LibraryClasses] section.
211 #
212 # NOTE: This check will not report error now. But keep code for future enhancement.
213 #
214 # for Item in self.LibraryClasses:
215 # if Item.GetLibName() == LibItemObj.GetLibName():
216 # ItemSupArchList = Item.GetSupArchList()
217 # ItemSupModuleList = Item.GetSupModuleList()
218 # for ItemArch in ItemSupArchList:
219 # for ItemModule in ItemSupModuleList:
220 # for LibItemObjArch in __SupArchList:
221 # for LibItemObjModule in __SupModuleList:
222 # if ItemArch == LibItemObjArch and LibItemObjModule == ItemModule:
223 # #
224 # # ERR_INF_PARSER_ITEM_DUPLICATE
225 # #
226 # pass
227 # if (ItemArch.upper() == 'COMMON' or LibItemObjArch.upper() == 'COMMON') \
228 # and LibItemObjModule == ItemModule:
229 # #
230 # # ERR_INF_PARSER_ITEM_DUPLICATE_COMMON
231 # #
232 # pass
233 else:
234 #
235 # Assume the file GUID is well formatted.
236 #
237 LibItemObj.SetFileGuid(LibItem[0])
238 LibItemObj.SetVersion(LibItem[1])
239 LibItemObj.SetSupArchList(__SupArchList)
240
241 if (LibItemObj) in self.LibraryClasses:
242 LibraryList = self.LibraryClasses[LibItemObj]
243 LibraryList.append(LibItemObj)
244 self.LibraryClasses[LibItemObj] = LibraryList
245 else:
246 LibraryList = []
247 LibraryList.append(LibItemObj)
248 self.LibraryClasses[LibItemObj] = LibraryList
249
250 return True
251
252 def GetLibraryClasses(self):
253 return self.LibraryClasses