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