]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/Parser/InfParserMisc.py
BaseTools: Remove equality operator with None
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / InfParserMisc.py
1 ## @file
2 # This file contained the miscellaneous functions for INF parser
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 '''
16 InfParserMisc
17 '''
18
19 ##
20 # Import Modules
21 #
22 import re
23
24
25 from Library import DataType as DT
26
27
28 from Library.String import gMACRO_PATTERN
29 from Library.String import ReplaceMacro
30 from Object.Parser.InfMisc import ErrorInInf
31 from Logger.StringTable import ERR_MARCO_DEFINITION_MISS_ERROR
32
33 #
34 # Global variable
35 #
36
37 #
38 # Sections can exist in INF file
39 #
40 gINF_SECTION_DEF = {
41 DT.TAB_UNKNOWN.upper() : DT.MODEL_UNKNOWN,
42 DT.TAB_HEADER.upper() : DT.MODEL_META_DATA_FILE_HEADER,
43 DT.TAB_INF_DEFINES.upper() : DT.MODEL_META_DATA_DEFINE,
44 DT.TAB_BUILD_OPTIONS.upper() : DT.MODEL_META_DATA_BUILD_OPTION,
45 DT.TAB_LIBRARY_CLASSES.upper() : DT.MODEL_EFI_LIBRARY_CLASS,
46 DT.TAB_PACKAGES.upper() : DT.MODEL_META_DATA_PACKAGE,
47 DT.TAB_INF_FIXED_PCD.upper() : DT.MODEL_PCD_FIXED_AT_BUILD,
48 DT.TAB_INF_PATCH_PCD.upper() : DT.MODEL_PCD_PATCHABLE_IN_MODULE,
49 DT.TAB_INF_FEATURE_PCD.upper() : DT.MODEL_PCD_FEATURE_FLAG,
50 DT.TAB_INF_PCD_EX.upper() : DT.MODEL_PCD_DYNAMIC_EX,
51 DT.TAB_INF_PCD.upper() : DT.MODEL_PCD_DYNAMIC,
52 DT.TAB_SOURCES.upper() : DT.MODEL_EFI_SOURCE_FILE,
53 DT.TAB_GUIDS.upper() : DT.MODEL_EFI_GUID,
54 DT.TAB_PROTOCOLS.upper() : DT.MODEL_EFI_PROTOCOL,
55 DT.TAB_PPIS.upper() : DT.MODEL_EFI_PPI,
56 DT.TAB_DEPEX.upper() : DT.MODEL_EFI_DEPEX,
57 DT.TAB_BINARIES.upper() : DT.MODEL_EFI_BINARY_FILE,
58 DT.TAB_USER_EXTENSIONS.upper() : DT.MODEL_META_DATA_USER_EXTENSION
59 #
60 # EDK1 section
61 # TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE
62 #
63 }
64
65 ## InfExpandMacro
66 #
67 # Expand MACRO definition with MACROs defined in [Defines] section and specific section.
68 # The MACROs defined in specific section has high priority and will be expanded firstly.
69 #
70 # @param LineInfo Contain information of FileName, LineContent, LineNo
71 # @param GlobalMacros MACROs defined in INF [Defines] section
72 # @param SectionMacros MACROs defined in INF specific section
73 # @param Flag If the flag set to True, need to skip macros in a quoted string
74 #
75 def InfExpandMacro(Content, LineInfo, GlobalMacros=None, SectionMacros=None, Flag=False):
76 if GlobalMacros is None:
77 GlobalMacros = {}
78 if SectionMacros is None:
79 SectionMacros = {}
80
81 FileName = LineInfo[0]
82 LineContent = LineInfo[1]
83 LineNo = LineInfo[2]
84
85 # Don't expand macros in comments
86 if LineContent.strip().startswith("#"):
87 return Content
88
89 NewLineInfo = (FileName, LineNo, LineContent)
90
91 #
92 # First, replace MARCOs with value defined in specific section
93 #
94 Content = ReplaceMacro (Content,
95 SectionMacros,
96 False,
97 (LineContent, LineNo),
98 FileName,
99 Flag)
100 #
101 # Then replace MARCOs with value defined in [Defines] section
102 #
103 Content = ReplaceMacro (Content,
104 GlobalMacros,
105 False,
106 (LineContent, LineNo),
107 FileName,
108 Flag)
109
110 MacroUsed = gMACRO_PATTERN.findall(Content)
111 #
112 # no macro found in String, stop replacing
113 #
114 if len(MacroUsed) == 0:
115 return Content
116 else:
117 for Macro in MacroUsed:
118 gQuotedMacro = re.compile(".*\".*\$\(%s\).*\".*"%(Macro))
119 if not gQuotedMacro.match(Content):
120 #
121 # Still have MACROs can't be expanded.
122 #
123 ErrorInInf (ERR_MARCO_DEFINITION_MISS_ERROR,
124 LineInfo=NewLineInfo)
125
126 return Content
127
128
129 ## IsBinaryInf
130 #
131 # Judge whether the INF file is Binary INF or Common INF
132 #
133 # @param FileLineList A list contain all INF file content.
134 #
135 def IsBinaryInf(FileLineList):
136 if not FileLineList:
137 return False
138
139 ReIsSourcesSection = re.compile("^\s*\[Sources.*\]\s.*$", re.IGNORECASE)
140 ReIsBinarySection = re.compile("^\s*\[Binaries.*\]\s.*$", re.IGNORECASE)
141 BinarySectionFoundFlag = False
142
143 for Line in FileLineList:
144 if ReIsSourcesSection.match(Line):
145 return False
146 if ReIsBinarySection.match(Line):
147 BinarySectionFoundFlag = True
148
149 if BinarySectionFoundFlag:
150 return True
151
152 return False
153
154
155 ## IsLibInstanceInfo
156 #
157 # Judge whether the string contain the information of ## @LIB_INSTANCES.
158 #
159 # @param String
160 #
161 # @return Flag
162 #
163 def IsLibInstanceInfo(String):
164 ReIsLibInstance = re.compile("^\s*##\s*@LIB_INSTANCES\s*$")
165 if ReIsLibInstance.match(String):
166 return True
167 else:
168 return False
169
170
171 ## IsAsBuildOptionInfo
172 #
173 # Judge whether the string contain the information of ## @ASBUILD.
174 #
175 # @param String
176 #
177 # @return Flag
178 #
179 def IsAsBuildOptionInfo(String):
180 ReIsAsBuildInstance = re.compile("^\s*##\s*@AsBuilt\s*$")
181 if ReIsAsBuildInstance.match(String):
182 return True
183 else:
184 return False
185
186
187 class InfParserSectionRoot(object):
188 def __init__(self):
189 #
190 # Macros defined in [Define] section are file scope global
191 #
192 self.FileLocalMacros = {}
193
194 #
195 # Current Section Header content.
196 #
197 self.SectionHeaderContent = []
198
199 #
200 # Last time Section Header content.
201 #
202 self.LastSectionHeaderContent = []
203
204 self.FullPath = ''
205
206 self.InfDefSection = None
207 self.InfBuildOptionSection = None
208 self.InfLibraryClassSection = None
209 self.InfPackageSection = None
210 self.InfPcdSection = None
211 self.InfSourcesSection = None
212 self.InfUserExtensionSection = None
213 self.InfProtocolSection = None
214 self.InfPpiSection = None
215 self.InfGuidSection = None
216 self.InfDepexSection = None
217 self.InfPeiDepexSection = None
218 self.InfDxeDepexSection = None
219 self.InfSmmDepexSection = None
220 self.InfBinariesSection = None
221 self.InfHeader = None
222 self.InfSpecialCommentSection = None