]>
Commit | Line | Data |
---|---|---|
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 | |
10 | InfSourcesObject\r | |
11 | '''\r | |
12 | \r | |
13 | import os\r | |
14 | \r | |
15 | from Logger import StringTable as ST\r | |
16 | from Logger import ToolError\r | |
17 | import Logger.Log as Logger\r | |
18 | from Library import GlobalData\r | |
19 | \r | |
20 | from Library.Misc import Sdict\r | |
21 | from Library.ExpressionValidate import IsValidFeatureFlagExp\r | |
22 | from Object.Parser.InfCommonObject import InfSectionCommonDef\r | |
23 | from Library.Misc import ValidFile\r | |
24 | from Library.ParserValidate import IsValidFamily\r | |
25 | from Library.ParserValidate import IsValidPath\r | |
26 | \r | |
27 | ## __GenSourceInstance\r | |
28 | #\r | |
29 | #\r | |
30 | def 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 | |
138 | class 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 | |
197 | class 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 |