]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/Python/UPT/Object/Parser/InfSoucesObject.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfSoucesObject.py
... / ...
CommitLineData
1## @file\r
2# This file is used to define class objects of INF file [Sources] 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
10InfSourcesObject\r
11'''\r
12\r
13import os\r
14\r
15from Logger import StringTable as ST\r
16from Logger import ToolError\r
17import Logger.Log as Logger\r
18from Library import GlobalData\r
19\r
20from Library.Misc import Sdict\r
21from Library.ExpressionValidate import IsValidFeatureFlagExp\r
22from Object.Parser.InfCommonObject import InfSectionCommonDef\r
23from Library.Misc import ValidFile\r
24from Library.ParserValidate import IsValidFamily\r
25from Library.ParserValidate import IsValidPath\r
26\r
27## __GenSourceInstance\r
28#\r
29#\r
30def GenSourceInstance(Item, CurrentLineOfItem, ItemObj):\r
31\r
32 IsValidFileFlag = False\r
33\r
34 if len(Item) < 6 and len(Item) >= 1:\r
35 #\r
36 # File | Family | TagName | ToolCode | FeatureFlagExpr\r
37 #\r
38 if len(Item) == 5:\r
39 #\r
40 # Validate Feature Flag Express\r
41 #\r
42 if Item[4].strip() == '':\r
43 Logger.Error("InfParser",\r
44 ToolError.FORMAT_INVALID,\r
45 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
46 File=CurrentLineOfItem[2],\r
47 Line=CurrentLineOfItem[1],\r
48 ExtraData=CurrentLineOfItem[0])\r
49 #\r
50 # Validate FFE\r
51 #\r
52 FeatureFlagRtv = IsValidFeatureFlagExp(Item[4].strip())\r
53 if not FeatureFlagRtv[0]:\r
54 Logger.Error("InfParser",\r
55 ToolError.FORMAT_INVALID,\r
56 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
57 File=CurrentLineOfItem[2],\r
58 Line=CurrentLineOfItem[1],\r
59 ExtraData=CurrentLineOfItem[0])\r
60 ItemObj.SetFeatureFlagExp(Item[4])\r
61 if len(Item) >= 4:\r
62 if Item[3].strip() == '':\r
63 ItemObj.SetToolCode(Item[3])\r
64 else:\r
65 Logger.Error("InfParser",\r
66 ToolError.FORMAT_INVALID,\r
67 ST.ERR_INF_PARSER_TOOLCODE_NOT_PERMITTED%(Item[2]),\r
68 File=CurrentLineOfItem[2],\r
69 Line=CurrentLineOfItem[1],\r
70 ExtraData=CurrentLineOfItem[0])\r
71 if len(Item) >= 3:\r
72 if Item[2].strip() == '':\r
73 ItemObj.SetTagName(Item[2])\r
74 else:\r
75 Logger.Error("InfParser",\r
76 ToolError.FORMAT_INVALID,\r
77 ST.ERR_INF_PARSER_TAGNAME_NOT_PERMITTED%(Item[2]),\r
78 File=CurrentLineOfItem[2],\r
79 Line=CurrentLineOfItem[1],\r
80 ExtraData=CurrentLineOfItem[0])\r
81 if len(Item) >= 2:\r
82 if IsValidFamily(Item[1].strip()):\r
83 #\r
84 # To align with UDP specification. "*" is not permitted in UDP specification\r
85 #\r
86 if Item[1].strip() == "*":\r
87 Item[1] = ""\r
88 ItemObj.SetFamily(Item[1])\r
89 else:\r
90 Logger.Error("InfParser",\r
91 ToolError.FORMAT_INVALID,\r
92 ST.ERR_INF_PARSER_SOURCE_SECTION_FAMILY_INVALID%(Item[1]),\r
93 File=CurrentLineOfItem[2],\r
94 Line=CurrentLineOfItem[1],\r
95 ExtraData=CurrentLineOfItem[0])\r
96 if len(Item) >= 1:\r
97 #\r
98 # Validate file name exist.\r
99 #\r
100 FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gINF_MODULE_DIR, Item[0])))\r
101 if not (ValidFile(FullFileName) or ValidFile(Item[0])):\r
102 Logger.Error("InfParser",\r
103 ToolError.FORMAT_INVALID,\r
104 ST.ERR_FILELIST_EXIST%(Item[0]),\r
105 File=CurrentLineOfItem[2],\r
106 Line=CurrentLineOfItem[1],\r
107 ExtraData=CurrentLineOfItem[0])\r
108\r
109 #\r
110 # Validate file exist/format.\r
111 #\r
112\r
113 if IsValidPath(Item[0], GlobalData.gINF_MODULE_DIR):\r
114 IsValidFileFlag = True\r
115 else:\r
116 Logger.Error("InfParser",\r
117 ToolError.FORMAT_INVALID,\r
118 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Item[0]),\r
119 File=CurrentLineOfItem[2],\r
120 Line=CurrentLineOfItem[1],\r
121 ExtraData=CurrentLineOfItem[0])\r
122 return False\r
123 if IsValidFileFlag:\r
124 ItemObj.SetSourceFileName(Item[0])\r
125 else:\r
126 Logger.Error("InfParser",\r
127 ToolError.FORMAT_INVALID,\r
128 ST.ERR_INF_PARSER_SOURCES_SECTION_CONTENT_ERROR,\r
129 File=CurrentLineOfItem[2],\r
130 Line=CurrentLineOfItem[1],\r
131 ExtraData=CurrentLineOfItem[0])\r
132\r
133 return ItemObj\r
134\r
135## InfSourcesItemObject()\r
136#\r
137#\r
138class InfSourcesItemObject():\r
139 def __init__(self, \\r
140 SourceFileName = '', \\r
141 Family = '', \\r
142 TagName = '', \\r
143 ToolCode = '', \\r
144 FeatureFlagExp = ''):\r
145 self.SourceFileName = SourceFileName\r
146 self.Family = Family\r
147 self.TagName = TagName\r
148 self.ToolCode = ToolCode\r
149 self.FeatureFlagExp = FeatureFlagExp\r
150 self.HeaderString = ''\r
151 self.TailString = ''\r
152 self.SupArchList = []\r
153\r
154 def SetSourceFileName(self, SourceFilename):\r
155 self.SourceFileName = SourceFilename\r
156 def GetSourceFileName(self):\r
157 return self.SourceFileName\r
158\r
159 def SetFamily(self, Family):\r
160 self.Family = Family\r
161 def GetFamily(self):\r
162 return self.Family\r
163\r
164 def SetTagName(self, TagName):\r
165 self.TagName = TagName\r
166 def GetTagName(self):\r
167 return self.TagName\r
168\r
169 def SetToolCode(self, ToolCode):\r
170 self.ToolCode = ToolCode\r
171 def GetToolCode(self):\r
172 return self.ToolCode\r
173\r
174 def SetFeatureFlagExp(self, FeatureFlagExp):\r
175 self.FeatureFlagExp = FeatureFlagExp\r
176 def GetFeatureFlagExp(self):\r
177 return self.FeatureFlagExp\r
178\r
179 def SetHeaderString(self, HeaderString):\r
180 self.HeaderString = HeaderString\r
181 def GetHeaderString(self):\r
182 return self.HeaderString\r
183\r
184 def SetTailString(self, TailString):\r
185 self.TailString = TailString\r
186 def GetTailString(self):\r
187 return self.TailString\r
188\r
189 def SetSupArchList(self, SupArchList):\r
190 self.SupArchList = SupArchList\r
191 def GetSupArchList(self):\r
192 return self.SupArchList\r
193##\r
194#\r
195#\r
196#\r
197class InfSourcesObject(InfSectionCommonDef):\r
198 def __init__(self):\r
199 self.Sources = Sdict()\r
200 InfSectionCommonDef.__init__(self)\r
201\r
202 def SetSources(self, SourceList, Arch = None):\r
203 __SupArchList = []\r
204 for ArchItem in Arch:\r
205 #\r
206 # Validate Arch\r
207 #\r
208 if (ArchItem == '' or ArchItem is None):\r
209 ArchItem = 'COMMON'\r
210 __SupArchList.append(ArchItem)\r
211\r
212 for Item in SourceList:\r
213 ItemObj = InfSourcesItemObject()\r
214 CurrentLineOfItem = Item[2]\r
215 Item = Item[0]\r
216\r
217 ItemObj = GenSourceInstance(Item, CurrentLineOfItem, ItemObj)\r
218\r
219 ItemObj.SetSupArchList(__SupArchList)\r
220\r
221 if (ItemObj) in self.Sources:\r
222 SourceContent = self.Sources[ItemObj]\r
223 SourceContent.append(ItemObj)\r
224 self.Sources[ItemObj] = SourceContent\r
225 else:\r
226 SourceContent = []\r
227 SourceContent.append(ItemObj)\r
228 self.Sources[ItemObj] = SourceContent\r
229\r
230 return True\r
231\r
232 def GetSources(self):\r
233 return self.Sources\r