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
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
11 #This file is used to define each component of DEC file
\r
15 from String import *
\r
16 from DataType import *
\r
17 from Identification import *
\r
18 from Dictionary import *
\r
19 from CommonDataClass.PackageClass import *
\r
20 from BuildToolError import *
\r
22 class DecObject(object):
\r
26 class DecDefines(DecObject):
\r
28 self.DefinesDictionary = {
\r
30 TAB_DEC_DEFINES_DEC_SPECIFICATION : [''],
\r
31 TAB_DEC_DEFINES_PACKAGE_NAME : [''],
\r
32 TAB_DEC_DEFINES_PACKAGE_GUID : [''],
\r
33 TAB_DEC_DEFINES_PACKAGE_VERSION : ['']
\r
36 class DecContents(DecObject):
\r
42 self.LibraryClasses = []
\r
43 self.PcdsFixedAtBuild = []
\r
44 self.PcdsPatchableInModule = []
\r
45 self.PcdsFeatureFlag = []
\r
46 self.PcdsDynamic = []
\r
47 self.PcdsDynamicEx = []
\r
49 class Dec(DecObject):
\r
50 def __init__(self, filename = None, isMergeAllArches = False, isToPackage = False):
\r
51 self.Identification = Identification()
\r
52 self.Defines = DecDefines()
\r
53 self.UserExtensions = ''
\r
54 self.Package = PackageClass()
\r
57 for key in DataType.ARCH_LIST_FULL:
\r
58 self.Contents[key] = DecContents()
\r
61 TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \
\r
62 TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \
\r
63 TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL
\r
66 if filename != None:
\r
67 self.LoadDecFile(filename)
\r
69 if isMergeAllArches:
\r
70 self.MergeAllArches()
\r
75 def ParseDec(self, Lines, Key, KeyField):
\r
76 GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)
\r
78 def MergeAllArches(self):
\r
79 for key in self.KeyList:
\r
80 for arch in DataType.ARCH_LIST:
\r
81 Command = "self.Contents[arch]." + key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ")"
\r
84 def LoadDecFile(self, Filename):
\r
85 (Filepath, Name) = os.path.split(Filename)
\r
86 self.Identification.FileName = Name
\r
87 self.Identification.FileFullPath = Filename
\r
88 self.Identification.FileRelativePath = Filepath
\r
90 f = open(Filename, 'r').read()
\r
91 sects = f.split('[')
\r
93 tab = (sect.split(TAB_SECTION_END, 1)[0]).upper()
\r
94 if tab == TAB_INF_DEFINES.upper():
\r
95 GetSingleValueOfKeyFromLines(sect, self.Defines.DefinesDictionary, TAB_COMMENT_SPLIT, TAB_EQUAL_SPLIT, True, TAB_VALUE_SPLIT)
\r
97 for arch in DataType.ARCH_LIST_FULL + [DataType.TAB_ARCH_NULL]:
\r
98 for key in self.KeyList:
\r
99 if arch != DataType.TAB_ARCH_NULL:
\r
100 target = (key + DataType.TAB_SPLIT + arch).upper()
\r
102 target = key.upper()
\r
104 if arch != DataType.TAB_ARCH_NULL:
\r
105 Command = 'self.ParseDec(sect, tab, self.Contents[arch].' + key + ')'
\r
109 Command = "self.ParseDec(sect, tab, self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ')'
\r
114 def DecToPackage(self):
\r
116 # Get value for Header
\r
118 self.Package.Header.Name = self.Defines.DefinesDictionary[TAB_DEC_DEFINES_PACKAGE_NAME][0]
\r
119 self.Package.Header.Guid = self.Defines.DefinesDictionary[TAB_DEC_DEFINES_PACKAGE_GUID][0]
\r
120 self.Package.Header.Version = self.Defines.DefinesDictionary[TAB_DEC_DEFINES_PACKAGE_VERSION][0]
\r
121 self.Package.Header.FileName = self.Identification.FileName
\r
122 self.Package.Header.FullPath = self.Identification.FileFullPath
\r
123 self.Package.Header.DecSpecification = self.Defines.DefinesDictionary[TAB_DEC_DEFINES_DEC_SPECIFICATION][0]
\r
127 for Arch in DataType.ARCH_LIST:
\r
128 for Item in self.Contents[Arch].Includes:
\r
129 MergeArches(Includes, Item, Arch)
\r
130 for Key in Includes.keys():
\r
131 Include = IncludeClass()
\r
132 Include.FilePath = Key
\r
133 Include.SupArchList = Includes[Key]
\r
134 self.Package.Includes.append(Include)
\r
138 for Arch in DataType.ARCH_LIST:
\r
139 for Item in self.Contents[Arch].Guids:
\r
140 List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)
\r
142 ErrorMsg = "Wrong statement '%s' found in section Guids in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath)
\r
143 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
145 MergeArches(Guids, (List[0], List[1]), Arch)
\r
146 for Key in Guids.keys():
\r
148 Guid.CName = Key[0]
\r
150 Guid.SupArchList = Guids[Key]
\r
151 self.Package.GuidDeclarations.append(Guid)
\r
155 for Arch in DataType.ARCH_LIST:
\r
156 for Item in self.Contents[Arch].Protocols:
\r
157 List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)
\r
159 ErrorMsg = "Wrong statement '%s' found in section Protocols in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath)
\r
160 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
162 MergeArches(Protocols, (List[0], List[1]), Arch)
\r
163 for Key in Protocols.keys():
\r
164 Protocol = ProtocolClass()
\r
165 Protocol.CName = Key[0]
\r
166 Protocol.Guid = Key[1]
\r
167 Protocol.SupArchList = Protocols[Key]
\r
168 self.Package.ProtocolDeclarations.append(Protocol)
\r
172 for Arch in DataType.ARCH_LIST:
\r
173 for Item in self.Contents[Arch].Ppis:
\r
174 List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)
\r
176 ErrorMsg = "Wrong statement '%s' found in section Ppis in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath)
\r
177 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
179 MergeArches(Ppis, (List[0], List[1]), Arch)
\r
180 for Key in Ppis.keys():
\r
184 Ppi.SupArchList = Ppis[Key]
\r
185 self.Package.PpiDeclarations.append(Ppi)
\r
188 LibraryClasses = {}
\r
189 for Arch in DataType.ARCH_LIST:
\r
190 for Item in self.Contents[Arch].LibraryClasses:
\r
191 List = GetSplitValueList(Item, DataType.TAB_VALUE_SPLIT)
\r
193 ErrorMsg = "Wrong statement '%s' found in section LibraryClasses in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath)
\r
194 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
196 MergeArches(LibraryClasses, (List[0], List[1]), Arch)
\r
197 for Key in LibraryClasses.keys():
\r
198 LibraryClass = LibraryClassClass()
\r
199 LibraryClass.LibraryClass = Key[0]
\r
200 LibraryClass.RecommendedInstance = Key[1]
\r
201 LibraryClass.SupArchList = LibraryClasses[Key]
\r
202 self.Package.LibraryClassDeclarations.append(LibraryClass)
\r
206 for Arch in DataType.ARCH_LIST:
\r
207 for Item in self.Contents[Arch].PcdsFixedAtBuild:
\r
208 List = GetSplitValueList(Item)
\r
210 ErrorMsg = "Wrong statement '%s' found in section PcdsFixedAtBuild in file '%s', correct format is '<TokenCName>|<Token>|<CName>|<DatumType>|<Default>'" % (Item, self.Package.Header.FullPath)
\r
211 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
212 MergeArches(Pcds, (List[0], List[1], List[2], List[3], List[4],TAB_PCDS_FIXED_AT_BUILD), Arch)
\r
213 for Item in self.Contents[Arch].PcdsPatchableInModule:
\r
214 List = GetSplitValueList(Item)
\r
216 ErrorMsg = "Wrong statement '%s' found in section PcdsPatchableInModule in file '%s', correct format is '<TokenCName>|<Token>|<CName>|<DatumType>|<Default>'" % (Item, self.Package.Header.FullPath)
\r
217 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
218 MergeArches(Pcds, (List[0], List[1], List[2], List[3], List[4], TAB_PCDS_PATCHABLE_IN_MODULE), Arch)
\r
219 for Item in self.Contents[Arch].PcdsFeatureFlag:
\r
220 List = GetSplitValueList(Item)
\r
222 ErrorMsg = "Wrong statement '%s' found in section PcdsFeatureFlag in file '%s', correct format is '<TokenCName>|<Token>|<CName>|<DatumType>|<Default>'" % (Item, self.Package.Header.FullPath)
\r
223 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
224 MergeArches(Pcds, (List[0], List[1], List[2], List[3], List[4], TAB_PCDS_FEATURE_FLAG), Arch)
\r
225 for Item in self.Contents[Arch].PcdsDynamicEx:
\r
226 List = GetSplitValueList(Item)
\r
228 ErrorMsg = "Wrong statement '%s' found in section PcdsDynamicEx in file '%s', correct format is '<TokenCName>|<Token>|<CName>|<DatumType>|<Default>'" % (Item, self.Package.Header.FullPath)
\r
229 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
230 MergeArches(Pcds, (List[0], List[1], List[2], List[3], List[4], TAB_PCDS_DYNAMIC_EX), Arch)
\r
231 for Item in self.Contents[Arch].PcdsDynamic:
\r
232 List = GetSplitValueList(Item)
\r
234 ErrorMsg = "Wrong statement '%s' found in section PcdsDynamic in file '%s', correct format is '<TokenCName>|<Token>|<CName>|<DatumType>|<Default>'" % (Item, self.Package.Header.FullPath)
\r
235 raise ParserError(PARSER_ERROR, msg = ErrorMsg)
\r
236 MergeArches(Pcds, (List[0], List[1], List[2], List[3], List[4], TAB_PCDS_DYNAMIC), Arch)
\r
237 for Key in Pcds.keys():
\r
241 Pcd.TokenSpaceGuidCName = Key[2]
\r
242 Pcd.DatumType = Key[3]
\r
243 Pcd.DefaultValue = Key[4]
\r
244 Pcd.ItemType = Key[5]
\r
245 Pcd.SupArchList = Pcds[Key]
\r
246 self.Package.PcdDeclarations.append(Pcd)
\r
249 print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END
\r
250 printDict(self.Defines.DefinesDictionary)
\r
252 for key in self.KeyList:
\r
253 for arch in DataType.ARCH_LIST_FULL:
\r
254 Command = "printList(TAB_SECTION_START + '" + \
\r
255 key + DataType.TAB_SPLIT + arch + \
\r
256 "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'
\r
259 def ShowPackage(self):
\r
261 print 'Filename =', m.Header.FileName
\r
262 print 'FullPath =', m.Header.FullPath
\r
263 print 'BaseName =', m.Header.Name
\r
264 print 'Guid =', m.Header.Guid
\r
265 print 'Version =', m.Header.Version
\r
266 print 'DecSpecification =', m.Header.DecSpecification
\r
267 print '\nIncludes =', m.Includes
\r
268 for Item in m.Includes:
\r
269 print Item.FilePath, Item.SupArchList
\r
270 print '\nGuids =', m.GuidDeclarations
\r
271 for Item in m.GuidDeclarations:
\r
272 print Item.CName, Item.Guid, Item.SupArchList
\r
273 print '\nProtocols =', m.ProtocolDeclarations
\r
274 for Item in m.ProtocolDeclarations:
\r
275 print Item.CName, Item.Guid, Item.SupArchList
\r
276 print '\nPpis =', m.PpiDeclarations
\r
277 for Item in m.PpiDeclarations:
\r
278 print Item.CName, Item.Guid, Item.SupArchList
\r
279 print '\nLibraryClasses =', m.LibraryClassDeclarations
\r
280 for Item in m.LibraryClassDeclarations:
\r
281 print Item.LibraryClass, Item.RecommendedInstance, Item.SupArchList
\r
282 print '\nPcds =', m.PcdDeclarations
\r
283 for Item in m.PcdDeclarations:
\r
284 print Item.CName, Item.TokenSpaceGuidCName, Item.DefaultValue, Item.ItemType, Item.Token, Item.DatumType, Item.SupArchList
\r
286 if __name__ == '__main__':
\r
288 directory = 'C:\Documents and Settings\\hchen30\\Desktop\\prototype\\dec'
\r
290 for f in os.listdir(directory):
\r
291 if os.path.splitext(os.path.normcase(f))[1] == '.dec':
\r
292 fileList.append(os.path.join(directory, os.path.normcase(f)))
\r
295 p = Dec(f, True, True)
\r