]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/Parser/InfPcdSectionParser.py
BaseTools: Remove equality operator with None
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / InfPcdSectionParser.py
1 ## @file
2 # This file contained the parser for [Pcds] sections in INF file
3 #
4 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
5 #
6 # This program and the accompanying materials are licensed and made available
7 # under the terms and conditions of the BSD License which accompanies this
8 # distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
10 #
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 #
14 '''
15 InfPcdSectionParser
16 '''
17 ##
18 # Import Modules
19 #
20
21 import Logger.Log as Logger
22 from Logger import StringTable as ST
23 from Logger.ToolError import FORMAT_INVALID
24 from Parser.InfParserMisc import InfExpandMacro
25 from Library import DataType as DT
26 from Library.Parsing import MacroParser
27 from Library.Misc import GetSplitValueList
28 from Library import GlobalData
29 from Library.String import SplitPcdEntry
30 from Parser.InfParserMisc import InfParserSectionRoot
31
32 class InfPcdSectionParser(InfParserSectionRoot):
33 ## Section PCD related parser
34 #
35 # For 5 types of PCD list below, all use this function.
36 # 'FixedPcd', 'FeaturePcd', 'PatchPcd', 'Pcd', 'PcdEx'
37 #
38 # This is a INF independent parser, the validation in this parser only
39 # cover
40 # INF spec scope, will not cross DEC/DSC to check pcd value
41 #
42 def InfPcdParser(self, SectionString, InfSectionObject, FileName):
43 KeysList = []
44 PcdList = []
45 CommentsList = []
46 ValueList = []
47 #
48 # Current section archs
49 #
50 LineIndex = -1
51 for Item in self.LastSectionHeaderContent:
52 if (Item[0], Item[1], Item[3]) not in KeysList:
53 KeysList.append((Item[0], Item[1], Item[3]))
54 LineIndex = Item[3]
55
56 if (Item[0].upper() == DT.TAB_INF_FIXED_PCD.upper() or \
57 Item[0].upper() == DT.TAB_INF_FEATURE_PCD.upper() or \
58 Item[0].upper() == DT.TAB_INF_PCD.upper()) and GlobalData.gIS_BINARY_INF:
59 Logger.Error('InfParser', FORMAT_INVALID, ST.ERR_ASBUILD_PCD_SECTION_TYPE%("\"" + Item[0] + "\""),
60 File=FileName, Line=LineIndex)
61
62 #
63 # For Common INF file
64 #
65 if not GlobalData.gIS_BINARY_INF:
66 #
67 # Macro defined in this section
68 #
69 SectionMacros = {}
70 for Line in SectionString:
71 PcdLineContent = Line[0]
72 PcdLineNo = Line[1]
73 if PcdLineContent.strip() == '':
74 CommentsList = []
75 continue
76
77 if PcdLineContent.strip().startswith(DT.TAB_COMMENT_SPLIT):
78 CommentsList.append(Line)
79 continue
80 else:
81 #
82 # Encounter a PCD entry
83 #
84 if PcdLineContent.find(DT.TAB_COMMENT_SPLIT) > -1:
85 CommentsList.append((
86 PcdLineContent[PcdLineContent.find(DT.TAB_COMMENT_SPLIT):],
87 PcdLineNo))
88 PcdLineContent = PcdLineContent[:PcdLineContent.find(DT.TAB_COMMENT_SPLIT)]
89
90 if PcdLineContent != '':
91 #
92 # Find Macro
93 #
94 Name, Value = MacroParser((PcdLineContent, PcdLineNo),
95 FileName,
96 DT.MODEL_EFI_PCD,
97 self.FileLocalMacros)
98 if Name is not None:
99 SectionMacros[Name] = Value
100 ValueList = []
101 CommentsList = []
102 continue
103
104 PcdEntryReturn = SplitPcdEntry(PcdLineContent)
105
106 if not PcdEntryReturn[1]:
107 TokenList = ['']
108 else:
109 TokenList = PcdEntryReturn[0]
110
111 ValueList[0:len(TokenList)] = TokenList
112
113 #
114 # Replace with Local section Macro and [Defines] section Macro.
115 #
116 ValueList = [InfExpandMacro(Value, (FileName, PcdLineContent, PcdLineNo),
117 self.FileLocalMacros, SectionMacros, True)
118 for Value in ValueList]
119
120 if len(ValueList) >= 1:
121 PcdList.append((ValueList, CommentsList, (PcdLineContent, PcdLineNo, FileName)))
122 ValueList = []
123 CommentsList = []
124 continue
125 #
126 # For Binary INF file
127 #
128 else:
129 for Line in SectionString:
130 LineContent = Line[0].strip()
131 LineNo = Line[1]
132
133 if LineContent == '':
134 CommentsList = []
135 continue
136
137 if LineContent.startswith(DT.TAB_COMMENT_SPLIT):
138 CommentsList.append(LineContent)
139 continue
140 #
141 # Have comments at tail.
142 #
143 CommentIndex = LineContent.find(DT.TAB_COMMENT_SPLIT)
144 if CommentIndex > -1:
145 CommentsList.append(LineContent[CommentIndex+1:])
146 LineContent = LineContent[:CommentIndex]
147
148 TokenList = GetSplitValueList(LineContent, DT.TAB_VALUE_SPLIT)
149 #
150 # PatchablePcd
151 # TokenSpace.CName | Value | Offset
152 #
153 if KeysList[0][0].upper() == DT.TAB_INF_PATCH_PCD.upper():
154 if len(TokenList) != 3:
155 Logger.Error('InfParser',
156 FORMAT_INVALID,
157 ST.ERR_ASBUILD_PATCHPCD_FORMAT_INVALID,
158 File=FileName,
159 Line=LineNo,
160 ExtraData=LineContent)
161 #
162 elif KeysList[0][0].upper() == DT.TAB_INF_PCD_EX.upper():
163 if len(TokenList) != 1:
164 Logger.Error('InfParser',
165 FORMAT_INVALID,
166 ST.ERR_ASBUILD_PCDEX_FORMAT_INVALID,
167 File=FileName,
168 Line=LineNo,
169 ExtraData=LineContent)
170 ValueList[0:len(TokenList)] = TokenList
171 if len(ValueList) >= 1:
172 PcdList.append((ValueList, CommentsList, (LineContent, LineNo, FileName)))
173 ValueList = []
174 CommentsList = []
175 continue
176
177 if not InfSectionObject.SetPcds(PcdList, KeysList = KeysList,
178 PackageInfo = self.InfPackageSection.GetPackages()):
179 Logger.Error('InfParser',
180 FORMAT_INVALID,
181 ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR%("[PCD]"),
182 File=FileName,
183 Line=LineIndex)
184