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