]> git.proxmox.com Git - mirror_edk2.git/blame - 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
4234283c 1## @file\r
f7496d71
LG
2# This file is used to define class objects of INF file [LibraryClasses] section.\r
3# It will consumed by InfParser.\r
4234283c 4#\r
f7496d71 5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 6#\r
2e351cbe 7# SPDX-License-Identifier: BSD-2-Clause-Patent\r
4234283c
LG
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
f7496d71 34 #\r
4231a819 35 if (ArchItem == '' or ArchItem is None):\r
4234283c
LG
36 ArchItem = 'COMMON'\r
37\r
4231a819 38 if (ModuleItem == '' or ModuleItem is None):\r
4234283c
LG
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
f7496d71 115 #\r
4234283c
LG
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
4231a819 133 if HelpStringObj is not None:\r
4234283c
LG
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
f7496d71 170 # Validate FFE\r
4234283c
LG
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
f7496d71
LG
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
4234283c 204 # architectural or module type [LibraryClasses] section.\r
f7496d71 205 #\r
4234283c 206 # NOTE: This check will not report error now. But keep code for future enhancement.\r
f7496d71 207 #\r
4234283c
LG
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
421ccda3 233 LibItemObj.SetSupArchList(__SupArchList)\r
4234283c 234\r
27c4ceb4 235 if (LibItemObj) in self.LibraryClasses:\r
4234283c
LG
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