]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - 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
... / ...
CommitLineData
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
10InfLibraryClassesObject\r
11'''\r
12\r
13from Logger import StringTable as ST\r
14from Logger import ToolError\r
15import Logger.Log as Logger\r
16from Library import GlobalData\r
17\r
18from Library.Misc import Sdict\r
19from Object.Parser.InfCommonObject import CurrentLine\r
20from Library.ExpressionValidate import IsValidFeatureFlagExp\r
21from Library.ParserValidate import IsValidLibName\r
22\r
23## GetArchModuleType\r
24#\r
25# Get Arch List and ModuleType List\r
26#\r
27def 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
52class 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
105class 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