]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / InfBuildOptionSectionParser.py
CommitLineData
4234283c 1## @file\r
f7496d71 2# This file contained the parser for BuildOption sections in INF file\r
4234283c 3#\r
f7496d71 4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
4234283c 5#\r
f7496d71
LG
6# This program and the accompanying materials are licensed and made available\r
7# under the terms and conditions of the BSD License which accompanies this\r
8# distribution. The full text of the license may be found at\r
4234283c
LG
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15'''\r
16InfBuildOptionSectionParser\r
17'''\r
18##\r
19# Import Modules\r
20#\r
21from Library import DataType as DT\r
22from Library import GlobalData\r
23import Logger.Log as Logger\r
24from Logger import StringTable as ST\r
25from Logger.ToolError import FORMAT_INVALID\r
26from Parser.InfParserMisc import InfExpandMacro\r
27from Library.Misc import GetSplitValueList\r
28from Parser.InfParserMisc import IsAsBuildOptionInfo\r
29from Library.Misc import GetHelpStringByRemoveHashKey\r
30from Library.ParserValidate import IsValidFamily\r
31from Library.ParserValidate import IsValidBuildOptionName\r
32from Parser.InfParserMisc import InfParserSectionRoot\r
33\r
34class InfBuildOptionSectionParser(InfParserSectionRoot):\r
35 ## InfBuildOptionParser\r
36 #\r
37 #\r
38 def InfBuildOptionParser(self, SectionString, InfSectionObject, FileName):\r
f7496d71 39\r
4234283c
LG
40 BuildOptionList = []\r
41 SectionContent = ''\r
f7496d71 42\r
4234283c
LG
43 if not GlobalData.gIS_BINARY_INF:\r
44 ValueList = []\r
45 LineNo = 0\r
46\r
47 for Line in SectionString:\r
48 LineContent = Line[0]\r
49 LineNo = Line[1]\r
50 TailComments = ''\r
51 ReplaceFlag = False\r
f7496d71 52\r
4234283c 53 if LineContent.strip() == '':\r
f7496d71
LG
54 SectionContent += LineContent + DT.END_OF_LINE\r
55 continue\r
4234283c
LG
56 #\r
57 # Found Comment\r
58 #\r
59 if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT):\r
f7496d71 60 SectionContent += LineContent + DT.END_OF_LINE\r
4234283c 61 continue\r
f7496d71 62\r
4234283c
LG
63 #\r
64 # Find Tail comment.\r
65 #\r
66 if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1:\r
67 TailComments = LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):]\r
f7496d71
LG
68 LineContent = LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)]\r
69\r
4234283c
LG
70 TokenList = GetSplitValueList(LineContent, DT.TAB_DEQUAL_SPLIT, 1)\r
71 if len(TokenList) == 2:\r
72 #\r
73 # "Replace" type build option\r
74 #\r
75 TokenList.append('True')\r
76 ReplaceFlag = True\r
77 else:\r
78 TokenList = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1)\r
79 #\r
80 # "Append" type build option\r
81 #\r
82 if len(TokenList) == 2:\r
83 TokenList.append('False')\r
84 else:\r
f7496d71 85 Logger.Error('InfParser',\r
4234283c
LG
86 FORMAT_INVALID,\r
87 ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,\r
f7496d71 88 ExtraData=LineContent,\r
4234283c 89 File=FileName,\r
f7496d71
LG
90 Line=LineNo)\r
91\r
4234283c 92 ValueList[0:len(TokenList)] = TokenList\r
f7496d71 93\r
4234283c
LG
94 #\r
95 # Replace with [Defines] section Macro\r
96 #\r
f7496d71 97 ValueList[0] = InfExpandMacro(ValueList[0], (FileName, LineContent, LineNo),\r
4234283c 98 self.FileLocalMacros, None)\r
f7496d71 99 ValueList[1] = InfExpandMacro(ValueList[1], (FileName, LineContent, LineNo),\r
4234283c
LG
100 self.FileLocalMacros, None, True)\r
101 EqualString = ''\r
102 if not ReplaceFlag:\r
103 EqualString = ' = '\r
104 else:\r
105 EqualString = ' == '\r
106\r
107 SectionContent += ValueList[0] + EqualString + ValueList[1] + TailComments + DT.END_OF_LINE\r
108\r
109 Family = GetSplitValueList(ValueList[0], DT.TAB_COLON_SPLIT, 1)\r
110 if len(Family) == 2:\r
f7496d71
LG
111 if not IsValidFamily(Family[0]):\r
112 Logger.Error('InfParser',\r
4234283c
LG
113 FORMAT_INVALID,\r
114 ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,\r
f7496d71 115 ExtraData=LineContent,\r
4234283c
LG
116 File=FileName,\r
117 Line=LineNo)\r
118 if not IsValidBuildOptionName(Family[1]):\r
f7496d71 119 Logger.Error('InfParser',\r
4234283c
LG
120 FORMAT_INVALID,\r
121 ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,\r
f7496d71 122 ExtraData=LineContent,\r
4234283c
LG
123 File=FileName,\r
124 Line=LineNo)\r
125 if len(Family) == 1:\r
126 if not IsValidBuildOptionName(Family[0]):\r
f7496d71 127 Logger.Error('InfParser',\r
4234283c
LG
128 FORMAT_INVALID,\r
129 ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,\r
f7496d71 130 ExtraData=LineContent,\r
4234283c
LG
131 File=FileName,\r
132 Line=LineNo)\r
f7496d71
LG
133\r
134 BuildOptionList.append(ValueList)\r
4234283c
LG
135 ValueList = []\r
136 continue\r
137 else:\r
138 BuildOptionList = InfAsBuiltBuildOptionParser(SectionString, FileName)\r
139\r
140 #\r
141 # Current section archs\r
142 #\r
143 ArchList = []\r
144 LastItem = ''\r
145 for Item in self.LastSectionHeaderContent:\r
146 LastItem = Item\r
147 if not (Item[1] == '' or Item[1] == '') and Item[1] not in ArchList:\r
148 ArchList.append(Item[1])\r
149 InfSectionObject.SetSupArchList(Item[1])\r
f7496d71 150\r
4234283c
LG
151 InfSectionObject.SetAllContent(SectionContent)\r
152 if not InfSectionObject.SetBuildOptions(BuildOptionList, ArchList, SectionContent):\r
f7496d71 153 Logger.Error('InfParser',\r
4234283c
LG
154 FORMAT_INVALID,\r
155 ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR%("[BuilOptions]"),\r
156 File=FileName,\r
f7496d71 157 Line=LastItem[3])\r
4234283c
LG
158\r
159## InfBuildOptionParser\r
160#\r
161#\r
162def InfAsBuiltBuildOptionParser(SectionString, FileName):\r
f7496d71 163 BuildOptionList = []\r
4234283c
LG
164 #\r
165 # AsBuild Binary INF file.\r
166 #\r
167 AsBuildOptionFlag = False\r
168 BuildOptionItem = []\r
169 Count = 0\r
170 for Line in SectionString:\r
171 Count += 1\r
172 LineContent = Line[0]\r
173 LineNo = Line[1]\r
f7496d71 174\r
4234283c
LG
175 #\r
176 # The last line\r
177 #\r
178 if len(SectionString) == Count:\r
179 if LineContent.strip().startswith("##") and AsBuildOptionFlag:\r
180 BuildOptionList.append(BuildOptionItem)\r
181 BuildOptionList.append([GetHelpStringByRemoveHashKey(LineContent)])\r
182 elif LineContent.strip().startswith("#") and AsBuildOptionFlag:\r
183 BuildOptionInfo = GetHelpStringByRemoveHashKey(LineContent)\r
184 BuildOptionItem.append(BuildOptionInfo)\r
185 BuildOptionList.append(BuildOptionItem)\r
186 else:\r
187 if len(BuildOptionItem) > 0:\r
188 BuildOptionList.append(BuildOptionItem)\r
f7496d71
LG
189\r
190 break\r
191\r
4234283c
LG
192 if LineContent.strip() == '':\r
193 AsBuildOptionFlag = False\r
194 continue\r
f7496d71 195\r
4234283c
LG
196 if LineContent.strip().startswith("##") and AsBuildOptionFlag:\r
197 if len(BuildOptionItem) > 0:\r
f7496d71
LG
198 BuildOptionList.append(BuildOptionItem)\r
199\r
4234283c 200 BuildOptionItem = []\r
f7496d71 201\r
4234283c 202 if not LineContent.strip().startswith("#"):\r
f7496d71 203 Logger.Error('InfParser',\r
4234283c 204 FORMAT_INVALID,\r
f7496d71
LG
205 ST.ERR_BO_CONTATIN_ASBUILD_AND_COMMON,\r
206 File=FileName,\r
207 Line=LineNo,\r
4234283c 208 ExtraData=LineContent)\r
f7496d71 209\r
4234283c
LG
210 if IsAsBuildOptionInfo(LineContent):\r
211 AsBuildOptionFlag = True\r
212 continue\r
f7496d71 213\r
4234283c
LG
214 if AsBuildOptionFlag:\r
215 BuildOptionInfo = GetHelpStringByRemoveHashKey(LineContent)\r
216 BuildOptionItem.append(BuildOptionInfo)\r
f7496d71
LG
217\r
218 return BuildOptionList\r