git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@412 7335b...
[people/mcb30/basetools.git] / Source / Python / Common / InfClassObject.py
1 # Copyright (c) 2007, Intel Corporation\r
2 # All rights reserved. This program and the accompanying materials\r
3 # are licensed and made available under the terms and conditions of the BSD License\r
4 # which accompanies this distribution.    The full text of the license may be found at\r
5 # http://opensource.org/licenses/bsd-license.php\r
6 #\r
7 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
8 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
9 \r
10 #\r
11 #This file is used to define each component of INF file\r
12 #\r
13 \r
14 import os\r
15 import EdkLogger\r
16 from CommonDataClass.CommonClass import LibraryClassClass\r
17 from CommonDataClass.ModuleClass import *\r
18 from String import *\r
19 from DataType import *\r
20 from Identification import *\r
21 from Dictionary import *\r
22 from BuildToolError import *\r
23 \r
24 class InfObject(object):\r
25     def __init__(self):\r
26         object.__init__()\r
27 \r
28 class InfDefines(InfObject):\r
29     def __init__(self):\r
30         self.DefinesDictionary = {\r
31             #Required\r
32             TAB_INF_DEFINES_BASE_NAME                               : [''],\r
33             TAB_INF_DEFINES_FILE_GUID                               : [''],\r
34             TAB_INF_DEFINES_MODULE_TYPE                             : [''],\r
35             TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION               : [''],\r
36             TAB_INF_DEFINES_EDK_RELEASE_VERSION                     : [''],\r
37             \r
38             #Optional            \r
39             TAB_INF_DEFINES_INF_VERSION                             : [''],\r
40             TAB_INF_DEFINES_BINARY_MODULE                           : [''],\r
41             TAB_INF_DEFINES_LIBRARY_CLASS                           : [''],\r
42             TAB_INF_DEFINES_COMPONENT_TYPE                          : [''],\r
43             TAB_INF_DEFINES_MAKEFILE_NAME                           : [''],\r
44             TAB_INF_DEFINES_BUILD_NUMBER                            : [''],\r
45             TAB_INF_DEFINES_BUILD_TYPE                              : [''],\r
46             TAB_INF_DEFINES_FFS_EXT                                 : [''],\r
47             TAB_INF_DEFINES_FV_EXT                                  : [''],\r
48             TAB_INF_DEFINES_SOURCE_FV                               : [''],\r
49             TAB_INF_DEFINES_VERSION_NUMBER                          : [''],\r
50             TAB_INF_DEFINES_VERSION_STRING                          : [''],\r
51             TAB_INF_DEFINES_PCD_IS_DRIVER                           : [''],\r
52             TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H                     : [''],\r
53             TAB_INF_DEFINES_ENTRY_POINT                             : [''],\r
54             TAB_INF_DEFINES_UNLOAD_IMAGE                            : [''],\r
55             TAB_INF_DEFINES_CONSTRUCTOR                             : [''],\r
56             TAB_INF_DEFINES_DESTRUCTOR                              : [''],\r
57             TAB_INF_DEFINES_DEFINE                                  : [''],\r
58             TAB_INF_DEFINES_SPEC                                    : [''],\r
59             TAB_INF_DEFINES_CUSTOM_MAKEFILE                         : ['']\r
60         }\r
61 \r
62 class InfContents(InfObject):\r
63     def __init__(self):\r
64         self.Sources = []\r
65         self.BuildOptions = []\r
66         self.Binaries = []\r
67         self.Includes = []\r
68         self.Guids = []\r
69         self.Protocols = []\r
70         self.Ppis = []\r
71         self.Libraries = []\r
72         self.LibraryClasses = []\r
73         self.Packages = []\r
74         self.PcdsFixedAtBuild = []\r
75         self.PcdsPatchableInModule = []\r
76         self.PcdsFeatureFlag = []\r
77         self.PcdsDynamic = []\r
78         self.PcdsDynamicEx = []\r
79         self.Depex = []\r
80         self.Nmake = []\r
81         \r
82 class Inf(InfObject):\r
83     def __init__(self, filename = None, isMergeAllArches = False, isToModule = False):\r
84         self.Identification = Identification()\r
85         self.Defines = InfDefines()\r
86         self.Contents = {}\r
87         self.UserExtensions = ''\r
88         self.Module = ModuleClass()\r
89         \r
90         for key in DataType.ARCH_LIST_FULL:\r
91             self.Contents[key] = InfContents()\r
92 \r
93         self.KeyList = [\r
94             TAB_SOURCES, TAB_BUILD_OPTIONS, TAB_BINARIES, TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, TAB_PACKAGES, TAB_LIBRARIES, \\r
95             TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
96             TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEPEX, TAB_NMAKE\r
97         ]\r
98                 \r
99         if filename != None:\r
100             self.LoadInfFile(filename)\r
101         \r
102         if isMergeAllArches:\r
103             self.MergeAllArches()\r
104         \r
105         if isToModule:\r
106             self.InfToModule()\r
107     \r
108     def MergeAllArches(self):\r
109         for key in self.KeyList:\r
110             for arch in DataType.ARCH_LIST:\r
111                 Command = "self.Contents[arch]." + key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ")"\r
112                 eval(Command)     \r
113             \r
114     def ParseInf(self, Lines, Key, KeyField):\r
115         newKey = SplitModuleType(Key)\r
116         if newKey[0].find(DataType.TAB_LIBRARY_CLASSES.upper()) != -1:\r
117             GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
118         else:\r
119             GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
120 \r
121     def InfToModule(self):\r
122         #\r
123         # Get value for Header\r
124         #\r
125         self.Module.Header.Name = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BASE_NAME][0]\r
126         self.Module.Header.Guid = self.Defines.DefinesDictionary[TAB_INF_DEFINES_FILE_GUID][0]\r
127         self.Module.Header.Version = self.Defines.DefinesDictionary[TAB_INF_DEFINES_VERSION_NUMBER][0]\r
128         self.Module.Header.FileName = self.Identification.FileName\r
129         self.Module.Header.FullPath = self.Identification.FileFullPath\r
130         \r
131         self.Module.Header.EfiSpecificationVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION][0]\r
132         self.Module.Header.EdkReleaseVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_EDK_RELEASE_VERSION][0]\r
133         self.Module.Header.InfVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_INF_VERSION][0]\r
134                 \r
135         self.Module.Header.ModuleType = self.Defines.DefinesDictionary[TAB_INF_DEFINES_MODULE_TYPE][0]\r
136         self.Module.Header.BinaryModule = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BINARY_MODULE][0]\r
137         self.Module.Header.ComponentType = self.Defines.DefinesDictionary[TAB_INF_DEFINES_COMPONENT_TYPE][0]\r
138         self.Module.Header.MakefileName = self.Defines.DefinesDictionary[TAB_INF_DEFINES_MAKEFILE_NAME][0]\r
139         self.Module.Header.BuildNumber = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BUILD_NUMBER][0]\r
140         self.Module.Header.BuildType = self.Defines.DefinesDictionary[TAB_INF_DEFINES_BUILD_TYPE][0]\r
141         self.Module.Header.FfsExt = self.Defines.DefinesDictionary[TAB_INF_DEFINES_FFS_EXT][0]\r
142         self.Module.Header.FvExt = self.Defines.DefinesDictionary[TAB_INF_DEFINES_FV_EXT][0]\r
143         self.Module.Header.SourceFv = self.Defines.DefinesDictionary[TAB_INF_DEFINES_SOURCE_FV][0]\r
144         self.Module.Header.PcdIsDriver = self.Defines.DefinesDictionary[TAB_INF_DEFINES_PCD_IS_DRIVER][0]\r
145         self.Module.Header.TianoR8FlashMap_h = self.Defines.DefinesDictionary[TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H][0]\r
146         \r
147         #LibraryClass of Define\r
148         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_LIBRARY_CLASS][0] != '':\r
149             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_LIBRARY_CLASS]:\r
150                 List = Item.split(DataType.TAB_VALUE_SPLIT, 1)\r
151                 Lib = LibraryClassClass()\r
152                 Lib.LibraryClass = CleanString(List[0])\r
153                 Lib.SupModuleList = GetSplitValueList(CleanString(List[1]))\r
154                 self.Module.Header.LibraryClass.append(Lib)\r
155         \r
156         #Custom makefile\r
157         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_CUSTOM_MAKEFILE][0] != '':\r
158             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_CUSTOM_MAKEFILE]:\r
159                 List = Item.split(DataType.TAB_VALUE_SPLIT)\r
160                 if len(List) == 2:\r
161                     self.Module.Header.CustomMakefile[CleanString(List[0])] = CleanString(List[1])\r
162                 else:\r
163                     ErrorMsg = "Wrong CUSTOM_MAKEFILE statement '%s' found in section Defines in file '%s', correct format is 'CUSTOM_MAKEFILE = Family|Filename'" % (Item, self.Module.Header.FullPath) \r
164                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
165         \r
166         #EntryPoint and UnloadImage\r
167         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT][0] != '':\r
168             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT]:\r
169                 Image = ModuleExternImageClass()\r
170                 Image.ModuleEntryPoint = CleanString(Item)\r
171                 self.Module.ExternImages.append(Image)\r
172         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_UNLOAD_IMAGE][0] != '':\r
173             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_UNLOAD_IMAGE]:\r
174                 Image = ModuleExternImageClass()\r
175                 Image.ModuleUnloadImage = CleanString(Item)\r
176                 self.Module.ExternImages.append(Image)\r
177         \r
178         #Constructor and Destructor\r
179         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR][0] != '':\r
180             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR]:\r
181                 LibraryClass = ModuleExternLibraryClass()\r
182                 LibraryClass.Constructor = CleanString(Item)\r
183                 self.Module.ExternLibraries.append(LibraryClass)\r
184         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR][0] != '':\r
185             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR]:\r
186                 LibraryClass = ModuleExternLibraryClass()\r
187                 LibraryClass.Destructor = CleanString(Item)\r
188                 self.Module.ExternLibraries.append(LibraryClass)\r
189         \r
190         #Define\r
191         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_DEFINE][0] != '':\r
192             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_DEFINE]:\r
193                 List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
194                 if len(List) != 2:\r
195                     ErrorMsg = "Wrong DEFINE statement '%s' found in section Defines in file '%s', correct format is 'DEFINE <Word> = <Word>'" % (Item, self.Module.Header.FullPath) \r
196                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
197                 else:\r
198                     self.Module.Header.Define[CleanString(List[0])] = CleanString(List[1])\r
199         \r
200         #Spec\r
201         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_SPEC][0] != '':\r
202             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_SPEC]:\r
203                 List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
204                 if len(List) != 2:\r
205                     ErrorMsg = "Wrong SPEC statement '%s' found in section Defines in file '%s', correct format is 'SPEC <Word> = <Version>'" % (Item, self.Module.Header.FullPath) \r
206                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
207                 else:\r
208                     self.Module.Header.Specification[CleanString(List[0])] = CleanString(List[1])\r
209                 \r
210         #BuildOptions\r
211         BuildOptions = {}\r
212         for Arch in DataType.ARCH_LIST:\r
213             for Item in self.Contents[Arch].BuildOptions:\r
214                 MergeArches(BuildOptions, GetBuildOption(Item), Arch)\r
215         for Key in BuildOptions.keys():\r
216             BuildOption = BuildOptionClass(Key[0], Key[1], Key[2])\r
217             BuildOption.SupArchList = BuildOptions[Key]\r
218             self.Module.BuildOptions.append(BuildOption)    \r
219         \r
220         #Includes\r
221         Includes = {}\r
222         for Arch in DataType.ARCH_LIST:\r
223             for Item in self.Contents[Arch].Includes:\r
224                 MergeArches(Includes, Item, Arch)\r
225         for Key in Includes.keys():\r
226             Include = IncludeClass()\r
227             Include.FilePath = Key\r
228             Include.SupArchList = Includes[Key]\r
229             self.Module.Includes.append(Include)\r
230         \r
231         #Libraries\r
232         Libraries = {}\r
233         for Arch in DataType.ARCH_LIST:\r
234             for Item in self.Contents[Arch].Libraries:\r
235                 MergeArches(Libraries, Item, Arch)\r
236         for Key in Libraries.keys():\r
237             Library = ModuleLibraryClass()\r
238             Library.Library = Key\r
239             Library.SupArchList = Libraries[Key]\r
240             self.Module.Libraries.append(Library)\r
241         \r
242         #LibraryClasses\r
243         LibraryClasses = {}\r
244         Defines = {}\r
245         for Arch in DataType.ARCH_LIST:\r
246             for Item in self.Contents[Arch].LibraryClasses:\r
247                 Status = GenDefines(Item[0], Arch, Defines)\r
248                 if Status == 0:       # Find DEFINE statement\r
249                     pass\r
250                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
251                     ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item[0], self.Module.Header.FullPath) \r
252                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
253                 elif Status == 1:     # Not find DEFINE statement\r
254                     #{ (LibraryClass, Instance, PcdFeatureFlag, ModuleType1|ModuleType2|ModuleType3) : [Arch1, Arch2, ...] }\r
255                     ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2))\r
256                     MergeArches(LibraryClasses, (ItemList[0], ItemList[1], ItemList[2], DataType.TAB_VALUE_SPLIT.join(Item[1])), Arch)\r
257         for Key in LibraryClasses.keys():\r
258             KeyList = Key[0].split(DataType.TAB_VALUE_SPLIT)\r
259             LibraryClass = LibraryClassClass()\r
260             LibraryClass.Define = Defines\r
261             LibraryClass.LibraryClass = Key[0]\r
262             LibraryClass.RecommendedInstance = Key[1]\r
263             LibraryClass.FeatureFlag = Key[2]\r
264             LibraryClass.SupArchList = LibraryClasses[Key]\r
265             if Key[3] != ['']:\r
266                 LibraryClass.SupModuleList = GetSplitValueList(Key[3])\r
267             self.Module.LibraryClasses.append(LibraryClass)\r
268         \r
269         #Packages\r
270         Packages = {}\r
271         Defines = {}\r
272         for Arch in DataType.ARCH_LIST:\r
273             for Item in self.Contents[Arch].Packages:\r
274                 Status = GenDefines(Item, Arch, Defines)\r
275                 if Status == 0:       # Find DEFINE statement\r
276                     pass\r
277                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
278                     ErrorMsg = "Wrong DEFINE statement '%s' found in section Packages in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Module.Header.FullPath) \r
279                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
280                 elif Status == 1:     # Not find DEFINE statement\r
281                     MergeArches(Packages, Item, Arch)\r
282         for Key in Packages.keys():\r
283             Package = ModulePackageDependencyClass()\r
284             Package.Define = Defines\r
285             Package.FilePath = Key\r
286             Package.SupArchList = Packages[Key]\r
287             self.Module.PackageDependencies.append(Package)\r
288             \r
289         #Nmake\r
290         Nmakes = {}\r
291         for Arch in DataType.ARCH_LIST:\r
292             for Item in self.Contents[Arch].Nmake:\r
293                 MergeArches(Nmakes, Item, Arch)\r
294         for Key in Nmakes.keys():\r
295             List = GetSplitValueList(Key, DataType.TAB_EQUAL_SPLIT)\r
296             if len(List) != 2:\r
297                 ErrorMsg = "Wrong statement '%s' found in section Nmake in file '%s', correct format is '<Word>=<Word>'" % (Item, self.Module.Header.FullPath) \r
298                 raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
299             Nmake = ModuleNmakeClass()\r
300             Nmake.Name = List[0]\r
301             Nmake.Value = List[1]\r
302             Nmake.SupArchList = Nmakes[Key]\r
303             self.Module.Nmake.append(Nmake)\r
304         \r
305         #Pcds\r
306         Pcds = {}\r
307         for Arch in DataType.ARCH_LIST:\r
308             for Item in self.Contents[Arch].PcdsFixedAtBuild:\r
309                 Item = Item + DataType.TAB_VALUE_SPLIT\r
310                 List = GetSplitValueList(Item)\r
311                 if len(List) <= 2:\r
312                     ErrorMsg = "Wrong statement '%s' found in section PcdsFixedAtBuild in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
313                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
314                 MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_FIXED_AT_BUILD), Arch)\r
315             for Item in self.Contents[Arch].PcdsPatchableInModule:\r
316                 Item = Item + DataType.TAB_VALUE_SPLIT\r
317                 List = GetSplitValueList(Item)\r
318                 if len(List) <= 2:\r
319                     ErrorMsg = "Wrong statement '%s' found in section PcdsPatchableInModule in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
320                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
321                 MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_PATCHABLE_IN_MODULE), Arch)\r
322             for Item in self.Contents[Arch].PcdsFeatureFlag:\r
323                 Item = Item + DataType.TAB_VALUE_SPLIT\r
324                 List = GetSplitValueList(Item)\r
325                 if len(List) <= 2:\r
326                     ErrorMsg = "Wrong statement '%s' found in section PcdsFeatureFlag in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
327                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
328                 MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_FEATURE_FLAG), Arch)\r
329             for Item in self.Contents[Arch].PcdsDynamicEx:\r
330                 Item = Item + DataType.TAB_VALUE_SPLIT\r
331                 List = GetSplitValueList(Item)\r
332                 if len(List) <= 2:\r
333                     ErrorMsg = "Wrong statement '%s' found in section PcdsDynamicEx in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
334                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
335                 MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_DYNAMIC_EX), Arch)\r
336             for Item in self.Contents[Arch].PcdsDynamic:\r
337                 Item = Item + DataType.TAB_VALUE_SPLIT\r
338                 List = GetSplitValueList(Item)\r
339                 if len(List) <= 2:\r
340                     ErrorMsg = "Wrong statement '%s' found in section PcdsDynamic in file '%s', correct format is '<TokenName>|<TSGuidName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
341                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
342                 MergeArches(Pcds, (List[0], List[1], List[2], TAB_PCDS_DYNAMIC), Arch)\r
343         for Key in Pcds.keys():\r
344             Pcd = PcdClass()\r
345             Pcd.Token = Key[0]\r
346             Pcd.TokenSpaceGuidCName = Key[1]\r
347             Pcd.DefaultValue = Key[2]\r
348             Pcd.ItemType = Key[3]\r
349             Pcd.SupArchList = Pcds[Key]\r
350             self.Module.PcdCodes.append(Pcd)\r
351         \r
352         #Sources\r
353         Sources = {}\r
354         for Arch in DataType.ARCH_LIST:\r
355             for Item in self.Contents[Arch].Sources:\r
356                 Item = Item + DataType.TAB_VALUE_SPLIT * 4\r
357                 List = GetSplitValueList(Item)\r
358                 MergeArches(Sources, (List[0], List[1], List[2], List[3], List[4]), Arch)\r
359         for Key in Sources.keys():\r
360             Source = ModuleSourceFileClass()\r
361             Source.SourceFile = Key[0]\r
362             Source.ToolChainFamily = Key[1]\r
363             Source.FeatureFlag = Key[2]\r
364             Source.TagName = Key[3]\r
365             Source.ToolCode = Key[4]\r
366             Source.SupArchList = Sources[Key]\r
367             self.Module.Sources.append(Source)\r
368         \r
369         #UserExtensions\r
370         if self.UserExtensions != '':\r
371             UserExtension = UserExtensionsClass()\r
372             Lines = self.UserExtensions.splitlines()\r
373             List = GetSplitValueList(Lines[0], DataType.TAB_SPLIT, 2)\r
374             if len(List) != 3:\r
375                 ErrorMsg = "Wrong statement '%s' found in section UserExtensions in file '%s', correct format is 'UserExtensions.UserId.'Identifier''" % (Item[0:-1], self.Module.Header.FullPath) \r
376                 raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
377             else:\r
378                 UserExtension.UserID = List[1]\r
379                 UserExtension.Identifier = List[2][0:-1].replace("'", '').replace('\"', '')\r
380                 for Line in Lines[1:]:\r
381                     UserExtension.Content = UserExtension.Content + CleanString(Line) + '\n'\r
382             self.Module.UserExtensions.append(UserExtension)\r
383         \r
384         #Guids\r
385         Guids = {}\r
386         for Arch in DataType.ARCH_LIST:\r
387             for Item in self.Contents[Arch].Guids:\r
388                 MergeArches(Guids, Item, Arch)\r
389         for Key in Guids.keys():\r
390             Guid = GuidClass()\r
391             Guid.CName = Key\r
392             Guid.SupArchList = Guids[Key]\r
393             self.Module.Guids.append(Guid)\r
394 \r
395         #Protocols\r
396         Protocols = {}\r
397         for Arch in DataType.ARCH_LIST:\r
398             for Item in self.Contents[Arch].Protocols:\r
399                 MergeArches(Protocols, Item, Arch)\r
400         for Key in Protocols.keys():\r
401             Protocol = ProtocolClass()\r
402             Protocol.CName = Key\r
403             Protocol.SupArchList = Protocols[Key]\r
404             self.Module.Protocols.append(Protocol)\r
405         \r
406         #Ppis\r
407         Ppis = {}\r
408         for Arch in DataType.ARCH_LIST:\r
409             for Item in self.Contents[Arch].Ppis:\r
410                 MergeArches(Ppis, Item, Arch)\r
411         for Key in Ppis.keys():\r
412             Ppi = PpiClass()\r
413             Ppi.CName = Key\r
414             Ppi.SupArchList = Ppis[Key]\r
415             self.Module.Ppis.append(Ppi)\r
416         \r
417         #Depex\r
418         Depex = {}\r
419         Defines = {}\r
420         for Arch in DataType.ARCH_LIST:\r
421             Line = ''\r
422             for Item in self.Contents[Arch].Depex:\r
423                 Status = GenDefines(Item, Arch, Defines)\r
424                 if Status == 0:       # Find DEFINE statement\r
425                     pass\r
426                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
427                     ErrorMsg = "Wrong DEFINE statement '%s' found in section Depex in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Module.Header.FullPath) \r
428                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
429                 elif Status == 1:     # Not find DEFINE statement\r
430                     Line = Line + Item + ' '\r
431             MergeArches(Depex, Line, Arch)\r
432         for Key in Depex.keys():\r
433             Dep = ModuleDepexClass()\r
434             Dep.Depex = Key\r
435             Dep.SupArchList = Depex[Key]\r
436             Dep.Define = Defines\r
437             self.Module.Depex.append(Dep)\r
438         \r
439         #Binaries\r
440         Binaries = {}\r
441         for Arch in DataType.ARCH_LIST:\r
442             for Item in self.Contents[Arch].Binaries:\r
443                 Item = Item + DataType.TAB_VALUE_SPLIT\r
444                 List = GetSplitValueList(Item)\r
445                 if len(List) < 4:\r
446                     ErrorMsg = "Wrong DEFINE statement '%s' found in section Binaries in file '%s', correct format is '<FileType>|<Target>|<FileName>[|<PcdFeatureFlag>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
447                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
448                 else:\r
449                     MergeArches(Binaries, (List[0], List[1], List[2], List[3]), Arch)\r
450         for Key in Binaries.keys():\r
451             Binary = ModuleBinaryFileClass()\r
452             Binary.FileType = Key[0]\r
453             Binary.Target = Key[1]\r
454             Binary.BinaryFile = Key[2]\r
455             Binary.FeatureFlag = Key[3]\r
456             Binary.SupArchList = Binaries[Key]\r
457             self.Module.Binaries.append(Binary)\r
458         \r
459     def LoadInfFile(self, Filename):     \r
460         (Filepath, Name) = os.path.split(Filename)\r
461         self.Identification.FileName = Name\r
462         self.Identification.FileFullPath = Filename\r
463         self.Identification.FileRelativePath = Filepath\r
464         \r
465         f = open(Filename, 'r').read()\r
466         sects = f.split('[')\r
467         for sect in sects:\r
468             tab = (sect.split(TAB_SECTION_END, 1)[0]).upper()\r
469             if tab == TAB_INF_DEFINES.upper():\r
470                 GetSingleValueOfKeyFromLines(sect, self.Defines.DefinesDictionary, TAB_COMMENT_SPLIT, TAB_EQUAL_SPLIT, False, None)\r
471                 if self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT][0] == '':\r
472                     self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT] = []\r
473                 if self.Defines.DefinesDictionary[TAB_INF_DEFINES_UNLOAD_IMAGE][0] == '':\r
474                     self.Defines.DefinesDictionary[TAB_INF_DEFINES_UNLOAD_IMAGE] = []\r
475                 if self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR][0] == '':\r
476                     self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR] = []\r
477                 if self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR][0] == '':\r
478                     self.Defines.DefinesDictionary[TAB_INF_DEFINES_DESTRUCTOR] = []\r
479                 continue\r
480             if tab.find(DataType.TAB_USER_EXTENSIONS.upper()) > -1:\r
481                 self.UserExtensions = sect\r
482                 continue\r
483             for arch in DataType.ARCH_LIST_FULL + [DataType.TAB_ARCH_NULL]:\r
484                 for key in self.KeyList:\r
485                     if arch != DataType.TAB_ARCH_NULL:\r
486                         target = (key + DataType.TAB_SPLIT + arch).upper()\r
487                     else:\r
488                         target = key.upper()\r
489                     if SplitModuleType(tab)[0] == target:\r
490                         if arch != DataType.TAB_ARCH_NULL:\r
491                             Command = 'self.ParseInf(sect, tab, self.Contents[arch].' + key + ')'\r
492                             eval(Command)\r
493                             continue\r
494                         else:\r
495                             Command = "self.ParseInf(sect, tab, self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ')'\r
496                             eval(Command)\r
497                             continue\r
498         #EndFor\r
499 \r
500     def ShowInf(self):\r
501         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
502         printDict(self.Defines.DefinesDictionary)\r
503 \r
504         for key in self.KeyList:\r
505             for arch in DataType.ARCH_LIST_FULL:\r
506                 Command = "printList(TAB_SECTION_START + '" + \\r
507                           key + DataType.TAB_SPLIT + arch + \\r
508                           "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
509                 eval(Command)\r
510         print ""\r
511     \r
512     def ShowModule(self):\r
513         m = self.Module\r
514         print 'Filename =', m.Header.FileName\r
515         print 'FullPath =', m.Header.FullPath\r
516         print 'BaseName =', m.Header.Name\r
517         print 'Guid =', m.Header.Guid\r
518         print 'Version =', m.Header.Version\r
519         print 'InfVersion =', m.Header.InfVersion\r
520         print 'EfiSpecificationVersion =', m.Header.EfiSpecificationVersion\r
521         print 'EdkReleaseVersion =', m.Header.EdkReleaseVersion                \r
522         print 'ModuleType =', m.Header.ModuleType\r
523         print 'BinaryModule =', m.Header.BinaryModule\r
524         print 'ComponentType =', m.Header.ComponentType\r
525         print 'MakefileName =', m.Header.MakefileName\r
526         print 'BuildNumber =', m.Header.BuildNumber\r
527         print 'BuildType =', m.Header.BuildType\r
528         print 'FfsExt =', m.Header.FfsExt\r
529         print 'FvExt =', m.Header.FvExt\r
530         print 'SourceFv =', m.Header.SourceFv\r
531         print 'PcdIsDriver =', m.Header.PcdIsDriver\r
532         print 'TianoR8FlashMap_h =', m.Header.TianoR8FlashMap_h\r
533         print 'LibraryClass =', m.Header.LibraryClass\r
534         for Item in m.Header.LibraryClass:\r
535             print Item.LibraryClass, DataType.TAB_VALUE_SPLIT.join(Item.SupModuleList)\r
536         print 'CustomMakefile =', m.Header.CustomMakefile\r
537         for Item in self.Module.ExternImages:\r
538             print 'Entry_Point = %s, UnloadImage = %s' % (Item.ModuleEntryPoint, Item.ModuleUnloadImage)\r
539         for Item in self.Module.ExternLibraries:\r
540             print 'Constructor = %s, Destructor = %s' % (Item.Constructor, Item.Destructor)\r
541         print 'Define =', m.Header.Define\r
542         print 'Specification =', m.Header.Specification\r
543         print '\nBuildOptions =', m.BuildOptions\r
544         for Item in m.BuildOptions:\r
545             print Item.ToolChainFamily, Item.ToolChain, Item.Option, Item.SupArchList\r
546         print '\nIncludes =', m.Includes\r
547         for Item in m.Includes:\r
548             print Item.FilePath, Item.SupArchList\r
549         print '\nLibraries =', m.Libraries\r
550         for Item in m.Libraries:\r
551             print Item.Library, Item.SupArchList\r
552         print '\nLibraryClasses =', m.LibraryClasses\r
553         for Item in m.LibraryClasses:\r
554             print Item.LibraryClass, Item.RecommendedInstance, Item.FeatureFlag, Item.SupModuleList, Item.SupArchList, Item.Define\r
555         print '\nPackageDependencies =', m.PackageDependencies\r
556         for Item in m.PackageDependencies:\r
557             print Item.FilePath, Item.SupArchList, Item.Define\r
558         print '\nNmake =', m.Nmake\r
559         for Item in m.Nmake:\r
560             print Item.Name, Item.Value, Item.SupArchList\r
561         print '\nPcds =', m.PcdCodes\r
562         for Item in m.PcdCodes:\r
563             print Item.Token, Item.TokenSpaceGuidCName, Item.DefaultValue, Item.ItemType, Item.SupArchList\r
564         print '\nSources =', m.Sources\r
565         for Source in m.Sources:\r
566             print Source.SourceFile, Source.ToolChainFamily, Source.FeatureFlag, Source.TagName, Source.ToolCode, Source.SupArchList\r
567         print '\nUserExtensions =', m.UserExtensions\r
568         for UserExtension in m.UserExtensions:\r
569             print UserExtension.UserID, UserExtension.Identifier,UserExtension.Content\r
570         print '\nGuids =', m.Guids\r
571         for Item in m.Guids:\r
572             print Item.CName, Item.SupArchList\r
573         print '\nProtocols =', m.Protocols\r
574         for Item in m.Protocols:\r
575             print Item.CName, Item.SupArchList\r
576         print '\nPpis =', m.Ppis\r
577         for Item in m.Ppis:\r
578             print Item.CName, Item.SupArchList\r
579         print '\nDepex =', m.Depex\r
580         for Item in m.Depex:\r
581             print Item.Depex, Item.SupArchList, Item.Define\r
582         print '\nBinaries =', m.Binaries\r
583         for Binary in m.Binaries:\r
584             print Binary.FileType, Binary.Target, Binary.BinaryFile, Binary.FeatureFlag\r
585         \r
586 if __name__ == '__main__':\r
587     m = Inf()\r
588     directory = 'C:\Documents and Settings\\hchen30\\Desktop\\prototype\\inf'\r
589     fileList = []\r
590     \r
591     for f in os.listdir(directory):\r
592         if os.path.splitext(os.path.normcase(f))[1] == '.inf':\r
593             fileList.append(os.path.join(directory, os.path.normcase(f)))\r
594             \r
595     for f in fileList:\r
596         m = Inf(f, True, True)\r
597         #m.ShowInf()\r
598         m.ShowModule()\r