]> git.proxmox.com Git - mirror_edk2.git/blame - 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
4234283c 1## @file\r
f7496d71
LG
2# This file is used to define class objects of INF file [Sources] 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
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
f7496d71 18from Library import GlobalData\r
4234283c
LG
19\r
20from Library.Misc import Sdict\r
f7496d71 21from Library.ExpressionValidate import IsValidFeatureFlagExp\r
4234283c 22from Object.Parser.InfCommonObject import InfSectionCommonDef\r
f7496d71 23from Library.Misc import ValidFile\r
4234283c
LG
24from Library.ParserValidate import IsValidFamily\r
25from Library.ParserValidate import IsValidPath\r
26\r
f7496d71
LG
27## __GenSourceInstance\r
28#\r
4234283c 29#\r
4234283c 30def GenSourceInstance(Item, CurrentLineOfItem, ItemObj):\r
f7496d71 31\r
4234283c 32 IsValidFileFlag = False\r
f7496d71 33\r
4234283c
LG
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
f7496d71 43 Logger.Error("InfParser",\r
4234283c
LG
44 ToolError.FORMAT_INVALID,\r
45 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
f7496d71
LG
46 File=CurrentLineOfItem[2],\r
47 Line=CurrentLineOfItem[1],\r
4234283c
LG
48 ExtraData=CurrentLineOfItem[0])\r
49 #\r
f7496d71 50 # Validate FFE\r
4234283c
LG
51 #\r
52 FeatureFlagRtv = IsValidFeatureFlagExp(Item[4].strip())\r
53 if not FeatureFlagRtv[0]:\r
f7496d71 54 Logger.Error("InfParser",\r
4234283c
LG
55 ToolError.FORMAT_INVALID,\r
56 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
f7496d71
LG
57 File=CurrentLineOfItem[2],\r
58 Line=CurrentLineOfItem[1],\r
4234283c
LG
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
f7496d71 65 Logger.Error("InfParser",\r
4234283c
LG
66 ToolError.FORMAT_INVALID,\r
67 ST.ERR_INF_PARSER_TOOLCODE_NOT_PERMITTED%(Item[2]),\r
f7496d71
LG
68 File=CurrentLineOfItem[2],\r
69 Line=CurrentLineOfItem[1],\r
70 ExtraData=CurrentLineOfItem[0])\r
4234283c
LG
71 if len(Item) >= 3:\r
72 if Item[2].strip() == '':\r
73 ItemObj.SetTagName(Item[2])\r
74 else:\r
f7496d71 75 Logger.Error("InfParser",\r
4234283c
LG
76 ToolError.FORMAT_INVALID,\r
77 ST.ERR_INF_PARSER_TAGNAME_NOT_PERMITTED%(Item[2]),\r
f7496d71
LG
78 File=CurrentLineOfItem[2],\r
79 Line=CurrentLineOfItem[1],\r
4234283c
LG
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
f7496d71 90 Logger.Error("InfParser",\r
4234283c
LG
91 ToolError.FORMAT_INVALID,\r
92 ST.ERR_INF_PARSER_SOURCE_SECTION_FAMILY_INVALID%(Item[1]),\r
f7496d71
LG
93 File=CurrentLineOfItem[2],\r
94 Line=CurrentLineOfItem[1],\r
4234283c
LG
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
f7496d71 102 Logger.Error("InfParser",\r
4234283c
LG
103 ToolError.FORMAT_INVALID,\r
104 ST.ERR_FILELIST_EXIST%(Item[0]),\r
f7496d71
LG
105 File=CurrentLineOfItem[2],\r
106 Line=CurrentLineOfItem[1],\r
4234283c 107 ExtraData=CurrentLineOfItem[0])\r
f7496d71 108\r
4234283c
LG
109 #\r
110 # Validate file exist/format.\r
111 #\r
f7496d71 112\r
4234283c
LG
113 if IsValidPath(Item[0], GlobalData.gINF_MODULE_DIR):\r
114 IsValidFileFlag = True\r
115 else:\r
f7496d71 116 Logger.Error("InfParser",\r
4234283c
LG
117 ToolError.FORMAT_INVALID,\r
118 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Item[0]),\r
f7496d71
LG
119 File=CurrentLineOfItem[2],\r
120 Line=CurrentLineOfItem[1],\r
4234283c
LG
121 ExtraData=CurrentLineOfItem[0])\r
122 return False\r
123 if IsValidFileFlag:\r
f7496d71 124 ItemObj.SetSourceFileName(Item[0])\r
4234283c 125 else:\r
f7496d71
LG
126 Logger.Error("InfParser",\r
127 ToolError.FORMAT_INVALID,\r
4234283c 128 ST.ERR_INF_PARSER_SOURCES_SECTION_CONTENT_ERROR,\r
f7496d71 129 File=CurrentLineOfItem[2],\r
4234283c
LG
130 Line=CurrentLineOfItem[1],\r
131 ExtraData=CurrentLineOfItem[0])\r
f7496d71
LG
132\r
133 return ItemObj\r
4234283c
LG
134\r
135## InfSourcesItemObject()\r
f7496d71 136#\r
4234283c
LG
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
f7496d71 153\r
4234283c
LG
154 def SetSourceFileName(self, SourceFilename):\r
155 self.SourceFileName = SourceFilename\r
156 def GetSourceFileName(self):\r
157 return self.SourceFileName\r
f7496d71 158\r
4234283c
LG
159 def SetFamily(self, Family):\r
160 self.Family = Family\r
161 def GetFamily(self):\r
162 return self.Family\r
f7496d71 163\r
4234283c
LG
164 def SetTagName(self, TagName):\r
165 self.TagName = TagName\r
166 def GetTagName(self):\r
167 return self.TagName\r
f7496d71 168\r
4234283c
LG
169 def SetToolCode(self, ToolCode):\r
170 self.ToolCode = ToolCode\r
171 def GetToolCode(self):\r
172 return self.ToolCode\r
f7496d71 173\r
4234283c
LG
174 def SetFeatureFlagExp(self, FeatureFlagExp):\r
175 self.FeatureFlagExp = FeatureFlagExp\r
176 def GetFeatureFlagExp(self):\r
177 return self.FeatureFlagExp\r
f7496d71 178\r
4234283c
LG
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
f7496d71 188\r
4234283c
LG
189 def SetSupArchList(self, SupArchList):\r
190 self.SupArchList = SupArchList\r
191 def GetSupArchList(self):\r
f7496d71 192 return self.SupArchList\r
4234283c
LG
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
f7496d71 201\r
4234283c
LG
202 def SetSources(self, SourceList, Arch = None):\r
203 __SupArchList = []\r
204 for ArchItem in Arch:\r
205 #\r
206 # Validate Arch\r
f7496d71 207 #\r
4231a819 208 if (ArchItem == '' or ArchItem is None):\r
f7496d71
LG
209 ArchItem = 'COMMON'\r
210 __SupArchList.append(ArchItem)\r
4234283c
LG
211\r
212 for Item in SourceList:\r
213 ItemObj = InfSourcesItemObject()\r
214 CurrentLineOfItem = Item[2]\r
f7496d71
LG
215 Item = Item[0]\r
216\r
4234283c 217 ItemObj = GenSourceInstance(Item, CurrentLineOfItem, ItemObj)\r
f7496d71
LG
218\r
219 ItemObj.SetSupArchList(__SupArchList)\r
220\r
27c4ceb4 221 if (ItemObj) in self.Sources:\r
4234283c
LG
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
f7496d71 229\r
4234283c 230 return True\r
f7496d71 231\r
4234283c
LG
232 def GetSources(self):\r
233 return self.Sources\r