]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/Parser/InfDefineSectionParser.py
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / InfDefineSectionParser.py
1 ## @file
2 # This file contained the parser for define sections in INF file
3 #
4 # Copyright (c) 2011 - 2018, 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 '''
16 InfDefineSectionParser
17 '''
18 ##
19 # Import Modules
20 #
21 import re
22
23 from Library import DataType as DT
24 from Library import GlobalData
25 from Library.Parsing import MacroParser
26 from Library.Misc import GetSplitValueList
27 from Library.ParserValidate import IsValidArch
28 from Object.Parser.InfCommonObject import InfLineCommentObject
29 from Object.Parser.InfDefineObject import InfDefMember
30 from Parser.InfParserMisc import InfExpandMacro
31 from Object.Parser.InfMisc import ErrorInInf
32 from Logger import StringTable as ST
33 from Parser.InfParserMisc import InfParserSectionRoot
34
35 ## __GetValidateArchList
36 #
37 #
38 def GetValidateArchList(LineContent):
39
40 TempArch = ''
41 ArchList = []
42 ValidateAcrhPatten = re.compile(r"^\s*#\s*VALID_ARCHITECTURES\s*=\s*.*$", re.DOTALL)
43
44 if ValidateAcrhPatten.match(LineContent):
45 TempArch = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1)[1]
46
47 TempArch = GetSplitValueList(TempArch, '(', 1)[0]
48
49 ArchList = re.split('\s+', TempArch)
50 NewArchList = []
51 for Arch in ArchList:
52 if IsValidArch(Arch):
53 NewArchList.append(Arch)
54
55 ArchList = NewArchList
56
57 return ArchList
58
59 class InfDefinSectionParser(InfParserSectionRoot):
60 def InfDefineParser(self, SectionString, InfSectionObject, FileName, SectionComment):
61
62 if SectionComment:
63 pass
64 #
65 # Parser Defines section content and fill self._ContentList dict.
66 #
67 StillCommentFalg = False
68 HeaderComments = []
69 SectionContent = ''
70 ArchList = []
71 _ContentList = []
72 _ValueList = []
73 #
74 # Add WORKSPACE to global Marco dict.
75 #
76 self.FileLocalMacros['WORKSPACE'] = GlobalData.gWORKSPACE
77
78 for Line in SectionString:
79 LineContent = Line[0]
80 LineNo = Line[1]
81 TailComments = ''
82 LineComment = None
83
84 LineInfo = ['', -1, '']
85 LineInfo[0] = FileName
86 LineInfo[1] = LineNo
87 LineInfo[2] = LineContent
88
89 if LineContent.strip() == '':
90 continue
91 #
92 # The first time encountered VALIDATE_ARCHITECHERS will be considered as support arch list.
93 #
94 if not ArchList:
95 ArchList = GetValidateArchList(LineContent)
96
97 #
98 # Parser Comment
99 #
100 if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT):
101 #
102 # Last line is comments, and this line go on.
103 #
104 if StillCommentFalg:
105 HeaderComments.append(Line)
106 SectionContent += LineContent + DT.END_OF_LINE
107 continue
108 #
109 # First time encounter comment
110 #
111 else:
112 #
113 # Clear original data
114 #
115 HeaderComments = []
116 HeaderComments.append(Line)
117 StillCommentFalg = True
118 SectionContent += LineContent + DT.END_OF_LINE
119 continue
120 else:
121 StillCommentFalg = False
122
123 if len(HeaderComments) >= 1:
124 LineComment = InfLineCommentObject()
125 LineCommentContent = ''
126 for Item in HeaderComments:
127 LineCommentContent += Item[0] + DT.END_OF_LINE
128 LineComment.SetHeaderComments(LineCommentContent)
129
130 #
131 # Find Tail comment.
132 #
133 if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1:
134 TailComments = LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):]
135 LineContent = LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)]
136 if LineComment is None:
137 LineComment = InfLineCommentObject()
138 LineComment.SetTailComments(TailComments)
139
140 #
141 # Find Macro
142 #
143 Name, Value = MacroParser((LineContent, LineNo),
144 FileName,
145 DT.MODEL_META_DATA_HEADER,
146 self.FileLocalMacros)
147 if Name is not None:
148 self.FileLocalMacros[Name] = Value
149 continue
150
151 #
152 # Replace with [Defines] section Macro
153 #
154 LineContent = InfExpandMacro(LineContent,
155 (FileName, LineContent, LineNo),
156 self.FileLocalMacros,
157 None, True)
158
159 SectionContent += LineContent + DT.END_OF_LINE
160
161 TokenList = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1)
162 if len(TokenList) < 2:
163 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE,
164 LineInfo=LineInfo)
165 _ValueList[0:len(TokenList)] = TokenList
166 if not _ValueList[0]:
167 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_NAME,
168 LineInfo=LineInfo)
169 if not _ValueList[1]:
170 ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_NO_VALUE,
171 LineInfo=LineInfo)
172
173 Name, Value = _ValueList[0], _ValueList[1]
174
175 InfDefMemberObj = InfDefMember(Name, Value)
176 if (LineComment is not None):
177 InfDefMemberObj.Comments.SetHeaderComments(LineComment.GetHeaderComments())
178 InfDefMemberObj.Comments.SetTailComments(LineComment.GetTailComments())
179
180 InfDefMemberObj.CurrentLine.SetFileName(self.FullPath)
181 InfDefMemberObj.CurrentLine.SetLineString(LineContent)
182 InfDefMemberObj.CurrentLine.SetLineNo(LineNo)
183
184 _ContentList.append(InfDefMemberObj)
185 HeaderComments = []
186 TailComments = ''
187
188 #
189 # Current Define section archs
190 #
191 if not ArchList:
192 ArchList = ['COMMON']
193
194 InfSectionObject.SetAllContent(SectionContent)
195
196 InfSectionObject.SetDefines(_ContentList, Arch=ArchList)
197