git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@412 7335b...
[people/mcb30/basetools.git] / Source / Python / Common / DscClassObject.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 DSC file\r
12 #\r
13 \r
14 import os\r
15 from String import *\r
16 from DataType import *\r
17 from Identification import *\r
18 from Dictionary import *\r
19 from CommonDataClass.PlatformClass import *\r
20 from CommonDataClass.CommonClass import SkuInfoClass\r
21 from BuildToolError import *\r
22 \r
23 class DscObject(object):\r
24     def __init__(self):\r
25         object.__init__()\r
26 \r
27 class DscDefines(DscObject):\r
28     def __init__(self):\r
29         self.DefinesDictionary = {\r
30             #Req\r
31             TAB_DSC_DEFINES_PLATFORM_NAME                         : [''],\r
32             TAB_DSC_DEFINES_PLATFORM_GUID                         : [''],\r
33             TAB_DSC_DEFINES_PLATFORM_VERSION                      : [''],\r
34             TAB_DSC_DEFINES_DSC_SPECIFICATION                     : [''],\r
35             TAB_DSC_DEFINES_OUTPUT_DIRECTORY                      : [''],\r
36             TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES               : [''],\r
37             TAB_DSC_DEFINES_BUILD_TARGETS                         : [''],\r
38             TAB_DSC_DEFINES_SKUID_IDENTIFIER                      : [''],\r
39             TAB_DSC_DEFINES_FLASH_DEFINITION                      : [''],\r
40             TAB_DSC_DEFINES_BUILD_NUMBER                          : [''],\r
41             TAB_DSC_DEFINES_MAKEFILE_NAME                         : ['']                        \r
42         }\r
43 \r
44 class DscSkuId(DscObject):\r
45     def __init__(self):\r
46         self.SkuId = {}         #{ [skuid : skuname], [skuid : skuname], ...}\r
47 \r
48 class DscContents(DscObject):\r
49     def __init__(self):\r
50         self.SkuIds = []\r
51         self.Libraries = []\r
52         self.Components = []                #[['component name', [lib1, lib2, lib3], [bo1, bo2, bo3]], ...]\r
53         self.LibraryClasses = []\r
54         self.PcdsFixedAtBuild = []\r
55         self.PcdsPatchableInModule = []\r
56         self.PcdsFeatureFlag = []\r
57         self.PcdsDynamicDefault = []\r
58         self.PcdsDynamicVpd = []\r
59         self.PcdsDynamicHii = []       \r
60         self.PcdsDynamicExDefault = []\r
61         self.PcdsDynamicExVpd = []\r
62         self.PcdsDynamicExHii = []                \r
63         self.BuildOptions = []\r
64 \r
65 class Dsc(DscObject):\r
66     def __init__(self, filename = None, isMergeAllArches = False, isToPlatform = False):\r
67         self.Identification = Identification()\r
68         self.Defines = DscDefines()\r
69         self.Contents = {}\r
70         self.UserExtensions = ''\r
71         self.Platform = PlatformClass()\r
72 \r
73         for key in DataType.ARCH_LIST_FULL:\r
74             self.Contents[key] = DscContents()\r
75         \r
76         self.KeyList = [\r
77             TAB_SKUIDS, TAB_LIBRARIES, TAB_LIBRARY_CLASSES, TAB_BUILD_OPTIONS, TAB_PCDS_FIXED_AT_BUILD_NULL, \\r
78             TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
79             TAB_PCDS_DYNAMIC_DEFAULT_NULL, TAB_PCDS_DYNAMIC_HII_NULL, TAB_PCDS_DYNAMIC_VPD_NULL, \\r
80             TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL, TAB_PCDS_DYNAMIC_EX_HII_NULL, TAB_PCDS_DYNAMIC_EX_VPD_NULL, \\r
81             TAB_COMPONENTS\r
82         ]\r
83         \r
84         if filename != None:\r
85             self.LoadDscFile(filename)\r
86             \r
87         if isMergeAllArches:\r
88             self.MergeAllArches()\r
89         \r
90         if isToPlatform:\r
91             self.DscToPlatform()\r
92         \r
93     def ParseDsc(self, Lines, Key, KeyField):\r
94         newKey = SplitModuleType(Key)     \r
95         if newKey[0].find(TAB_LIBRARY_CLASSES.upper()) != -1:\r
96             GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
97         elif newKey[0].find(TAB_COMPONENTS.upper()) != -1:\r
98             GetComponents(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
99         elif newKey[0].find(TAB_PCDS_DYNAMIC.upper()) != -1:\r
100             GetDynamics(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
101         else:\r
102             GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
103     \r
104     def MergeAllArches(self):\r
105         for key in self.KeyList:\r
106             for arch in DataType.ARCH_LIST:\r
107                 Command = "self.Contents[arch]." + key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ")"\r
108                 eval(Command)\r
109             \r
110     def LoadDscFile(self, Filename):\r
111         (Filepath, Name) = os.path.split(Filename)\r
112         self.Identification.FileName = Name\r
113         self.Identification.FileFullPath = Filename\r
114         self.Identification.FileRelativePath = Filepath\r
115         \r
116         F = open(Filename, 'r').read()\r
117         sects = F.split('[')\r
118         for sect in sects:\r
119             tab = (sect.split(TAB_SECTION_END, 1)[0]).upper()\r
120             if tab == TAB_INF_DEFINES.upper():\r
121                 GetSingleValueOfKeyFromLines(sect, self.Defines.DefinesDictionary, TAB_COMMENT_SPLIT, TAB_EQUAL_SPLIT, True, TAB_VALUE_SPLIT)\r
122                 continue\r
123             for arch in DataType.ARCH_LIST_FULL + [DataType.TAB_ARCH_NULL]:\r
124                 for key in self.KeyList:\r
125                     if arch != DataType.TAB_ARCH_NULL:\r
126                         target = (key + DataType.TAB_SPLIT + arch).upper()\r
127                     else:\r
128                         target = key.upper()\r
129                     if SplitModuleType(tab)[0] == target:\r
130                         if arch != DataType.TAB_ARCH_NULL:\r
131                             Command = 'self.ParseDsc(sect, tab, self.Contents[arch].' + key + ')'\r
132                             eval(Command)\r
133                             continue\r
134                         else:\r
135                             Command = "self.ParseDsc(sect, tab, self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ')'\r
136                             eval(Command)\r
137                             continue\r
138 \r
139     def DscToPlatform(self):\r
140         #\r
141         # Get value for Header\r
142         #\r
143         self.Platform.Header.Name = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_PLATFORM_NAME][0]\r
144         self.Platform.Header.Guid = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_PLATFORM_GUID][0]\r
145         self.Platform.Header.Version = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_PLATFORM_VERSION][0]\r
146         self.Platform.Header.FileName = self.Identification.FileName\r
147         self.Platform.Header.FullPath = self.Identification.FileFullPath\r
148         self.Platform.Header.DscSpecification = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_DSC_SPECIFICATION][0]\r
149         \r
150         self.Platform.Header.SkuIdName = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_SKUID_IDENTIFIER]\r
151         self.Platform.Header.SupArchList = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES]\r
152         self.Platform.Header.BuildTargets = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_BUILD_TARGETS]\r
153         self.Platform.Header.OutputDirectory = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_OUTPUT_DIRECTORY][0]\r
154         self.Platform.Header.BuildNumber = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_BUILD_NUMBER][0]\r
155         self.Platform.Header.MakefileName = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_MAKEFILE_NAME][0]\r
156         \r
157         Fdf = PlatformFlashDefinitionFileClass()\r
158         Fdf.FilePath = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_FLASH_DEFINITION][0]\r
159         self.Platform.FlashDefinitionFile = Fdf\r
160         \r
161         #BuildOptions\r
162         BuildOptions = {}\r
163         IncludeFiles = {}\r
164         for Arch in DataType.ARCH_LIST:\r
165             for Item in self.Contents[Arch].BuildOptions:\r
166                 if GenInclude(Item, IncludeFiles, Arch):\r
167                     continue\r
168                 MergeArches(BuildOptions, GetBuildOption(Item), Arch)\r
169         self.Platform.BuildOptions.IncludeFiles = IncludeFiles\r
170         for Key in BuildOptions.keys():\r
171             BuildOption = BuildOptionClass(Key[0], Key[1], Key[2])\r
172             BuildOption.SupArchList = BuildOptions[Key]\r
173             self.Platform.BuildOptions.BuildOptionList.append(BuildOption)\r
174         \r
175         #SkuIds\r
176         IncludeFiles = {}\r
177         self.Platform.SkuInfos.SkuInfoList['DEFAULT'] = '0'\r
178         for Arch in DataType.ARCH_LIST:\r
179             for Item in self.Contents[Arch].SkuIds:\r
180                 if GenInclude(Item, IncludeFiles, Arch):\r
181                     continue\r
182                 List = GetSplitValueList(Item)\r
183                 if len(List) != 2:\r
184                     ErrorMsg = "Wrong statement '%s' found in section SkuIds in file '%s', correct format is '<Integer>|<UiName>'" % (Item, self.Platform.Header.FullPath)\r
185                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
186                 else:\r
187                     self.Platform.SkuInfos.SkuInfoList[List[1]] = List[0]\r
188         self.Platform.SkuInfos.IncludeFiles = IncludeFiles\r
189         \r
190         #Libraries\r
191         Libraries = {}\r
192         IncludeFiles = {}\r
193         Defines = {}\r
194         for Arch in DataType.ARCH_LIST:\r
195             for Item in self.Contents[Arch].Libraries:\r
196                 if GenInclude(Item, IncludeFiles, Arch):\r
197                     continue\r
198                 Status = GenDefines(Item, Arch, Defines)\r
199                 if Status == 0:       # Find DEFINE statement\r
200                     pass\r
201                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
202                     ErrorMsg = "Wrong DEFINE statement '%s' found in section Libraries in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
203                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
204                 elif Status == 1:     # Not find DEFINE statement\r
205                     MergeArches(Libraries, Item, Arch)\r
206         self.Platform.Libraries.IncludeFiles = IncludeFiles\r
207         for Key in Libraries.keys():\r
208             Library = PlatformLibraryClass()\r
209             Library.FilePath = Key\r
210             Library.Define = Defines\r
211             Library.SupArchList = Libraries[Key]\r
212             self.Platform.Libraries.LibraryList.append(Library)\r
213         \r
214         #LibraryClasses\r
215         LibraryClasses = {}\r
216         IncludeFiles = {}\r
217         Defines = {}\r
218         for Arch in DataType.ARCH_LIST:\r
219             for Item in self.Contents[Arch].LibraryClasses:\r
220                 if GenInclude(Item[0], IncludeFiles, Arch):\r
221                     continue\r
222                 Status = GenDefines(Item[0], Arch, Defines)\r
223                 if Status == 0:       # Find DEFINE statement\r
224                     pass\r
225                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
226                     ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
227                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
228                 elif Status == 1:     # Not find DEFINE statement\r
229                     List = GetSplitValueList(Item[0])\r
230                     if len(List) != 2:\r
231                         ErrorMsg = "Wrong statement '%s' found in section LibraryClasses in file '%s', correct format is '<LibraryClassKeyWord>|<LibraryInstance>'" % (Item, self.Platform.Header.FullPath) \r
232                         raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
233                     else:\r
234                         MergeArches(LibraryClasses, (List[0], List[1]) + tuple(Item[1]), Arch)\r
235         self.Platform.LibraryClasses.IncludeFiles = IncludeFiles\r
236         for Key in LibraryClasses.keys():\r
237             Library = PlatformLibraryClass()\r
238             Library.Name = Key[0]\r
239             Library.FilePath = Key[1]\r
240             Library.ModuleType = list(Key[2:])\r
241             Library.Define = Defines\r
242             Library.SupArchList = LibraryClasses[Key]\r
243             self.Platform.LibraryClasses.LibraryList.append(Library)\r
244         \r
245         #Pcds\r
246         self.GenPcds(DataType.TAB_PCDS_FIXED_AT_BUILD)\r
247         self.GenPcds(DataType.TAB_PCDS_PATCHABLE_IN_MODULE)\r
248         self.GenPcds(DataType.TAB_PCDS_FEATURE_FLAG)\r
249         self.GenDynamicDefaultPcds(DataType.TAB_PCDS_DYNAMIC_DEFAULT)\r
250         self.GenDynamicDefaultPcds(DataType.TAB_PCDS_DYNAMIC_EX_DEFAULT)\r
251         self.GenDynamicHiiPcds(DataType.TAB_PCDS_DYNAMIC_HII)\r
252         self.GenDynamicHiiPcds(DataType.TAB_PCDS_DYNAMIC_EX_HII)\r
253         self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_VPD)\r
254         self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_EX_VPD)\r
255         \r
256         #Components\r
257         Components = {}\r
258         IncludeFiles = {}\r
259         Defines = {}\r
260         for Arch in DataType.ARCH_LIST:\r
261             for Item in self.Contents[Arch].Components:\r
262                 (InfFilename, ExecFilename) = GetExec(Item[0])\r
263                 LibraryClasses = Item[1]\r
264                 BuildOptions = Item[2]\r
265                 Pcds = Item[3]\r
266                 Component = PlatformModuleClass()\r
267                 Component.FilePath = InfFilename\r
268                 Component.ExecFilePath = ExecFilename\r
269                 for Lib in LibraryClasses:\r
270                     List = GetSplitValueList(Lib)\r
271                     if len(List) != 2:\r
272                         ErrorMsg = "Wrong LibraryClass statement '%s' found in section Components in file '%s', correct format is '<ClassName>|<InfFilename>'" % (Lib, self.Platform.Header.FullPath) \r
273                         raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
274                     Component.LibraryClasses.LibraryList.append(PlatformLibraryClass(List[0], List[1]))\r
275                 for BuildOption in BuildOptions:\r
276                     Key = GetBuildOption(BuildOption)\r
277                     Component.ModuleSaBuildOption.BuildOptionList.append(BuildOptionClass(Key[0], Key[1], Key[2]))\r
278                 for Pcd in Pcds:\r
279                     Type = Pcd[0]\r
280                     List = GetSplitValueList(Pcd[1])\r
281                     if Type == DataType.TAB_PCDS_FEATURE_FLAG:\r
282                         if len(List) != 3:\r
283                             ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<Cname>|<TokenSpaceGuidCName>|<TrueFalse>'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
284                             raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
285                         else:\r
286                             Component.PcdBuildDefinitions.append(PcdClass(List[0], '', List[1], '', '', List[2], Type, [], {}, []))\r
287                     if Type == DataType.TAB_PCDS_FIXED_AT_BUILD or Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE:\r
288                         if len(List.append('')) < 4:\r
289                             ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<Cname>|<TokenSpaceGuidCName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
290                             raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
291                         else:\r
292                             Component.PcdBuildDefinitions.append(PcdClass(List[0], '', List[1], '', List[3], List[2], Type, [], {}, []))\r
293                     if Type == DataType.TAB_PCDS_DYNAMIC or Type == DataType.TAB_PCDS_DYNAMIC_EX:\r
294                         if len(List) != 2:\r
295                             ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<Cname>|<TokenSpaceGuidCName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
296                             raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
297                         else:\r
298                             Component.PcdBuildDefinitions.append(PcdClass(List[0], '', List[1], '', List[3], List[2], Type, [], {}, []))                        \r
299                     \r
300                 if GenInclude(Item[0], IncludeFiles, Arch):\r
301                     continue\r
302                 Status = GenDefines(Item[0], Arch, Defines)\r
303                 if Status == 0:       # Find DEFINE statement\r
304                     pass\r
305                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
306                     ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
307                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
308                 elif Status == 1:     # Not find DEFINE statement\r
309                     MergeArches(Components, Component, Arch)\r
310         self.Platform.Modules.IncludeFiles = IncludeFiles\r
311         for Key in Components.keys():\r
312             Key.Define = Defines\r
313             Key.SupArchList = Components[Key]\r
314             self.Platform.Modules.ModuleList.append(Key)\r
315         \r
316     #End of DscToPlatform\r
317     \r
318     def GenPcds(self, Type = ''):\r
319         Pcds = {}\r
320         Items = []\r
321         for Arch in DataType.ARCH_LIST:\r
322             if Type == DataType.TAB_PCDS_FIXED_AT_BUILD:\r
323                 Items = self.Contents[Arch].PcdsFixedAtBuild\r
324             elif Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE:\r
325                 Items = self.Contents[Arch].PcdsPatchableInModule\r
326             elif Type == DataType.TAB_PCDS_FEATURE_FLAG:\r
327                 Items = self.Contents[Arch].PcdsFeatureFlag\r
328             else:\r
329                 pass\r
330             \r
331             for Item in Items:\r
332                 List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT)\r
333                 if len(List) < 4:\r
334                     ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenName>|<PcdTokenSpaceGuidCName>|<Value>[|<MaximumDatumSize>]'" % (Item, Type, self.Platform.Header.FullPath) \r
335                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
336                 else:\r
337                     MergeArches(Pcds, (List[0], List[1], List[2], List[3], Type), Arch)\r
338         for Key in Pcds:\r
339             Pcd = PcdClass(Key[0], '', Key[1], '', Key[3], Key[2], Key[4], [], {}, [])\r
340             Pcd.SupArchList = Pcds[Key]\r
341             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
342     \r
343     def GenSkuInfoList(self, SkuNameList, SkuInfo, VariableName = '', VariableGuid = '', VariableOffset = '', HiiDefaultValue = '', VpdOffset = '', DefaultValue = ''):\r
344         if SkuNameList == None or SkuNameList == [] or SkuNameList == ['']:\r
345                 SkuNameList = ['DEFAULT']\r
346         SkuInfoList = {}\r
347         for Item in SkuNameList:\r
348             if Item not in SkuInfo:\r
349                 return False, Item\r
350             Sku = SkuInfoClass(Item, SkuInfo[Item], VariableName, VariableGuid, VariableOffset, HiiDefaultValue, VpdOffset, DefaultValue)\r
351             SkuInfoList[Item] = Sku\r
352         \r
353         return True, SkuInfoList\r
354             \r
355     def GenDynamicDefaultPcds(self, Type = ''):\r
356         Pcds = {}\r
357         Items = []\r
358         SkuInfoList = {}\r
359         for Arch in DataType.ARCH_LIST:\r
360             if Type == DataType.TAB_PCDS_DYNAMIC_DEFAULT:\r
361                 Items = self.Contents[Arch].PcdsDynamicDefault\r
362             elif Type == DataType.TAB_PCDS_DYNAMIC_EX_DEFAULT:\r
363                 Items = self.Contents[Arch].PcdsDynamicExDefault\r
364             else:\r
365                 pass\r
366             \r
367             for Item in Items:\r
368                 List = GetSplitValueList(Item[0] + DataType.TAB_VALUE_SPLIT)\r
369                 if len(List) < 4:\r
370                     ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenName>|<PcdTokenSpaceGuidCName>|<Value>[|<MaximumDatumSize>]'" % (Item, Type, self.Platform.Header.FullPath) \r
371                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
372                 else:\r
373                     MergeArches(Pcds, (List[0], List[1], List[2], List[3], Type), Arch)\r
374         for Key in Pcds:\r
375             (Status, SkuInfoList) = self.GenSkuInfoList(Item[1], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', '', Key[2])\r
376             if Status == False:\r
377                 ErrorMsg = "SKUID '%s' of '%s' not defined in file '%s'" % (SkuInfoList, Type, self.Platform.Header.FullPath) \r
378                 raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
379             Pcd = PcdClass(Key[0], '', Key[1], '', Key[3], '', Key[4], [], SkuInfoList, [])\r
380             Pcd.SupArchList = Pcds[Key]\r
381             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
382          \r
383     def GenDynamicHiiPcds(self, Type = ''):\r
384         Pcds = {}\r
385         Items = []\r
386         SkuInfoList = {}\r
387         for Arch in DataType.ARCH_LIST:\r
388             if Type == DataType.TAB_PCDS_DYNAMIC_HII:\r
389                 Items = self.Contents[Arch].PcdsDynamicHii\r
390             elif Type == DataType.TAB_PCDS_DYNAMIC_EX_HII:\r
391                 Items = self.Contents[Arch].PcdsDynamicExHii\r
392             else:\r
393                 pass\r
394             \r
395             for Item in Items:\r
396                 List = GetSplitValueList(Item[0] + DataType.TAB_VALUE_SPLIT)\r
397                 if len(List) < 7:\r
398                     ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenName>|<PcdTokenSpaceGuidCName>|<String>|<VariableGuidCName>|<VariableOffset>|<DefaultValue>[|<MaximumDatumSize>]'" % (Item, Type, self.Platform.Header.FullPath) \r
399                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
400                 else:\r
401                     MergeArches(Pcds, (List[0], List[1], List[2], List[3], List[4], List[5], List[6], Type), Arch)\r
402         for Key in Pcds:\r
403             (Status, SkuInfoList) = self.GenSkuInfoList(Item[1], self.Platform.SkuInfos.SkuInfoList, List[3], List[4], List[5], List[6], '', '')\r
404             if Status == False:\r
405                 ErrorMsg = "SKUID '%s' of '%s' not defined in file '%s'" % (SkuInfoList, Type, self.Platform.Header.FullPath) \r
406                 raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
407             Pcd = PcdClass(Key[0], '', Key[1], '', Key[3], '', Key[7], [], SkuInfoList, [])\r
408             Pcd.SupArchList = Pcds[Key]\r
409             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
410     \r
411     def GenDynamicVpdPcds(self, Type = ''):\r
412         Pcds = {}\r
413         Items = []\r
414         SkuInfoList = {}\r
415         for Arch in DataType.ARCH_LIST:\r
416             if Type == DataType.TAB_PCDS_DYNAMIC_VPD:\r
417                 Items = self.Contents[Arch].PcdsDynamicVpd\r
418             elif Type == DataType.TAB_PCDS_DYNAMIC_EX_VPD:\r
419                 Items = self.Contents[Arch].PcdsDynamicExVpd\r
420             else:\r
421                 pass\r
422             \r
423             for Item in Items:\r
424                 List = GetSplitValueList(Item[0] + DataType.TAB_VALUE_SPLIT)\r
425                 if len(List) < 4:\r
426                     ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenName>|<PcdTokenSpaceGuidCName>|<DefaultValue>[|<MaximumDatumSize>]'" % (Item, Type, self.Platform.Header.FullPath) \r
427                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
428                 else:\r
429                     MergeArches(Pcds, (List[0], List[1], List[2], List[3], Type), Arch)\r
430         for Key in Pcds:\r
431             (Status, SkuInfoList) = self.GenSkuInfoList(Item[1], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', List[2], '')\r
432             if Status == False:\r
433                 ErrorMsg = "SKUID '%s' of '%s' not defined in file '%s'" % (SkuInfoList, Type, self.Platform.Header.FullPath) \r
434                 raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
435             Pcd = PcdClass(Key[0], '', Key[1], '', Key[3], '', Key[4], [], SkuInfoList, [])\r
436             Pcd.SupArchList = Pcds[Key]\r
437             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
438     \r
439     def ShowDsc(self):\r
440         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
441         printDict(self.Defines.DefinesDictionary)\r
442 \r
443         for key in self.KeyList:\r
444             for arch in DataType.ARCH_LIST_FULL:\r
445                 Command = "printList(TAB_SECTION_START + '" + \\r
446                                     key + DataType.TAB_SPLIT + arch + \\r
447                                     "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
448                 eval(Command)\r
449        \r
450     def ShowPlatform(self):\r
451         m = self.Platform\r
452         print 'Filename =', m.Header.FileName\r
453         print 'FullPath =', m.Header.FullPath\r
454         print 'BaseName =', m.Header.Name\r
455         print 'Guid =', m.Header.Guid\r
456         print 'Version =', m.Header.Version\r
457         print 'DscSpecification =', m.Header.DscSpecification\r
458         print 'SkuId =', m.Header.SkuIdName\r
459         print 'SupArchList =', m.Header.SupArchList\r
460         print 'BuildTargets =', m.Header.BuildTargets\r
461         print 'OutputDirectory =', m.Header.OutputDirectory\r
462         print 'BuildNumber =', m.Header.BuildNumber\r
463         print 'MakefileName =', m.Header.MakefileName\r
464         print 'Fdf =', m.FlashDefinitionFile.FilePath\r
465         print '\nBuildOptions =', m.BuildOptions, m.BuildOptions.IncludeFiles\r
466         for Item in m.BuildOptions.BuildOptionList:\r
467             print Item.ToolChainFamily, Item.ToolChain, Item.Option, Item.SupArchList\r
468         print '\nSkuIds =', m.SkuInfos.SkuInfoList, m.SkuInfos.IncludeFiles\r
469         print '\nLibraries =', m.Libraries, m.Libraries.IncludeFiles\r
470         for Item in m.Libraries.LibraryList:\r
471             print Item.FilePath, Item.SupArchList, Item.Define\r
472         print '\nLibraryClasses =', m.LibraryClasses, m.LibraryClasses.IncludeFiles\r
473         for Item in m.LibraryClasses.LibraryList:\r
474             print Item.Name, Item.FilePath, Item.ModuleType, Item.SupArchList, Item.Define\r
475         print '\nPcds =', m.DynamicPcdBuildDefinitions\r
476         for Item in m.DynamicPcdBuildDefinitions:\r
477             print Item.CName, Item.TokenSpaceGuidCName, Item.DefaultValue, Item.Token, Item.ItemType, Item.MaxDatumSize, Item.SupArchList, Item.SkuInfoList\r
478         print '\nComponents =', m.Modules.ModuleList, m.Modules.IncludeFiles\r
479         for Item in m.Modules.ModuleList:\r
480             print Item.FilePath, Item.ExecFilePath, Item.SupArchList\r
481             for Lib in Item.LibraryClasses.LibraryList:\r
482                 print Lib.Name, Lib.FilePath\r
483             for Bo in Item.ModuleSaBuildOption.BuildOptionList:\r
484                 print Bo.ToolChainFamily, Bo.ToolChain, Bo.Option\r
485             for Pcd in Item.PcdBuildDefinitions:\r
486                 print Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.MaxDatumSize, Pcd.DefaultValue, Pcd.ItemType\r
487     \r
488 if __name__ == '__main__':\r
489     p = Dsc()\r
490     directory = 'C:\MyWorkspace\\EdkModulePkg'\r
491     fileList = []\r
492     for f in os.listdir(directory):\r
493         if os.path.splitext(os.path.normcase(f))[1] == '.dsc':\r
494             fileList.append(os.path.join(directory, os.path.normcase(f)))\r
495             \r
496     for f in fileList:\r
497         p = Dsc(f, True, True)\r
498         #p.ShowDsc()\r
499         p.ShowPlatform()\r