1. Adjust code to follow coding style, complete missing comments
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 18 Oct 2007 09:20:59 +0000 (09:20 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 18 Oct 2007 09:20:59 +0000 (09:20 +0000)
2. Fix a bug in library instance selection when it is defined in common arches and common module types

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@831 7335b38e-4728-0410-8992-fb3ffe349368

15 files changed:
Source/Python/Common/DataType.py
Source/Python/Common/DecClassObject.py
Source/Python/Common/Dictionary.py
Source/Python/Common/DscClassObject.py
Source/Python/Common/EdkIIWorkspace.py
Source/Python/Common/EdkIIWorkspaceBuild.py
Source/Python/Common/Identification.py
Source/Python/Common/InfClassObject.py
Source/Python/Common/String.py
Source/Python/Common/TargetTxtClassObject.py
Source/Python/Common/ToolDefClassObject.py
Source/Python/CommonDataClass/CommonClass.py
Source/Python/CommonDataClass/ModuleClass.py
Source/Python/CommonDataClass/PackageClass.py
Source/Python/CommonDataClass/PlatformClass.py

index 08b3cd3..c1696d8 100644 (file)
@@ -1,3 +1,6 @@
+## @file\r
+# This file is used to define common static strings used by INF/DEC/DSC files\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
@@ -7,12 +10,8 @@
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-#\r
-#This file is used to define each tab used by INF/DEC/DSC files\r
-#\r
-\r
-#\r
-#Common Definitions\r
+##\r
+# Common Definitions\r
 #\r
 TAB_SPLIT = '.'\r
 TAB_COMMENT_SPLIT = '#'\r
@@ -230,10 +229,14 @@ TAB_NMAKE = 'Nmake'
 TAB_USER_EXTENSIONS = 'UserExtensions'\r
 TAB_INCLUDE = '!include'\r
 \r
-#Common Define\r
+#\r
+# Common Define\r
+#\r
 TAB_COMMON_DEFINES = 'Defines'\r
 \r
-#Inf Definitions\r
+#\r
+# Inf Definitions\r
+#\r
 TAB_INF_DEFINES = TAB_COMMON_DEFINES\r
 TAB_INF_DEFINES_INF_VERSION = 'INF_VERSION'\r
 TAB_INF_DEFINES_BASE_NAME = 'BASE_NAME'\r
@@ -261,21 +264,25 @@ TAB_INF_DEFINES_DESTRUCTOR = 'DESTRUCTOR'
 TAB_INF_DEFINES_DEFINE = 'DEFINE'\r
 TAB_INF_DEFINES_SPEC = 'SPEC'\r
 TAB_INF_DEFINES_CUSTOM_MAKEFILE = 'CUSTOM_MAKEFILE'\r
-TAB_INF_DEFINES_MACRO_NAME = 'MacroName'               #TBD\r
+TAB_INF_DEFINES_MACRO_NAME = 'MacroName'\r
 TAB_INF_FIXED_PCD = 'FixedPcd'\r
 TAB_INF_FEATURE_PCD = 'FeaturePcd'\r
 TAB_INF_PATCH_PCD = 'PatchPcd'\r
 TAB_INF_PCD = 'Pcd'\r
 TAB_INF_PCD_EX = 'PcdEx'\r
 \r
-#Dec Definitions\r
+#\r
+# Dec Definitions\r
+#\r
 TAB_DEC_DEFINES = TAB_COMMON_DEFINES\r
 TAB_DEC_DEFINES_DEC_SPECIFICATION = 'DEC_SPECIFICATION'\r
 TAB_DEC_DEFINES_PACKAGE_NAME = 'PACKAGE_NAME'\r
 TAB_DEC_DEFINES_PACKAGE_GUID = 'PACKAGE_GUID'\r
 TAB_DEC_DEFINES_PACKAGE_VERSION = 'PACKAGE_VERSION'\r
 \r
-#Dsc Definitions\r
+#\r
+# Dsc Definitions\r
+#\r
 TAB_DSC_DEFINES = TAB_COMMON_DEFINES\r
 TAB_DSC_DEFINES_PLATFORM_NAME = 'PLATFORM_NAME'\r
 TAB_DSC_DEFINES_PLATFORM_GUID = 'PLATFORM_GUID'\r
@@ -292,7 +299,9 @@ TAB_DSC_DEFINES_BS_BASE_ADDRESS = 'BsBaseAddress'
 TAB_DSC_DEFINES_RT_BASE_ADDRESS = 'RtBaseAddress'\r
 TAB_DSC_DEFINES_DEFINE = 'DEFINE'\r
 \r
-#TargetTxt Definitions\r
+#\r
+# TargetTxt Definitions\r
+#\r
 TAB_TAT_DEFINES_ACTIVE_PLATFORM = 'ACTIVE_PLATFORM'\r
 TAB_TAT_DEFINES_ACTIVE_MODULE = 'ACTIVE_MODULE'\r
 TAB_TAT_DEFINES_TOOL_CHAIN_CONF = 'TOOL_CHAIN_CONF'\r
@@ -302,7 +311,9 @@ TAB_TAT_DEFINES_TARGET = 'TARGET'
 TAB_TAT_DEFINES_TOOL_CHAIN_TAG = 'TOOL_CHAIN_TAG'\r
 TAB_TAT_DEFINES_TARGET_ARCH = 'TARGET_ARCH'\r
 \r
-#ToolDef Definitions\r
+#\r
+# ToolDef Definitions\r
+#\r
 TAB_TOD_DEFINES_TARGET = 'TARGET'\r
 TAB_TOD_DEFINES_TOOL_CHAIN_TAG = 'TOOL_CHAIN_TAG'\r
 TAB_TOD_DEFINES_TARGET_ARCH = 'TARGET_ARCH'\r
index 32defa5..4337f78 100644 (file)
@@ -1,16 +1,19 @@
+## @file\r
+# This file is used to define each component of DEC file\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-#\r
-#This file is used to define each component of DEC file\r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import os\r
 from String import *\r
 from DataType import *\r
@@ -19,20 +22,53 @@ from Dictionary import *
 from CommonDataClass.PackageClass import *\r
 from BuildToolError import *\r
 \r
+## DecObject\r
+#\r
+# This class defined basic Dec object which is used by inheriting\r
+# \r
+# @param object:       Inherited from object class\r
+#\r
 class DecObject(object):\r
     def __init__(self):\r
         object.__init__()\r
 \r
+## DecDefines\r
+#\r
+# This class defined basic Defines used in Dec object\r
+# \r
+# @param DecObject:        Inherited from DecObject class\r
+#\r
+# @var DefinesDictionary:  To store value for DefinesDictionary \r
+#\r
 class DecDefines(DecObject):\r
     def __init__(self):\r
         self.DefinesDictionary = {\r
-            #Req\r
+            #\r
+            # Required Fields\r
+            #\r
             TAB_DEC_DEFINES_DEC_SPECIFICATION           : [''],\r
             TAB_DEC_DEFINES_PACKAGE_NAME                : [''],\r
             TAB_DEC_DEFINES_PACKAGE_GUID                : [''],\r
             TAB_DEC_DEFINES_PACKAGE_VERSION             : ['']\r
         }\r
-        \r
+\r
+## DecContents\r
+#\r
+# This class defined basic Contents used in Dec object\r
+# \r
+# @param DecObject:            Inherited from DecObject class\r
+#\r
+# @var Includes:               To store value for Includes\r
+# @var Guids:                  To store value for Guids\r
+# @var Protocols:              To store value for Protocols\r
+# @var Ppis:                   To store value for Ppis\r
+# @var LibraryClasses:         To store value for LibraryClasses\r
+# @var PcdsFixedAtBuild:       To store value for PcdsFixedAtBuild\r
+# @var PcdsPatchableInModule:  To store value for PcdsPatchableInModule\r
+# @var PcdsFeatureFlag:        To store value for PcdsFeatureFlag\r
+# @var PcdsDynamic:            To store value for PcdsDynamic\r
+# @var PcdsDynamicEx:          To store value for PcdsDynamicEx\r
+#\r
 class DecContents(DecObject):\r
     def __init__(self):\r
         self.Includes = []\r
@@ -46,8 +82,32 @@ class DecContents(DecObject):
         self.PcdsDynamic = []\r
         self.PcdsDynamicEx = []\r
 \r
+## Dec\r
+#\r
+# This class defined the structure used in Dec object\r
+# \r
+# @param DecObject:         Inherited from DecObject class\r
+# @param Filename:          Input value for Filename of Dec file, default is None\r
+# @param IsMergeAllArches:  Input value for IsMergeAllArches\r
+#                           True is to merge all arches\r
+#                           Fales is not to merge all arches\r
+#                           default is False\r
+# @param IsToPackage:       Input value for IsToPackage\r
+#                           True is to transfer to PackageObject automatically\r
+#                           False is not to transfer to PackageObject automatically\r
+#                           default is False\r
+# @param WorkspaceDir:      Input value for current workspace directory, default is None\r
+#\r
+# @var Identification:      To store value for Identification, it is a structure as Identification\r
+# @var Defines:             To store value for Defines, it is a structure as DecDefines\r
+# @var UserExtensions:      To store value for UserExtensions\r
+# @var Package:             To store value for Package, it is a structure as PackageClass\r
+# @var WorkspaceDir:        To store value for WorkspaceDir\r
+# @var Contents:            To store value for Contents, it is a structure as DecContents\r
+# @var KeyList:             To store value for KeyList, a list for all Keys used in Dec\r
+#\r
 class Dec(DecObject):\r
-    def __init__(self, filename = None, isMergeAllArches = False, isToPackage = False, WorkspaceDir = None):\r
+    def __init__(self, Filename = None, IsMergeAllArches = False, IsToPackage = False, WorkspaceDir = None):\r
         self.Identification = Identification()\r
         self.Defines = DecDefines()\r
         self.UserExtensions = ''\r
@@ -55,8 +115,8 @@ class Dec(DecObject):
         self.WorkspaceDir = WorkspaceDir\r
         \r
         self.Contents = {}\r
-        for key in DataType.ARCH_LIST_FULL:\r
-            self.Contents[key] = DecContents()\r
+        for Arch in DataType.ARCH_LIST_FULL:\r
+            self.Contents[Arch] = DecContents()\r
         \r
         self.KeyList = [\r
             TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \\r
@@ -64,28 +124,56 @@ class Dec(DecObject):
             TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL\r
         ]\r
     \r
-        if filename != None:\r
-            self.LoadDecFile(filename)\r
-            \r
-        if isMergeAllArches:\r
+        #\r
+        # Load Dec file if filename is not None\r
+        #\r
+        if Filename != None:\r
+            self.LoadDecFile(Filename)\r
+        \r
+        #\r
+        # Merge contents of Dec from all arches if IsMergeAllArches is True\r
+        #\r
+        if IsMergeAllArches:\r
             self.MergeAllArches()\r
         \r
-        if isToPackage:\r
+        #\r
+        # Transfer to Package Object if IsToPackage is True\r
+        #\r
+        if IsToPackage:\r
             self.DecToPackage()\r
     \r
+    ## Parse Dec file\r
+    #\r
+    # Go through input lines one by one to find the value defined in Key section.\r
+    # Save them to KeyField\r
+    #\r
+    # @param Lines:     Lines need to be parsed\r
+    # @param Key:       The key value of the section to be located\r
+    # @param KeyField:  To save the found contents\r
+    #\r
     def ParseDec(self, Lines, Key, KeyField):\r
         newKey = SplitModuleType(Key)\r
         if newKey[0].upper().find(DataType.TAB_LIBRARY_CLASSES.upper()) != -1:\r
             GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
         else:\r
             GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-            \r
+\r
+    ## Merge contents of Dec from all arches\r
+    #\r
+    # Find the contents defined in all arches and merge them to all\r
+    #   \r
     def MergeAllArches(self):\r
-        for key in self.KeyList:\r
-            for arch in DataType.ARCH_LIST:\r
-                Command = "self.Contents[arch]." + key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ")"\r
+        for Key in self.KeyList:\r
+            for Arch in DataType.ARCH_LIST:\r
+                Command = "self.Contents[Arch]." + Key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + Key + ")"\r
                 eval(Command)\r
 \r
+    ## Load Dec file\r
+    #\r
+    # Load the file if it exists\r
+    #\r
+    # @param Filename:  Input value for filename of Dec file\r
+    #\r
     def LoadDecFile(self, Filename):\r
         (Filepath, Name) = os.path.split(Filename)\r
         self.Identification.FileName = Name\r
@@ -118,6 +206,10 @@ class Dec(DecObject):
                                 continue\r
         #EndFor\r
 \r
+    ## Transfer to Package Object\r
+    # \r
+    # Transfer all contents of a Dec file to a standard Package Object\r
+    #\r
     def DecToPackage(self):\r
         #\r
         # Get value for Header\r
@@ -256,9 +348,10 @@ class Dec(DecObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Package.PcdDeclarations.append(Pcd)\r
     \r
+    ## Get Pcd Values of Dec\r
     #\r
     # Get Pcd of Dec as <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
-    # Return (TokenSpcCName, TokenCName, Value, DatumType, Token, ItemType)\r
+    # @retval (TokenSpcCName, TokenCName, Value, DatumType, Token, ItemType) Formatted Pcd Item\r
     #\r
     def GetPcdOfDec(self, Item, Type, File):\r
         Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'\r
@@ -271,8 +364,9 @@ class Dec(DecObject):
         \r
         return (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], Type)\r
     \r
+    ## Show detailed information of Dec\r
     #\r
-    # Show detailed information of Dec\r
+    # Print all members and their values of Dec class\r
     #\r
     def ShowDec(self):\r
         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
@@ -285,38 +379,44 @@ class Dec(DecObject):
                                     "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
                 eval(Command)\r
     \r
+    ## Show detailed information of Package\r
     #\r
-    # Show detailed information of Package\r
+    # Print all members and their values of Package class\r
     #\r
     def ShowPackage(self):\r
-        m = self.Package\r
-        print 'Filename =', m.Header.FileName\r
-        print 'FullPath =', m.Header.FullPath\r
-        print 'BaseName =', m.Header.Name\r
-        print 'Guid =', m.Header.Guid\r
-        print 'Version =', m.Header.Version\r
-        print 'DecSpecification =', m.Header.DecSpecification\r
-        print '\nIncludes =', m.Includes\r
-        for Item in m.Includes:\r
+        M = self.Package\r
+        print 'Filename =', M.Header.FileName\r
+        print 'FullPath =', M.Header.FullPath\r
+        print 'BaseName =', M.Header.Name\r
+        print 'Guid =', M.Header.Guid\r
+        print 'Version =', M.Header.Version\r
+        print 'DecSpecification =', M.Header.DecSpecification\r
+        print '\nIncludes =', M.Includes\r
+        for Item in M.Includes:\r
             print Item.FilePath, Item.SupArchList\r
-        print '\nGuids =', m.GuidDeclarations\r
-        for Item in m.GuidDeclarations:\r
+        print '\nGuids =', M.GuidDeclarations\r
+        for Item in M.GuidDeclarations:\r
             print Item.CName, Item.Guid, Item.SupArchList\r
-        print '\nProtocols =', m.ProtocolDeclarations\r
-        for Item in m.ProtocolDeclarations:\r
+        print '\nProtocols =', M.ProtocolDeclarations\r
+        for Item in M.ProtocolDeclarations:\r
             print Item.CName, Item.Guid, Item.SupArchList\r
-        print '\nPpis =', m.PpiDeclarations\r
-        for Item in m.PpiDeclarations:\r
+        print '\nPpis =', M.PpiDeclarations\r
+        for Item in M.PpiDeclarations:\r
             print Item.CName, Item.Guid, Item.SupArchList\r
-        print '\nLibraryClasses =', m.LibraryClassDeclarations\r
-        for Item in m.LibraryClassDeclarations:\r
+        print '\nLibraryClasses =', M.LibraryClassDeclarations\r
+        for Item in M.LibraryClassDeclarations:\r
             print Item.LibraryClass, Item.RecommendedInstance, Item.SupModuleList, Item.SupArchList\r
-        print '\nPcds =', m.PcdDeclarations\r
-        for Item in m.PcdDeclarations:\r
+        print '\nPcds =', M.PcdDeclarations\r
+        for Item in M.PcdDeclarations:\r
             print 'CName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, 'Token=', Item.Token, 'DatumType=', Item.DatumType, Item.SupArchList\r
 \r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-    w = os.getenv('WORKSPACE')\r
-    f = os.path.join(w, 'Nt32Pkg/Nt32Pkg.dec')\r
-    p = Dec(os.path.normpath(f), True, True, w)\r
-    p.ShowPackage()\r
+    W = os.getenv('WORKSPACE')\r
+    F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
+    P = Dec(os.path.normpath(F), True, True, W)\r
+    P.ShowPackage()\r
index 3702b13..3c968f5 100755 (executable)
@@ -1,15 +1,34 @@
+## @file\r
+# Define a dictionary structure\r
+#\r
+# Copyright (c) 2007, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+##\r
+# Import Modules\r
+#\r
 import EdkLogger\r
 from DataType import *\r
 \r
+## Convert a text file to a dictionary\r
+#\r
+# Convert a text file to a dictionary of (name:value) pairs.\r
 #\r
-# Convert a text file to a dictionary\r
+# @retval 0  Convert successful\r
+# @retval 1  Open file failed\r
 #\r
 def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
-  """Convert a text file to a dictionary of (name:value) pairs."""\r
   try:\r
-      f = open(FileName,'r')\r
+      F = open(FileName,'r')\r
       Keys = []\r
-      for Line in f:\r
+      for Line in F:\r
         if Line.startswith(CommentCharacter):\r
           continue\r
         LineList = Line.split(KeySplitCharacter,1)\r
@@ -21,25 +40,36 @@ def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplit
             else:\r
               Dictionary[Key[0]] = LineList[1].strip().replace('\\','/')\r
             Keys += [Key[0]]\r
-      f.close()\r
+      F.close()\r
       return 0\r
   except:\r
       EdkLogger.info('Open file failed')\r
       return 1\r
 \r
-def printDict(dict):\r
-  if dict != None:\r
-    KeyList = dict.keys()\r
+## Print the dictionary\r
+#\r
+# Print all items of dictionary one by one\r
+#\r
+# @param Dict:  The dictionary to be printed\r
+#\r
+def printDict(Dict):\r
+  if Dict != None:\r
+    KeyList = Dict.keys()\r
     for Key in KeyList:\r
-      if dict[Key] != '':\r
-        print Key + ' = ' + str(dict[Key])\r
+      if Dict[Key] != '':\r
+        print Key + ' = ' + str(Dict[Key])\r
 \r
-def printList(key, list):\r
-  if type(list) == type([]):\r
-      if len(list) > 0:\r
+## Print the dictionary\r
+#\r
+# Print the items of dictionary which matched with input key\r
+#\r
+# @param list:  The dictionary to be printed\r
+# @param key:   The key of the item to be printed\r
+#\r
+def printList(Key, List):\r
+  if type(List) == type([]):\r
+      if len(List) > 0:\r
         if key.find(TAB_SPLIT) != -1:\r
-          print "\n" + key\r
-          for i in list:\r
-            print i\r
-    \r
-      \r
+          print "\n" + Key\r
+          for Item in List:\r
+            print Item\r
index b8b0345..01f095c 100755 (executable)
@@ -1,16 +1,19 @@
+## @file\r
+# This file is used to define each component of DSC file\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-#\r
-#This file is used to define each component of DSC file\r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import os\r
 import EdkLogger\r
 from String import *\r
@@ -22,14 +25,30 @@ from CommonDataClass.CommonClass import SkuInfoClass
 from BuildToolError import *\r
 from Misc import sdict\r
 \r
+## DscObject\r
+#\r
+# This class defined basic Dsc object which is used by inheriting\r
+# \r
+# @param object:       Inherited from object class\r
+#\r
 class DscObject(object):\r
     def __init__(self):\r
         object.__init__()\r
 \r
+## DscDefines\r
+#\r
+# This class defined basic Defines used in Dsc object\r
+# \r
+# @param DscDefines:       Inherited from DscDefines class\r
+#\r
+# @var DefinesDictionary:  To store value for DefinesDictionary \r
+#\r
 class DscDefines(DscObject):\r
     def __init__(self):\r
         self.DefinesDictionary = {\r
-            #Req\r
+            #\r
+            # Required Fields\r
+            #\r
             TAB_DSC_DEFINES_PLATFORM_NAME                         : [''],\r
             TAB_DSC_DEFINES_PLATFORM_GUID                         : [''],\r
             TAB_DSC_DEFINES_PLATFORM_VERSION                      : [''],\r
@@ -46,15 +65,45 @@ class DscDefines(DscObject):
             TAB_DSC_DEFINES_DEFINE                                : ['']\r
         }\r
 \r
+## DscSkuId\r
+#\r
+# This class defined SkuId used in Dsc object\r
+# \r
+# @param DscObject:  Inherited from DscObject class\r
+#\r
+# @var SkuId:        To store value for SkuId, it is a set structure as\r
+#                    { [skuid : skuname], [skuid : skuname], ...}\r
+#\r
 class DscSkuId(DscObject):\r
     def __init__(self):\r
-        self.SkuId = {}         #{ [skuid : skuname], [skuid : skuname], ...}\r
+        self.SkuId = {}\r
 \r
+## DscContents\r
+#\r
+# This class defined basic Contents used in Dsc object\r
+# \r
+# @param DscObject:   Inherited from DscObject class\r
+#\r
+# @var SkuIds:                 To store value for SkuIds\r
+# @var Libraries:              To store value for Libraries\r
+# @var Components:             To store value for Components, it is a list structure as\r
+#                              [['component name', [lib1, lib2, lib3], [bo1, bo2, bo3]], ...]\r
+# @var LibraryClasses:         To store value for LibraryClasses\r
+# @var PcdsFixedAtBuild:       To store value for PcdsFixedAtBuild\r
+# @var PcdsPatchableInModule:  To store value for PcdsPatchableInModule\r
+# @var PcdsFeatureFlag:        To store value for PcdsFeatureFlag\r
+# @var PcdsDynamicDefault:     To store value for PcdsDynamicDefault\r
+# @var PcdsDynamicVpd:         To store value for PcdsDynamicVpd\r
+# @var PcdsDynamicHii:         To store value for PcdsDynamicHii\r
+# @var PcdsDynamicExDefault:   To store value for PcdsDynamicExDefault\r
+# @var PcdsDynamicExVpd:       To store value for PcdsDynamicExVpd\r
+# @var PcdsDynamicExHii:       To store value for PcdsDynamicExHii\r
+#\r
 class DscContents(DscObject):\r
     def __init__(self):\r
         self.SkuIds = []\r
         self.Libraries = []\r
-        self.Components = []                #[['component name', [lib1, lib2, lib3], [bo1, bo2, bo3]], ...]\r
+        self.Components = []\r
         self.LibraryClasses = []\r
         self.PcdsFixedAtBuild = []\r
         self.PcdsPatchableInModule = []\r
@@ -67,6 +116,31 @@ class DscContents(DscObject):
         self.PcdsDynamicExHii = []\r
         self.BuildOptions = []\r
 \r
+## Dsc\r
+#\r
+# This class defined the structure used in Dsc object\r
+# \r
+# @param DscObject:         Inherited from InfObject class\r
+# @param Ffilename:         Input value for Ffilename of Inf file, default is None\r
+# @param IsMergeAllArches:  Input value for IsMergeAllArches\r
+#                           True is to merge all arches\r
+#                           Fales is not to merge all arches\r
+#                           default is False\r
+# @param IsToPlatform:      Input value for IsToPlatform\r
+#                           True is to transfer to ModuleObject automatically\r
+#                           False is not to transfer to ModuleObject automatically\r
+#                           default is False\r
+# @param WorkspaceDir:      Input value for current workspace directory, default is None\r
+#\r
+# @var _NullClassIndex:     To store value for _NullClassIndex, default is 0\r
+# @var Identification:      To store value for Identification, it is a structure as Identification\r
+# @var Defines:             To store value for Defines, it is a structure as DscDefines\r
+# @var Contents:            To store value for Contents, it is a structure as DscContents\r
+# @var UserExtensions:      To store value for UserExtensions\r
+# @var Platform:            To store value for Platform, it is a structure as PlatformClass\r
+# @var WorkspaceDir:        To store value for WorkspaceDir\r
+# @var KeyList:             To store value for KeyList, a list for all Keys used in Dec\r
+#\r
 class Dsc(DscObject):\r
     _NullClassIndex = 0\r
 \r
@@ -89,15 +163,33 @@ class Dsc(DscObject):
             TAB_COMPONENTS\r
         ]\r
 \r
+        #\r
+        # Load Dsc file if filename is not None\r
+        #\r
         if Filename != None:\r
             self.LoadDscFile(Filename)\r
 \r
+        #\r
+        # Merge contents of Dsc from all arches if IsMergeAllArches is True\r
+        #\r
         if IsMergeAllArches:\r
             self.MergeAllArches()\r
 \r
+        #\r
+        # Transfer to Platform Object if IsToPlatform is True\r
+        #\r
         if IsToPlatform:\r
             self.DscToPlatform()\r
 \r
+    ## Parse Dsc file\r
+    #\r
+    # Go through input lines one by one to find the value defined in Key section.\r
+    # Save them to KeyField\r
+    #\r
+    # @param Lines:     Lines need to be parsed\r
+    # @param Key:       The key value of the section to be located\r
+    # @param KeyField:  To save the found contents\r
+    #\r
     def ParseDsc(self, Lines, Key, KeyField):\r
         newKey = SplitModuleType(Key)\r
         if newKey[0].upper().find(TAB_LIBRARY_CLASSES.upper()) != -1:\r
@@ -109,12 +201,22 @@ class Dsc(DscObject):
         else:\r
             GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
 \r
+    ## Merge contents of Dsc from all arches\r
+    #\r
+    # Find the contents defined in all arches and merge them to all\r
+    #\r
     def MergeAllArches(self):\r
-        for key in self.KeyList:\r
-            for arch in DataType.ARCH_LIST:\r
-                Command = "self.Contents[arch]." + key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ")"\r
+        for Key in self.KeyList:\r
+            for Arch in DataType.ARCH_LIST:\r
+                Command = "self.Contents[Arch]." + Key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + Key + ")"\r
                 eval(Command)\r
 \r
+    ## Load Dsc file\r
+    #\r
+    # Load the file if it exists\r
+    #\r
+    # @param Filename:  Input value for filename of Dsc file\r
+    #\r
     def LoadDscFile(self, Filename):\r
         (Filepath, Name) = os.path.split(Filename)\r
         self.Identification.FileName = Name\r
@@ -146,6 +248,10 @@ class Dsc(DscObject):
                                 eval(Command)\r
                                 continue\r
 \r
+    ## Transfer to Platform Object\r
+    # \r
+    # Transfer all contents of an Inf file to a standard Module Object\r
+    #\r
     def DscToPlatform(self):\r
         #\r
         # Get value for Header\r
@@ -246,11 +352,20 @@ class Dsc(DscObject):
                         MergeArches(Libraries, Item, Arch)\r
                     continue\r
                 Status = GenDefines(Item, Arch, Defines)\r
-                if Status == 0:       # Find DEFINE statement\r
+                #\r
+                # Find DEFINE statement\r
+                #\r
+                if Status == 0:\r
                     pass\r
-                elif Status == -1:    # Find DEFINE statement but in wrong format\r
+                #\r
+                # Find DEFINE statement but in wrong format\r
+                #\r
+                elif Status == -1:\r
                     RaiseParserError(Item, 'Libraries', File, 'DEFINE <VarName> = <PATH>')\r
-                elif Status == 1:     # Not find DEFINE statement\r
+                #\r
+                # Not find DEFINE statement\r
+                #\r
+                elif Status == 1:\r
                     MergeArches(Libraries, Item, Arch)\r
         self.Platform.Libraries.IncludeFiles = IncludeFiles\r
         for Key in Libraries.keys():\r
@@ -277,11 +392,20 @@ class Dsc(DscObject):
                         MergeArches(LibraryClasses, self.GenLibraryClass([NewItem, Item[1]], IncludeFilePath), Arch)\r
                     continue\r
                 Status = GenDefines(Item[0], Arch, Defines)\r
-                if Status == 0:       # Find DEFINE statement\r
+                #\r
+                # Find DEFINE statement\r
+                #\r
+                if Status == 0:\r
                     pass\r
-                elif Status == -1:    # Find DEFINE statement but in wrong format\r
+                #\r
+                # Find DEFINE statement but in wrong format\r
+                #\r
+                elif Status == -1:\r
                     RaiseParserError(Item[0], 'LibraryClasses', File, 'DEFINE <VarName> = <PATH>')\r
-                elif Status == 1:     # Not find DEFINE statement\r
+                #\r
+                # Not find DEFINE statement\r
+                #\r
+                elif Status == 1:\r
                     MergeArches(LibraryClasses, self.GenLibraryClass(Item, self.Platform.Header.FullPath), Arch)\r
         self.Platform.LibraryClasses.IncludeFiles = IncludeFiles\r
         for Key in LibraryClasses.keys():\r
@@ -293,7 +417,9 @@ class Dsc(DscObject):
             Library.SupArchList = LibraryClasses[Key]\r
             self.Platform.LibraryClasses.LibraryList.append(Library)\r
 \r
-        #Pcds\r
+        #\r
+        # Pcds\r
+        #\r
         self.GenPcds(DataType.TAB_PCDS_FIXED_AT_BUILD, File)\r
         self.GenPcds(DataType.TAB_PCDS_PATCHABLE_IN_MODULE, File)\r
         self.GenFeatureFlagPcds(DataType.TAB_PCDS_FEATURE_FLAG, File)\r
@@ -304,7 +430,9 @@ class Dsc(DscObject):
         self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_VPD, File)\r
         self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_EX_VPD, File)\r
 \r
-        #Components\r
+        #\r
+        # Components\r
+        #\r
         Components = sdict()\r
         IncludeFiles = {}\r
         Defines = {}\r
@@ -320,11 +448,20 @@ class Dsc(DscObject):
                         MergeArches(Components, self.GenComponent(NewItem, IncludeFilePath), Arch)\r
                     continue\r
                 Status = GenDefines(Item[0], Arch, Defines)\r
-                if Status == 0:       # Find DEFINE statement\r
+                #\r
+                # Find DEFINE statement\r
+                #\r
+                if Status == 0:\r
                     pass\r
-                elif Status == -1:    # Find DEFINE statement but in wrong format\r
+                #\r
+                # Find DEFINE statement but in wrong format\r
+                #\r
+                elif Status == -1:\r
                     RaiseParserError(Item[0], 'Components', File, 'DEFINE <VarName> = <PATH>')\r
-                elif Status == 1:     # Not find DEFINE statement\r
+                #\r
+                # Not find DEFINE statement\r
+                #\r
+                elif Status == 1:\r
                     MergeArches(Components, self.GenComponent(Item, self.Platform.Header.FullPath), Arch)\r
         self.Platform.Modules.IncludeFiles = IncludeFiles\r
         for Key in Components.keys():\r
@@ -334,8 +471,14 @@ class Dsc(DscObject):
 \r
     #End of DscToPlatform\r
 \r
+    ## Get Library Class\r
     #\r
-    # Gen Library Class\r
+    # Get Library of Dsc as <LibraryClassKeyWord>|<LibraryInstance>\r
+    # \r
+    # @param Item:           String as <LibraryClassKeyWord>|<LibraryInstance>\r
+    # @param ContainerFile:  The file which describes the library class, used for error report\r
+    #\r
+    # @retval (LibraryClassKeyWord, LibraryInstance, [SUP_MODULE_LIST]) Formatted Library Item\r
     #\r
     def GenLibraryClass(self, Item, ContainerFile):\r
         List = GetSplitValueList(Item[0])\r
@@ -348,8 +491,14 @@ class Dsc(DscObject):
                 Item[1] = DataType.SUP_MODULE_LIST\r
         return (List[0], List[1]) + tuple(Item[1])\r
 \r
+    ## Get Component \r
+    #\r
+    # Get Component section defined in Dsc file\r
+    #\r
+    # @param Item:           Contents includes a component block\r
+    # @param ContainerFile:  The file which describes the library class, used for error report\r
     #\r
-    # Gen Component\r
+    # @retval PlatformModuleClass() A instance for PlatformModuleClass\r
     #\r
     def GenComponent(self, Item, ContainerFile):\r
         (InfFilename, ExecFilename) = GetExec(Item[0])\r
@@ -416,9 +565,12 @@ class Dsc(DscObject):
         return Component\r
     #End of GenComponent\r
 \r
+    ## Gen FeatureFlagPcds\r
     #\r
-    # Gen FeatureFlagPcds\r
-    # <PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE\r
+    # Gen FeatureFlagPcds of Dsc file as <PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE\r
+    #\r
+    # @param Type:           The type of Pcd\r
+    # @param ContainerFile:  The file which describes the pcd, used for error report\r
     #\r
     def GenFeatureFlagPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
@@ -442,9 +594,12 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
 \r
+    ## Gen Pcds\r
+    #\r
+    # Gen Pcd of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<Type>|<MaximumDatumSize>]\r
     #\r
-    # Gen Pcds\r
-    # <PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<Type>|<MaximumDatumSize>]\r
+    # @param Type:           The type of Pcd\r
+    # @param ContainerFile:  The file which describes the pcd, used for error report\r
     #\r
     def GenPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
@@ -470,8 +625,21 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
 \r
+    ## Gen SkuInfoList\r
+    #\r
+    # Gen SkuInfoList section defined in Dsc file\r
     #\r
-    # Gen SkuInfoList\r
+    # @param SkuNameList:      Input value for SkuNameList\r
+    # @param SkuInfo:          Input value for SkuInfo\r
+    # @param VariableName:     Input value for VariableName\r
+    # @param VariableGuid:     Input value for VariableGuid\r
+    # @param VariableOffset:   Input value for VariableOffset\r
+    # @param HiiDefaultValue:  Input value for HiiDefaultValue\r
+    # @param VpdOffset:        Input value for VpdOffset\r
+    # @param DefaultValue:     Input value for DefaultValue\r
+    #\r
+    # @retval (False, SkuName)     Not found in section SkuId Dsc file\r
+    # @retval (True, SkuInfoList)  Found in section SkuId of Dsc file\r
     #\r
     def GenSkuInfoList(self, SkuNameList, SkuInfo, VariableName = '', VariableGuid = '', VariableOffset = '', HiiDefaultValue = '', VpdOffset = '', DefaultValue = ''):\r
         if SkuNameList == None or SkuNameList == [] or SkuNameList == ['']:\r
@@ -485,9 +653,12 @@ class Dsc(DscObject):
 \r
         return True, SkuInfoList\r
 \r
+    ## Gen DynamicDefaultPcds\r
+    #\r
+    # Gen DynamicDefaultPcds of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<DatumTyp>[|<MaxDatumSize>]]\r
     #\r
-    # Gen DynamicDefaultPcds\r
-    # <PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<DatumTyp>[|<MaxDatumSize>]]\r
+    # @param Type:           The type of Pcd\r
+    # @param ContainerFile:  The file which describes the pcd, used for error report\r
     #\r
     def GenDynamicDefaultPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
@@ -518,9 +689,12 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
 \r
+    ## Gen DynamicHiiPcds\r
+    #\r
+    # Gen DynamicHiiPcds of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|<String>|<VariableGuidCName>|<VariableOffset>[|<DefaultValue>[|<MaximumDatumSize>]]\r
     #\r
-    # Gen DynamicHiiPcds\r
-    # <PcdTokenSpaceGuidCName>.<TokenCName>|<String>|<VariableGuidCName>|<VariableOffset>[|<DefaultValue>[|<MaximumDatumSize>]]\r
+    # @param Type:           The type of Pcd\r
+    # @param ContainerFile:  The file which describes the pcd, used for error report\r
     #\r
     def GenDynamicHiiPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
@@ -551,9 +725,12 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
 \r
+    ## Gen DynamicVpdPcds\r
     #\r
-    # Gen DynamicVpdPcds\r
-    # <PcdTokenSpaceGuidCName>.<TokenCName>|<VpdOffset>[|<MaximumDatumSize>]\r
+    # Gen DynamicVpdPcds of Dsc as <PcdTokenSpaceGuidCName>.<TokenCName>|<VpdOffset>[|<MaximumDatumSize>]\r
+    #\r
+    # @param Type:           The type of Pcd\r
+    # @param ContainerFile:  The file which describes the pcd, used for error report\r
     #\r
     def GenDynamicVpdPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
@@ -584,58 +761,60 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
 \r
+    ## Show detailed information of Dsc\r
     #\r
-    # Show detailed information of Dsc\r
+    # Print all members and their values of Dsc class\r
     #\r
     def ShowDsc(self):\r
         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
         printDict(self.Defines.DefinesDictionary)\r
 \r
-        for key in self.KeyList:\r
-            for arch in DataType.ARCH_LIST_FULL:\r
+        for Key in self.KeyList:\r
+            for Arch in DataType.ARCH_LIST_FULL:\r
                 Command = "printList(TAB_SECTION_START + '" + \\r
-                                    key + DataType.TAB_SPLIT + arch + \\r
-                                    "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
+                                    Key + DataType.TAB_SPLIT + Arch + \\r
+                                    "' + TAB_SECTION_END, self.Contents[arch]." + Key + ')'\r
                 eval(Command)\r
 \r
+    ## Show detailed information of Platform\r
     #\r
-    # Show detailed information of Platform\r
+    # Print all members and their values of Platform class\r
     #\r
     def ShowPlatform(self):\r
-        m = self.Platform\r
-        print 'Filename =', m.Header.FileName\r
-        print 'FullPath =', m.Header.FullPath\r
-        print 'BaseName =', m.Header.Name\r
-        print 'Guid =', m.Header.Guid\r
-        print 'Version =', m.Header.Version\r
-        print 'DscSpecification =', m.Header.DscSpecification\r
-        print 'SkuId =', m.Header.SkuIdName\r
-        print 'SupArchList =', m.Header.SupArchList\r
-        print 'BuildTargets =', m.Header.BuildTargets\r
-        print 'OutputDirectory =', m.Header.OutputDirectory\r
-        print 'BuildNumber =', m.Header.BuildNumber\r
-        print 'MakefileName =', m.Header.MakefileName\r
-        print 'Fdf =', m.FlashDefinitionFile.FilePath\r
-        print 'BsBaseAddress =', m.Header.BsBaseAddress\r
-        print 'RtBaseAddress =', m.Header.RtBaseAddress\r
-        print 'Define =', m.Header.Define\r
-        print '\nBuildOptions =', m.BuildOptions, m.BuildOptions.IncludeFiles\r
-        for Item in m.BuildOptions.BuildOptionList:\r
+        M = self.Platform\r
+        print 'Filename =', M.Header.FileName\r
+        print 'FullPath =', M.Header.FullPath\r
+        print 'BaseName =', M.Header.Name\r
+        print 'Guid =', M.Header.Guid\r
+        print 'Version =', M.Header.Version\r
+        print 'DscSpecification =', M.Header.DscSpecification\r
+        print 'SkuId =', M.Header.SkuIdName\r
+        print 'SupArchList =', M.Header.SupArchList\r
+        print 'BuildTargets =', M.Header.BuildTargets\r
+        print 'OutputDirectory =', M.Header.OutputDirectory\r
+        print 'BuildNumber =', M.Header.BuildNumber\r
+        print 'MakefileName =', M.Header.MakefileName\r
+        print 'Fdf =', M.FlashDefinitionFile.FilePath\r
+        print 'BsBaseAddress =', M.Header.BsBaseAddress\r
+        print 'RtBaseAddress =', M.Header.RtBaseAddress\r
+        print 'Define =', M.Header.Define\r
+        print '\nBuildOptions =', M.BuildOptions, M.BuildOptions.IncludeFiles\r
+        for Item in M.BuildOptions.BuildOptionList:\r
             print '\t', Item.ToolChainFamily, Item.ToolChain, Item.Option, Item.SupArchList\r
-        print '\nSkuIds =', m.SkuInfos.SkuInfoList, m.SkuInfos.IncludeFiles\r
-        print '\nLibraries =', m.Libraries, m.Libraries.IncludeFiles\r
-        for Item in m.Libraries.LibraryList:\r
+        print '\nSkuIds =', M.SkuInfos.SkuInfoList, M.SkuInfos.IncludeFiles\r
+        print '\nLibraries =', M.Libraries, M.Libraries.IncludeFiles\r
+        for Item in M.Libraries.LibraryList:\r
             print '\t', Item.FilePath, Item.SupArchList, Item.Define\r
-        print '\nLibraryClasses =', m.LibraryClasses, m.LibraryClasses.IncludeFiles\r
-        for Item in m.LibraryClasses.LibraryList:\r
+        print '\nLibraryClasses =', M.LibraryClasses, M.LibraryClasses.IncludeFiles\r
+        for Item in M.LibraryClasses.LibraryList:\r
             print '\t', Item.Name, Item.FilePath, Item.SupModuleList, Item.SupArchList, Item.Define\r
-        print '\nPcds =', m.DynamicPcdBuildDefinitions\r
-        for Item in m.DynamicPcdBuildDefinitions:\r
+        print '\nPcds =', M.DynamicPcdBuildDefinitions\r
+        for Item in M.DynamicPcdBuildDefinitions:\r
             print '\tCname=', Item.CName, 'TSG=', Item.TokenSpaceGuidCName, 'Value=', Item.DefaultValue, 'Token=', Item.Token, 'Type=', Item.ItemType, 'Datum=', Item.DatumType, 'Size=', Item.MaxDatumSize, 'Arch=', Item.SupArchList, Item.SkuInfoList\r
             for Sku in Item.SkuInfoList.values():\r
                 print '\t\t', str(Sku)\r
-        print '\nComponents =', m.Modules.ModuleList, m.Modules.IncludeFiles\r
-        for Item in m.Modules.ModuleList:\r
+        print '\nComponents =', M.Modules.ModuleList, M.Modules.IncludeFiles\r
+        for Item in M.Modules.ModuleList:\r
             print '\t', Item.FilePath, Item.ExecFilePath, Item.SupArchList\r
             for Lib in Item.LibraryClasses.LibraryList:\r
                 print '\t\tLib:', Lib.Name, Lib.FilePath\r
@@ -644,8 +823,13 @@ class Dsc(DscObject):
             for Pcd in Item.PcdBuildDefinitions:\r
                 print '\t\tPcd:', Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.MaxDatumSize, Pcd.DefaultValue, Pcd.ItemType\r
 \r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-    w = os.getenv('WORKSPACE')\r
-    f = os.path.join(w, 'Nt32Pkg/Nt32Pkg.dsc')\r
-    p = Dsc(os.path.normpath(f), True, True, w)\r
-    p.ShowPlatform()\r
+    W = os.getenv('WORKSPACE')\r
+    F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dsc')\r
+    P = Dsc(os.path.normpath(F), True, True, W)\r
+    P.ShowPlatform()\r
index c0062c7..a494e81 100755 (executable)
@@ -1,28 +1,41 @@
+## @file\r
+# This is the base class for applications that operate on an EDK II Workspace \r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-#\r
-# This is the base class for applications that operate on an EDK II Workspace \r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import os, sys, time\r
 from DataType import *\r
 \r
+## EdkIIWorkspace\r
+#\r
+# Collect WorkspaceDir from the environment, the Verbose command line flag, and detect an icon bitmap file.\r
+# \r
+# @var StartTime:       Time of build system starting\r
+# @var PrintRunTime:    Printable time of build system running\r
+# @var PrintRunStatus:  Printable status of build system running\r
+# @var RunStatus:       Status of build system running\r
+#\r
 class EdkIIWorkspace:\r
     def __init__(self):\r
-        """Collect WorkspaceDir from the environment, the Verbose command line flag, and detect an icon bitmap file."""\r
-\r
         self.StartTime = time.time()\r
-        self.PrintRunTime     = False\r
+        self.PrintRunTime = False\r
         self.PrintRunStatus = False\r
-        self.RunStatus            = ''\r
+        self.RunStatus = ''\r
         \r
+        #\r
+        # Check environment valiable 'WORKSPACE'\r
+        #\r
         if os.environ.get('WORKSPACE') == None:\r
             print 'ERROR: WORKSPACE not defined.    Please run EdkSetup from the EDK II install directory.'\r
             return False\r
@@ -41,17 +54,22 @@ class EdkIIWorkspace:
         self.WorkspaceRelativeWorkingDir = self.WorkspaceRelativePath (self.CurrentWorkingDir)\r
             \r
         try:\r
+            #\r
+            # Load TianoCoreOrgLogo, used for GUI tool\r
+            #\r
             self.Icon = wx.Icon(self.WorkspaceFile('tools/Python/TianoCoreOrgLogo.gif'),wx.BITMAP_TYPE_GIF)\r
         except:\r
             self.Icon = None\r
             \r
         self.Verbose = False\r
-        for arg in sys.argv:\r
-            if arg.lower() == '-v':\r
-                self.Verbose = True            \r
-\r
-        #return True\r
-\r
+        for Arg in sys.argv:\r
+            if Arg.lower() == '-v':\r
+                self.Verbose = True\r
+    \r
+    ## Close build system\r
+    #\r
+    # Close build system and print running time and status\r
+    #\r
     def Close(self):\r
         if self.PrintRunTime:\r
             Seconds = int(time.time() - self.StartTime)\r
@@ -68,63 +86,142 @@ class EdkIIWorkspace:
                     print 'Run Time: %d hours %d minutes %d seconds' % (Hours, Minutes, Seconds)\r
         if self.RunStatus != '':\r
             print self.RunStatus\r
-        \r
+\r
+    ## Convert to a workspace relative filename\r
+    #\r
+    # Convert a full path filename to a workspace relative filename.\r
+    #\r
+    # @param FileName:  The filename to be Converted\r
+    #\r
+    # @retval None    Workspace dir is not found in the full path\r
+    # @retval string  The relative filename\r
+    #\r
     def WorkspaceRelativePath(self, FileName):\r
-        """Convert a full path filename to a workspace relative filename."""\r
         FileName = os.path.realpath(FileName)\r
         if FileName.find(self.WorkspaceDir) != 0:\r
             return None\r
         return FileName.replace (self.WorkspaceDir, '').strip('\\').strip('/')\r
 \r
+    ## Convert to a full path filename\r
+    #\r
+    # Convert a workspace relative filename to a full path filename.\r
+    #\r
+    # @param FileName:  The filename to be Converted\r
+    #\r
+    # @retval string  The full path filename\r
+    #\r
     def WorkspaceFile(self, FileName):\r
-        """Convert a workspace relative filename to a full path filename."""\r
         return os.path.realpath(os.path.join(self.WorkspaceDir,FileName))\r
 \r
+    ## Convert to a real path filename\r
+    #\r
+    # Convert ${WORKSPACE} to real path\r
+    #\r
+    # @param FileName:  The filename to be Converted\r
+    #\r
+    # @retval string  The full path filename\r
+    #\r
     def WorkspacePathConvert(self, FileName):\r
-        """Convert ${WORKSPACE} to real path"""\r
         return os.path.realpath(FileName.replace(TAB_WORKSPACE, self.WorkspaceDir))\r
-        \r
+\r
+    ## Convert XML into a DOM\r
+    #\r
+    # Parse an XML file into a DOM and return the DOM.\r
+    #\r
+    # @param FileName:  The filename to be parsed\r
+    #\r
+    # @retval XmlParseFile (self.WorkspaceFile(FileName))\r
+    #\r
     def XmlParseFile (self, FileName):\r
-        """Parse an XML file into a DOM and return the DOM."""\r
         if self.Verbose:\r
             print FileName\r
         return XmlParseFile (self.WorkspaceFile(FileName))\r
-        \r
+\r
+    ## Convert a XML section\r
+    #\r
+    # Parse a section of an XML file into a DOM(Document Object Model) and return the DOM.\r
+    #\r
+    # @param FileName:    The filename to be parsed\r
+    # @param SectionTag:  The tag name of the section to be parsed\r
+    #\r
+    # @retval XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag)\r
+    #\r
     def XmlParseFileSection (self, FileName, SectionTag):\r
-        """Parse a section of an XML file into a DOM(Document Object Model) and return the DOM."""\r
         if self.Verbose:\r
             print FileName\r
         return XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag)        \r
 \r
+    ## Save a XML file\r
+    #\r
+    # Save a DOM(Document Object Model) into an XML file.\r
+    #\r
+    # @param Dom:       The Dom to be saved\r
+    # @param FileName:  The filename\r
+    #\r
+    # @retval XmlSaveFile (Dom, self.WorkspaceFile(FileName))\r
+    #\r
     def XmlSaveFile (self, Dom, FileName):\r
-        """Save a DOM(Document Object Model) into an XML file."""\r
         if self.Verbose:\r
             print FileName\r
         return XmlSaveFile (Dom, self.WorkspaceFile(FileName))\r
 \r
+    ## Convert Text File To Dictionary\r
+    #\r
+    # Convert a workspace relative text file to a dictionary of (name:value) pairs.\r
+    #\r
+    # @param FileName:             Text filename\r
+    # @param Dictionary:           Dictionary to store data\r
+    # @param CommentCharacter:     Comment char, be used to ignore comment content\r
+    # @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
+    # @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values\r
+    # @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
+    #\r
+    # @retval ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
+    #\r
     def ConvertTextFileToDictionary(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
-        """Convert a workspace relative text file to a dictionary of (name:value) pairs."""\r
         if self.Verbose:\r
             print FileName\r
         return ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
-    \r
+\r
+    ## Convert Dictionary To Text File\r
+    #\r
+    # Convert a dictionary of (name:value) pairs to a workspace relative text file.\r
+    #\r
+    # @param FileName:             Text filename\r
+    # @param Dictionary:           Dictionary to store data\r
+    # @param CommentCharacter:     Comment char, be used to ignore comment content\r
+    # @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
+    # @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values\r
+    # @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
+    #\r
+    # @retval ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
+    #\r
     def ConvertDictionaryToTextFile(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
-        """Convert a dictionary of (name:value) pairs to a workspace relative text file."""\r
         if self.Verbose:\r
             print FileName\r
         return ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter)\r
 \r
+## Convert Text File To Dictionary\r
+#\r
+# Convert a text file to a dictionary of (name:value) pairs.\r
+#\r
+# @param FileName:             Text filename\r
+# @param Dictionary:           Dictionary to store data\r
+# @param CommentCharacter:     Comment char, be used to ignore comment content\r
+# @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
+# @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values\r
+# @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
 #\r
-# Convert a text file to a dictionary\r
+# @retval True  Convert successfully\r
+# @retval False Open file failed\r
 #\r
 def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
-    """Convert a text file to a dictionary of (name:value) pairs."""\r
     try:\r
-        f = open(FileName,'r')\r
+        F = open(FileName,'r')\r
     except:\r
         return False\r
     Keys = []\r
-    for Line in f:\r
+    for Line in F:\r
         LineList = Line.split(KeySplitCharacter,1)\r
         if len(LineList) >= 2:\r
             Key = LineList[0].split()\r
@@ -134,16 +231,29 @@ def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplit
                 else:\r
                     Dictionary[Key[0]] = LineList[1].strip().replace('\\','/')\r
                 Keys += [Key[0]]\r
-    f.close()\r
+    F.close()\r
     return True\r
 \r
+## Convert Dictionary To Text File\r
+#\r
+# Convert a dictionary of (name:value) pairs to a text file.\r
+#\r
+# @param FileName:             Text filename\r
+# @param Dictionary:           Dictionary to store data\r
+# @param CommentCharacter:     Comment char, be used to ignore comment content\r
+# @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
+# @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values\r
+# @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
+#\r
+# @retval True  Convert successfully\r
+# @retval False Open file failed\r
+#\r
 def ConvertDictionaryToTextFile(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
-    """Convert a dictionary of (name:value) pairs to a text file."""\r
     try:\r
-        f = open(FileName,'r')\r
+        F = open(FileName,'r')\r
         Lines = []\r
-        Lines = f.readlines()\r
-        f.close()\r
+        Lines = F.readlines()\r
+        F.close()\r
     except:\r
         Lines = []\r
     Keys = Dictionary.keys()\r
@@ -173,23 +283,36 @@ def ConvertDictionaryToTextFile(FileName, Dictionary, CommentCharacter, KeySplit
             Line = '%-*s %c %s\n' % (MaxLength, RemainingKey, KeySplitCharacter, Dictionary[RemainingKey])\r
         Lines.append(Line)\r
     try:\r
-        f = open(FileName,'w')\r
+        F = open(FileName,'w')\r
     except:\r
         return False\r
-    f.writelines(Lines)\r
-    f.close()\r
+    F.writelines(Lines)\r
+    F.close()\r
     return True\r
 \r
+## Create a new directory\r
+#\r
+# @param Directory:           Directory to be created\r
+#\r
 def CreateDirectory(Directory):\r
     if not os.access(Directory, os.F_OK):\r
         os.makedirs (Directory)\r
-    \r
-def CreateFile(Directory, FileName, mode='w'):\r
+\r
+## Create a new file\r
+#\r
+# @param Directory:  Directory to be created\r
+# @param FileName:   Filename to be created\r
+# @param Mode:       The mode of open file, defautl is 'w'\r
+#\r
+def CreateFile(Directory, FileName, Mode='w'):\r
     CreateDirectory (Directory)\r
-    return open(os.path.join(Directory, FileName), mode)\r
+    return open(os.path.join(Directory, FileName), Mode)\r
 \r
+##\r
+#\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
 # script.\r
+#\r
 if __name__ == '__main__':\r
     # Nothing to do here. Could do some unit tests\r
     pass
\ No newline at end of file
index 48310b0..aea53f4 100755 (executable)
@@ -1,17 +1,17 @@
+## @file\r
+# This file is used to define each component of the build database\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-#\r
-# This file is used to define each component of the build database\r
 #\r
 \r
-#\r
+##\r
 # Import Modules\r
 #\r
 import os, string, copy, pdb, copy\r
@@ -25,8 +25,30 @@ from BuildToolError import *
 from Misc import sdict\r
 from CommonDataClass.CommonClass import *\r
 \r
+## PcdClassObject\r
 #\r
 # This Class is used for PcdObject\r
+# \r
+# @param object:             Inherited from object class\r
+# @param Name:               Input value for Name of Pcd, default is None\r
+# @param Guid:               Input value for Guid of Pcd, default is None\r
+# @param Type:               Input value for Type of Pcd, default is None\r
+# @param DatumType:          Input value for DatumType of Pcd, default is None\r
+# @param Value:              Input value for Value of Pcd, default is None\r
+# @param Token:              Input value for Token of Pcd, default is None\r
+# @param MaxDatumSize:       Input value for MaxDatumSize of Pcd, default is None\r
+# @param SkuInfoList:        Input value for SkuInfoList of Pcd, default is {}\r
+# @param IsOverrided:        Input value for IsOverrided of Pcd, default is False\r
+#\r
+# @var TokenCName:           To store value for TokenCName\r
+# @var TokenSpaceGuidCName:  To store value for TokenSpaceGuidCName\r
+# @var Type:                 To store value for Type\r
+# @var DatumType:            To store value for DatumType\r
+# @var TokenValue:           To store value for TokenValue\r
+# @var MaxDatumSize:         To store value for MaxDatumSize\r
+# @var SkuInfoList:          To store value for SkuInfoList\r
+# @var IsOverrided:          To store value for IsOverrided\r
+# @var Phase:                To store value for Phase, default is "DXE"\r
 #\r
 class PcdClassObject(object):\r
     def __init__(self, Name = None, Guid = None, Type = None, DatumType = None, Value = None, Token = None, MaxDatumSize = None, SkuInfoList = {}, IsOverrided = False):\r
@@ -41,8 +63,15 @@ class PcdClassObject(object):
         self.IsOverrided = IsOverrided\r
         self.Phase = "DXE"\r
 \r
+    ## Convert the class to a string\r
+    #\r
+    #  Convert each member of the class to string\r
+    #  Organize to a signle line format string\r
+    #\r
+    #  @retval Rtn Formatted String\r
+    #\r
     def __str__(self):\r
-        rtn = '\tTokenCName=' + str(self.TokenCName) + ', ' + \\r
+        Rtn = '\tTokenCName=' + str(self.TokenCName) + ', ' + \\r
               'TokenSpaceGuidCName=' + str(self.TokenSpaceGuidCName) + ', ' + \\r
               'Type=' + str(self.Type) + ', ' + \\r
               'DatumType=' + str(self.DatumType) + ', ' + \\r
@@ -50,19 +79,42 @@ class PcdClassObject(object):
               'TokenValue=' + str(self.TokenValue) + ', ' + \\r
               'MaxDatumSize=' + str(self.MaxDatumSize) + ', '\r
         for Item in self.SkuInfoList.values():\r
-            rtn = rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName\r
-        rtn = rtn + str(self.IsOverrided)\r
+            Rtn = Rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName\r
+        Rtn = Rtn + str(self.IsOverrided)\r
 \r
-        return rtn\r
+        return Rtn\r
 \r
-    def __eq__(self, other):\r
-        return other != None and self.TokenCName == other.TokenCName and self.TokenSpaceGuidCName == other.TokenSpaceGuidCName\r
+    ## Override __eq__ function\r
+    #\r
+    # Check whether pcds are the same\r
+    #\r
+    # @retval False The two pcds are different\r
+    # @retval True  The two pcds are the same\r
+    #\r
+    def __eq__(self, Other):\r
+        return Other != None and self.TokenCName == Other.TokenCName and self.TokenSpaceGuidCName == Other.TokenSpaceGuidCName\r
 \r
+    ## Override __hash__ function\r
+    #\r
+    # Use (TokenCName, TokenSpaceGuidCName) as key in hash table\r
+    #\r
+    # @retval truple() Key for hash table\r
+    #\r
     def __hash__(self):\r
         return hash((self.TokenCName, self.TokenSpaceGuidCName))\r
 \r
+## LibraryClassObject\r
+#\r
+# This Class defines LibraryClassObject used in BuildDatabase\r
+# \r
+# @param object:      Inherited from object class\r
+# @param Name:        Input value for LibraryClassName, default is None\r
+# @param SupModList:  Input value for SupModList, default is []\r
+# @param Type:        Input value for Type, default is None\r
 #\r
-# This Class is used for LibraryClassObject\r
+# @var LibraryClass:  To store value for LibraryClass\r
+# @var SupModList:    To store value for SupModList\r
+# @var Type:          To store value for Type\r
 #\r
 class LibraryClassObject(object):\r
     def __init__(self, Name = None, SupModList = [], Type = None):\r
@@ -71,6 +123,49 @@ class LibraryClassObject(object):
         if Type != None:\r
             self.SupModList = CleanString(Type).split(DataType.TAB_SPACE_SPLIT)\r
 \r
+## ModuleBuildClassObject\r
+#\r
+# This Class defines ModuleBuildClass\r
+# \r
+# @param object:               Inherited from object class\r
+#\r
+# @var DescFilePath:           To store value for DescFilePath\r
+# @var BaseName:               To store value for BaseName\r
+# @var ModuleType:             To store value for ModuleType\r
+# @var Guid:                   To store value for Guid\r
+# @var Version:                To store value for Version\r
+# @var PcdIsDriver:            To store value for PcdIsDriver\r
+# @var BinaryModule:           To store value for BinaryModule\r
+# @var CustomMakefile:         To store value for CustomMakefile\r
+# @var Specification:          To store value for Specification\r
+# @var LibraryClass:           To store value for LibraryClass, it is a list structure as\r
+#                              [ LibraryClassObject, ...]\r
+# @var ModuleEntryPointList:   To store value for ModuleEntryPointList\r
+# @var ModuleUnloadImageList:  To store value for ModuleUnloadImageList\r
+# @var ConstructorList:        To store value for ConstructorList\r
+# @var DestructorList:         To store value for DestructorList\r
+# @var Binaries:               To store value for Binaries, it is a list structure as\r
+#                              [ ModuleBinaryClassObject, ...]\r
+# @var Sources:                To store value for Sources, it is a list structure as\r
+#                              [ ModuleSourceFilesClassObject, ... ]\r
+# @var LibraryClasses:         To store value for LibraryClasses, it is a set structure as\r
+#                              { [LibraryClassName, ModuleType] : LibraryClassInfFile }\r
+# @var Protocols:              To store value for Protocols, it is a list structure as\r
+#                              [ ProtocolName, ... ]\r
+# @var Ppis:                   To store value for Ppis, it is a list structure as\r
+#                              [ PpiName, ... ]\r
+# @var Guids:                  To store value for Guids, it is a list structure as\r
+#                              [ GuidName, ... ]\r
+# @var Includes:               To store value for Includes, it is a list structure as\r
+#                              [ IncludePath, ... ]\r
+# @var Packages:               To store value for Packages, it is a list structure as\r
+#                              [ DecFileName, ... ]\r
+# @var Pcds:                   To store value for Pcds, it is a set structure as\r
+#                              { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
+# @var BuildOptions:           To store value for BuildOptions, it is a set structure as\r
+#                              { [BuildOptionKey] : BuildOptionValue}\r
+# @var Depex:                  To store value for Depex, it is a list structure as\r
+#\r
 class ModuleBuildClassObject(object):\r
     def __init__(self):\r
         self.DescFilePath            = ''\r
@@ -82,33 +177,75 @@ class ModuleBuildClassObject(object):
         self.BinaryModule            = ''\r
         self.CustomMakefile          = {}\r
         self.Specification           = {}\r
-        self.LibraryClass            = []      # [ LibraryClassObject, ...]\r
+        self.LibraryClass            = []\r
         self.ModuleEntryPointList    = []\r
         self.ModuleUnloadImageList   = []\r
         self.ConstructorList         = []\r
         self.DestructorList          = []\r
 \r
-        self.Binaries                = []        #[ ModuleBinaryClassObject, ...]\r
-        self.Sources                 = []        #[ ModuleSourceFilesClassObject, ... ]\r
-        self.LibraryClasses          = {}        #{ [LibraryClassName, ModuleType] : LibraryClassInfFile }\r
-        self.Protocols               = []        #[ ProtocolName, ... ]\r
-        self.Ppis                    = []        #[ PpiName, ... ]\r
-        self.Guids                   = []        #[ GuidName, ... ]\r
-        self.Includes                = []        #[ IncludePath, ... ]\r
-        self.Packages                = []        #[ DecFileName, ... ]\r
-        self.Pcds                    = {}        #{ [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
-        self.BuildOptions            = {}        #{ [BuildOptionKey] : BuildOptionValue}\r
+        self.Binaries                = []\r
+        self.Sources                 = []\r
+        self.LibraryClasses          = {}\r
+        self.Protocols               = []\r
+        self.Ppis                    = []\r
+        self.Guids                   = []\r
+        self.Includes                = []\r
+        self.Packages                = []\r
+        self.Pcds                    = {}\r
+        self.BuildOptions            = {}\r
         self.Depex                   = ''\r
 \r
+    ## Convert the class to a string\r
+    #\r
+    #  Convert member DescFilePath of the class to a string\r
+    #\r
+    #  @retval string Formatted String\r
+    #\r
     def __str__(self):\r
         return self.DescFilePath\r
 \r
-    def __eq__(self, other):\r
-        return self.DescFilePath == str(other)\r
+    ## Override __eq__ function\r
+    #\r
+    # Check whether ModuleBuildClassObjects are the same\r
+    #\r
+    # @retval False The two ModuleBuildClassObjects are different\r
+    # @retval True  The two ModuleBuildClassObjects are the same\r
+    #\r
+    def __eq__(self, Other):\r
+        return self.DescFilePath == str(Other)\r
 \r
+    ## Override __hash__ function\r
+    #\r
+    # Use DescFilePath as key in hash table\r
+    #\r
+    # @retval string Key for hash table\r
+    #\r
     def __hash__(self):\r
         return hash(self.DescFilePath)\r
 \r
+## PackageBuildClassObject\r
+#\r
+# This Class defines PackageBuildClass\r
+# \r
+# @param object:        Inherited from object class\r
+#\r
+# @var DescFilePath:    To store value for DescFilePath\r
+# @var PackageName:     To store value for PackageName\r
+# @var Guid:            To store value for Guid\r
+# @var Version:         To store value for Version\r
+# @var Protocols:       To store value for Protocols, it is a set structure as\r
+#                       { [ProtocolName] : Protocol Guid, ... }\r
+# @var Ppis:            To store value for Ppis, it is a set structure as\r
+#                       { [PpiName] : Ppi Guid, ... }\r
+# @var Guids:           To store value for Guids, it is a set structure as\r
+#                       { [GuidName] : Guid, ... }\r
+# @var Includes:        To store value for Includes, it is a list structure as\r
+#                       [ IncludePath, ... ]\r
+# @var LibraryClasses:  To store value for LibraryClasses, it is a set structure as\r
+#                       { [LibraryClassName] : LibraryClassInfFile }\r
+# @var Pcds:            To store value for Pcds, it is a set structure as\r
+#                       { [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
+#\r
 class PackageBuildClassObject(object):\r
     def __init__(self):\r
         self.DescFilePath            = ''\r
@@ -116,22 +253,69 @@ class PackageBuildClassObject(object):
         self.Guid                    = ''\r
         self.Version                 = ''\r
 \r
-        self.Protocols               = {}       #{ [ProtocolName] : Protocol Guid, ... }\r
-        self.Ppis                    = {}       #{ [PpiName] : Ppi Guid, ... }\r
-        self.Guids                   = {}       #{ [GuidName] : Guid, ... }\r
-        self.Includes                = []       #[ IncludePath, ... ]\r
-        self.LibraryClasses          = {}       #{ [LibraryClassName] : LibraryClassInfFile }\r
-        self.Pcds                    = {}       #{ [(PcdCName, PcdGuidCName)] : PcdClassObject}\r
+        self.Protocols               = {}\r
+        self.Ppis                    = {}\r
+        self.Guids                   = {}\r
+        self.Includes                = []\r
+        self.LibraryClasses          = {}\r
+        self.Pcds                    = {}\r
 \r
+    ## Convert the class to a string\r
+    #\r
+    #  Convert member DescFilePath of the class to a string\r
+    #\r
+    #  @retval string Formatted String\r
+    #\r
     def __str__(self):\r
         return self.DescFilePath\r
 \r
-    def __eq__(self, other):\r
-        return self.DescFilePath == str(other)\r
+    ## Override __eq__ function\r
+    #\r
+    # Check whether PackageBuildClassObjects are the same\r
+    #\r
+    # @retval False The two PackageBuildClassObjects are different\r
+    # @retval True  The two PackageBuildClassObjects are the same\r
+    #\r
+    def __eq__(self, Other):\r
+        return self.DescFilePath == str(Other)\r
 \r
+    ## Override __hash__ function\r
+    #\r
+    # Use DescFilePath as key in hash table\r
+    #\r
+    # @retval string Key for hash table\r
+    #\r
     def __hash__(self):\r
         return hash(self.DescFilePath)\r
 \r
+## PlatformBuildClassObject\r
+#\r
+# This Class defines PlatformBuildClass\r
+# \r
+# @param object:          Inherited from object class\r
+#\r
+# @var DescFilePath:      To store value for DescFilePath\r
+# @var PlatformName:      To store value for PlatformName\r
+# @var Guid:              To store value for Guid\r
+# @var Version:           To store value for Version\r
+# @var DscSpecification:  To store value for DscSpecification\r
+# @var OutputDirectory:   To store value for OutputDirectory\r
+# @var FlashDefinition:   To store value for FlashDefinition\r
+# @var BuildNumber:       To store value for BuildNumber\r
+# @var MakefileName:      To store value for MakefileName\r
+# @var SkuIds:            To store value for SkuIds, it is a set structure as\r
+#                         { 'SkuName' : SkuId, '!include' : includefilename, ...}\r
+# @var Modules:           To store value for Modules, it is a list structure as\r
+#                         [ InfFileName, ... ]\r
+# @var Libraries:         To store value for Libraries, it is a list structure as\r
+#                         [ InfFileName, ... ]\r
+# @var LibraryClasses:    To store value for LibraryClasses, it is a set structure as\r
+#                         { (LibraryClassName, ModuleType) : LibraryClassInfFile }\r
+# @var Pcds:              To store value for Pcds, it is a set structure as\r
+#                         { [(PcdCName, PcdGuidCName)] : PcdClassObject }\r
+# @var BuildOptions:      To store value for BuildOptions, it is a set structure as\r
+#                         { [BuildOptionKey] : BuildOptionValue }\r
+#\r
 class PlatformBuildClassObject(object):\r
     def __init__(self):\r
         self.DescFilePath            = ''\r
@@ -144,38 +328,102 @@ class PlatformBuildClassObject(object):
         self.BuildNumber             = ''\r
         self.MakefileName            = ''\r
 \r
-        self.SkuIds                  = {}       #{ 'SkuName' : SkuId, '!include' : includefilename, ...}\r
-        self.Modules                 = []       #[ InfFileName, ... ]\r
-        self.Libraries               = []       #[ InfFileName, ... ]\r
-        self.LibraryClasses          = {}       #{ (LibraryClassName, ModuleType) : LibraryClassInfFile }\r
-        self.Pcds                    = {}       #{ [(PcdCName, PcdGuidCName)] : PcdClassObject }\r
-        self.BuildOptions            = {}       #{ [BuildOptionKey] : BuildOptionValue }\r
+        self.SkuIds                  = {}\r
+        self.Modules                 = []\r
+        self.Libraries               = []\r
+        self.LibraryClasses          = {}\r
+        self.Pcds                    = {}\r
+        self.BuildOptions            = {}\r
 \r
+    ## Convert the class to a string\r
+    #\r
+    #  Convert member DescFilePath of the class to a string\r
+    #\r
+    #  @retval string Formatted String\r
+    #\r
     def __str__(self):\r
         return self.DescFilePath\r
 \r
+    ## Override __eq__ function\r
+    #\r
+    # Check whether PlatformBuildClassObjects are the same\r
+    #\r
+    # @retval False The two PlatformBuildClassObjects are different\r
+    # @retval True  The two PlatformBuildClassObjects are the same\r
+    #\r
     def __eq__(self, other):\r
         return self.DescFilePath == str(other)\r
 \r
+    ## Override __hash__ function\r
+    #\r
+    # Use DescFilePath as key in hash table\r
+    #\r
+    # @retval string Key for hash table\r
+    #\r
     def __hash__(self):\r
         return hash(self.DescFilePath)\r
 \r
+## ItemBuild\r
+#\r
+# This Class defines Module/Platform/Package databases for build system\r
+#\r
+# @param object:          Inherited from object class\r
+# @param Arch:            Build arch\r
+# @param Platform:        Build Platform\r
+# @param Package:         Build Package\r
+# @param Module:          Build Module\r
+#\r
+# @var Arch:              To store value for Build Arch\r
+# @var PlatformDatabase:  To store value for PlatformDatabase, it is a set structure as\r
+#                         { [DscFileName] : PlatformBuildClassObject, ...}\r
+# @var PackageDatabase:   To store value for PackageDatabase, it is a set structure as\r
+#                         { [DecFileName] : PacakgeBuildClassObject, ...}\r
+# @var ModuleDatabase:    To store value for ModuleDatabase, it is a list structure as\r
+#                         { [InfFileName] : ModuleBuildClassObject, ...}\r
+#\r
 class ItemBuild(object):\r
     def __init__(self, Arch, Platform = None, Package = None, Module = None):\r
         self.Arch                    = Arch\r
-        self.PlatformDatabase        = {}        #{ [DscFileName] : PlatformBuildClassObject, ...}\r
-        self.PackageDatabase         = {}        #{ [DecFileName] : PacakgeBuildClassObject, ...}\r
-        self.ModuleDatabase          = {}        #{ [InfFileName] : ModuleBuildClassObject, ...}\r
+        self.PlatformDatabase        = {}\r
+        self.PackageDatabase         = {}\r
+        self.ModuleDatabase          = {}\r
 \r
+## WorkspaceBuild\r
 #\r
 # This class is used to parse active platform to init all inf/dec/dsc files\r
 # Generate module/package/platform databases for build\r
 #\r
+# @param object:          Inherited from object class\r
+# @param ActivePlatform:  Input value for current active platform\r
+# @param WorkspaceDir:    Input value for current WorkspaceDir\r
+#\r
+# @var WorkspaceDir:      To store value for WorkspaceDir\r
+# @var SupArchList:       To store value for SupArchList, selection scope is in below list\r
+#                         EBC | IA32 | X64 | IPF | ARM | PPC\r
+# @var BuildTarget:       To store value for WorkspaceDir, selection scope is in below list\r
+#                         RELEASE | DEBUG\r
+# @var SkuId:             To store value for SkuId\r
+# @var Fdf:               To store value for Fdf\r
+# @var FdTargetList:      To store value for FdTargetList\r
+# @var FvTargetList:      To store value for FvTargetList\r
+# @var TargetTxt:         To store value for TargetTxt, it is a set structure as\r
+#                         TargetTxtClassObject\r
+# @var ToolDef:           To store value for ToolDef, it is a set structure as\r
+#                         ToolDefClassObject\r
+# @var InfDatabase:       To store value for InfDatabase, it is a set structure as\r
+#                         { [InfFileName] : InfClassObject}\r
+# @var DecDatabase:       To store value for DecDatabase, it is a set structure as\r
+#                         { [DecFileName] : DecClassObject}\r
+# @var DscDatabase:       To store value for DscDatabase, it is a set structure as\r
+#                         { [DscFileName] : DscClassObject}\r
+# @var Build              To store value for DscDatabase, it is a set structure as\r
+#                         ItemBuild\r
+#\r
 class WorkspaceBuild(object):\r
     def __init__(self, ActivePlatform, WorkspaceDir):\r
         self.WorkspaceDir            = NormPath(WorkspaceDir)\r
-        self.SupArchList             = []        #[ 'IA32', 'X64', ...]\r
-        self.BuildTarget             = []        #[ 'RELEASE', 'DEBUG']\r
+        self.SupArchList             = []\r
+        self.BuildTarget             = []\r
         self.SkuId                   = ''\r
         self.Fdf                     = ''\r
         self.FdTargetList            = []\r
@@ -183,9 +431,9 @@ class WorkspaceBuild(object):
         self.TargetTxt               = None\r
         self.ToolDef                 = None\r
 \r
-        self.InfDatabase             = {}        #{ [InfFileName] : InfClassObject}\r
-        self.DecDatabase             = {}        #{ [DecFileName] : DecClassObject}\r
-        self.DscDatabase             = {}        #{ [DscFileName] : DscClassObject}\r
+        self.InfDatabase             = {}\r
+        self.DecDatabase             = {}\r
+        self.DscDatabase             = {}\r
 \r
         #\r
         # Init build for all arches\r
@@ -252,48 +500,61 @@ class WorkspaceBuild(object):
                     self.AddToDecDatabase(Item.FilePath)\r
     # End of self.Init()\r
 \r
+    ## Generate PlatformDatabase\r
     #\r
-    # Generate PlatformDatabase\r
+    # Go through each arch to get all items in DscDatabase to PlatformDatabase\r
     #\r
     def GenPlatformDatabase(self):\r
         for Dsc in self.DscDatabase.keys():\r
             Platform = self.DscDatabase[Dsc].Platform\r
 \r
             for Arch in self.SupArchList:\r
-                pb = PlatformBuildClassObject()\r
+                Pb = PlatformBuildClassObject()\r
 \r
+                #\r
                 # Defines\r
-                pb.DescFilePath = Dsc\r
-                pb.PlatformName = Platform.Header.Name\r
-                pb.Guid = Platform.Header.Guid\r
-                pb.Version = Platform.Header.Version\r
-                pb.DscSpecification = Platform.Header.DscSpecification\r
-                pb.OutputDirectory = NormPath(Platform.Header.OutputDirectory)\r
-                pb.FlashDefinition = NormPath(Platform.FlashDefinitionFile.FilePath)\r
-                pb.BuildNumber = Platform.Header.BuildNumber\r
+                #\r
+                Pb.DescFilePath = Dsc\r
+                Pb.PlatformName = Platform.Header.Name\r
+                Pb.Guid = Platform.Header.Guid\r
+                Pb.Version = Platform.Header.Version\r
+                Pb.DscSpecification = Platform.Header.DscSpecification\r
+                Pb.OutputDirectory = NormPath(Platform.Header.OutputDirectory)\r
+                Pb.FlashDefinition = NormPath(Platform.FlashDefinitionFile.FilePath)\r
+                Pb.BuildNumber = Platform.Header.BuildNumber\r
 \r
+                #\r
                 # SkuId\r
+                #\r
                 for Key in Platform.SkuInfos.SkuInfoList.keys():\r
-                    pb.SkuIds[Key] = Platform.SkuInfos.SkuInfoList[Key]\r
+                    Pb.SkuIds[Key] = Platform.SkuInfos.SkuInfoList[Key]\r
 \r
+                #\r
                 # Module\r
+                #\r
                 for Item in Platform.Modules.ModuleList:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Modules.append(NormPath(Item.FilePath))\r
+                        Pb.Modules.append(NormPath(Item.FilePath))\r
 \r
+                #\r
                 # BuildOptions\r
+                #\r
                 for Item in Platform.BuildOptions.BuildOptionList:\r
                     if Arch in Item.SupArchList:\r
-                        pb.BuildOptions[(Item.ToolChainFamily, Item.ToolChain)] = Item.Option\r
+                        Pb.BuildOptions[(Item.ToolChainFamily, Item.ToolChain)] = Item.Option\r
 \r
+                #\r
                 # LibraryClass\r
+                #\r
                 for Item in Platform.LibraryClasses.LibraryList:\r
-                    SupModuleList = self.FindSupModuleListOfLibraryClass(Item, Platform.LibraryClasses.LibraryList)\r
+                    SupModuleList = self.FindSupModuleListOfLibraryClass(Item, Platform.LibraryClasses.LibraryList, Arch)\r
                     if Arch in Item.SupArchList:\r
                         for ModuleType in SupModuleList:\r
-                            pb.LibraryClasses[(Item.Name, ModuleType)] = NormPath(Item.FilePath)\r
+                            Pb.LibraryClasses[(Item.Name, ModuleType)] = NormPath(Item.FilePath)\r
 \r
+                #\r
                 # Pcds\r
+                #\r
                 for Item in Platform.DynamicPcdBuildDefinitions:\r
                     if Arch in Item.SupArchList:\r
                         Name = Item.CName\r
@@ -304,54 +565,71 @@ class WorkspaceBuild(object):
                         Token = Item.Token\r
                         MaxDatumSize = Item.MaxDatumSize\r
                         SkuInfoList = Item.SkuInfoList\r
-                        pb.Pcds[(Name, Guid)] = PcdClassObject(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, False)\r
+                        Pb.Pcds[(Name, Guid)] = PcdClassObject(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, False)\r
 \r
+                #\r
                 # Add to database\r
-                self.Build[Arch].PlatformDatabase[Dsc] = pb\r
-                pb = None\r
+                #\r
+                self.Build[Arch].PlatformDatabase[Dsc] = Pb\r
+                Pb = None\r
 \r
+    ## Generate PackageDatabase\r
     #\r
-    # Generate PackageDatabase\r
+    # Go through each arch to get all items in DecDatabase to PackageDatabase\r
     #\r
     def GenPackageDatabase(self):\r
         for Dec in self.DecDatabase.keys():\r
             Package = self.DecDatabase[Dec].Package\r
 \r
             for Arch in self.SupArchList:\r
-                pb = PackageBuildClassObject()\r
+                Pb = PackageBuildClassObject()\r
 \r
+                #\r
                 # Defines\r
-                pb.DescFilePath = Dec\r
-                pb.PackageName = Package.Header.Name\r
-                pb.Guid = Package.Header.Guid\r
-                pb.Version = Package.Header.Version\r
+                #\r
+                Pb.DescFilePath = Dec\r
+                Pb.PackageName = Package.Header.Name\r
+                Pb.Guid = Package.Header.Guid\r
+                Pb.Version = Package.Header.Version\r
 \r
+                #\r
                 # Protocols\r
+                #\r
                 for Item in Package.ProtocolDeclarations:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Protocols[Item.CName] = Item.Guid\r
+                        Pb.Protocols[Item.CName] = Item.Guid\r
 \r
+                #\r
                 # Ppis\r
+                #\r
                 for Item in Package.PpiDeclarations:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Ppis[Item.CName] = Item.Guid\r
+                        Pb.Ppis[Item.CName] = Item.Guid\r
 \r
+                #\r
                 # Guids\r
+                #\r
                 for Item in Package.GuidDeclarations:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Ppis[Item.CName] = Item.Guid\r
+                        Pb.Ppis[Item.CName] = Item.Guid\r
 \r
+                #\r
                 # Includes\r
+                #\r
                 for Item in Package.Includes:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Includes.append(NormPath(Item.FilePath))\r
+                        Pb.Includes.append(NormPath(Item.FilePath))\r
 \r
+                #\r
                 # LibraryClasses\r
+                #\r
                 for Item in Package.LibraryClassDeclarations:\r
                     if Arch in Item.SupArchList:\r
-                        pb.LibraryClasses[Item.LibraryClass] = NormPath(Item.RecommendedInstance)\r
+                        Pb.LibraryClasses[Item.LibraryClass] = NormPath(Item.RecommendedInstance)\r
 \r
+                #\r
                 # Pcds\r
+                #\r
                 for Item in Package.PcdDeclarations:\r
                     if Arch in Item.SupArchList:\r
                         Name = Item.CName\r
@@ -362,15 +640,18 @@ class WorkspaceBuild(object):
                         Token = Item.Token\r
                         MaxDatumSize = Item.MaxDatumSize\r
                         SkuInfoList = Item.SkuInfoList\r
-                        pb.Pcds[(Name, Guid)] = PcdClassObject(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, False)\r
+                        Pb.Pcds[(Name, Guid)] = PcdClassObject(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, False)\r
 \r
+                #\r
                 # Add to database\r
-                self.Build[Arch].PackageDatabase[Dec] = pb\r
-                pb = None\r
+                #\r
+                self.Build[Arch].PackageDatabase[Dec] = Pb\r
+                Pb = None\r
 \r
+    ## Generate ModuleDatabase\r
     #\r
-    # Generate ModuleDatabase\r
-    #\r
+    # Go through each arch to get all items in InfDatabase to ModuleDatabase\r
+    #    \r
     def GenModuleDatabase(self, PcdsSet = {}, InfList = []):\r
         for Inf in self.InfDatabase.keys():\r
             Module = self.InfDatabase[Inf].Module\r
@@ -379,49 +660,61 @@ class WorkspaceBuild(object):
                 if not self.IsModuleDefinedInPlatform(Inf, Arch, InfList):\r
                     continue\r
 \r
-                pb = ModuleBuildClassObject()\r
+                Pb = ModuleBuildClassObject()\r
 \r
+                #\r
                 # Defines\r
-                pb.DescFilePath = Inf\r
-                pb.BaseName = Module.Header.Name\r
-                pb.Guid = Module.Header.Guid\r
-                pb.Version = Module.Header.Version\r
-                pb.ModuleType = Module.Header.ModuleType\r
-                pb.PcdIsDriver = Module.Header.PcdIsDriver\r
-                pb.BinaryModule = Module.Header.BinaryModule\r
-                pb.CustomMakefile = Module.Header.CustomMakefile\r
+                #\r
+                Pb.DescFilePath = Inf\r
+                Pb.BaseName = Module.Header.Name\r
+                Pb.Guid = Module.Header.Guid\r
+                Pb.Version = Module.Header.Version\r
+                Pb.ModuleType = Module.Header.ModuleType\r
+                Pb.PcdIsDriver = Module.Header.PcdIsDriver\r
+                Pb.BinaryModule = Module.Header.BinaryModule\r
+                Pb.CustomMakefile = Module.Header.CustomMakefile\r
 \r
+                #\r
                 # Specs os Defines\r
-                pb.Specification = Module.Header.Specification\r
-                pb.Specification[TAB_INF_DEFINES_EDK_RELEASE_VERSION] = Module.Header.EdkReleaseVersion\r
-                pb.Specification[TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION] = Module.Header.EfiSpecificationVersion\r
+                #\r
+                Pb.Specification = Module.Header.Specification\r
+                Pb.Specification[TAB_INF_DEFINES_EDK_RELEASE_VERSION] = Module.Header.EdkReleaseVersion\r
+                Pb.Specification[TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION] = Module.Header.EfiSpecificationVersion\r
 \r
+                #\r
                 # LibraryClass of Defines\r
+                #\r
                 for Item in Module.Header.LibraryClass:\r
-                    pb.LibraryClass.append(LibraryClassObject(Item.LibraryClass, Item.SupModuleList, None))\r
+                    Pb.LibraryClass.append(LibraryClassObject(Item.LibraryClass, Item.SupModuleList, None))\r
 \r
+                #\r
                 # Module image and library of Defines\r
+                #\r
                 for Item in Module.ExternImages:\r
                     if Item.ModuleEntryPoint != '':\r
-                        pb.ModuleEntryPointList.append(Item.ModuleEntryPoint)\r
+                        Pb.ModuleEntryPointList.append(Item.ModuleEntryPoint)\r
                     if Item.ModuleUnloadImage != '':\r
-                        pb.ModuleUnloadImageList.append(Item.ModuleUnloadImage)\r
+                        Pb.ModuleUnloadImageList.append(Item.ModuleUnloadImage)\r
                 for Item in Module.ExternLibraries:\r
                     if Item.Constructor != '':\r
-                        pb.ConstructorList.append(Item.Constructor)\r
+                        Pb.ConstructorList.append(Item.Constructor)\r
                     if Item.Destructor != '':\r
-                        pb.DestructorList.append(Item.Destructor)\r
+                        Pb.DestructorList.append(Item.Destructor)\r
 \r
+                #\r
                 # Binaries\r
+                #\r
                 for Item in Module.Binaries:\r
                     if Arch in Item.SupArchList:\r
                         FileName = NormPath(Item.BinaryFile)\r
                         FileType = Item.FileType\r
                         Target = Item.Target\r
                         FeatureFlag = Item.FeatureFlag\r
-                        pb.Binaries.append(ModuleBinaryFileClass(FileName, FileType, Target, FeatureFlag))\r
+                        Pb.Binaries.append(ModuleBinaryFileClass(FileName, FileType, Target, FeatureFlag, Arch.split()))\r
 \r
-                #Sources\r
+                #\r
+                # Sources\r
+                #\r
                 for Item in Module.Sources:\r
                     if Arch in Item.SupArchList:\r
                         SourceFile = NormPath(Item.SourceFile)\r
@@ -429,79 +722,104 @@ class WorkspaceBuild(object):
                         ToolCode = Item.ToolCode\r
                         ToolChainFamily = Item.ToolChainFamily\r
                         FeatureFlag = Item.FeatureFlag\r
-                        pb.Sources.append(ModuleSourceFileClass(SourceFile, TagName, ToolCode, ToolChainFamily, FeatureFlag))\r
+                        Pb.Sources.append(ModuleSourceFileClass(SourceFile, TagName, ToolCode, ToolChainFamily, FeatureFlag))\r
 \r
+                #\r
                 # Protocols\r
+                #\r
                 for Item in Module.Protocols:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Protocols.append(Item.CName)\r
+                        Pb.Protocols.append(Item.CName)\r
 \r
+                #\r
                 # Ppis\r
+                #\r
                 for Item in Module.Ppis:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Ppis.append(Item.CName)\r
+                        Pb.Ppis.append(Item.CName)\r
 \r
+                #\r
                 # Guids\r
+                #\r
                 for Item in Module.Guids:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Ppis.append(Item.CName)\r
+                        Pb.Ppis.append(Item.CName)\r
 \r
+                #\r
                 # Includes\r
+                #\r
                 for Item in Module.Includes:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Includes.append(NormPath(Item.FilePath))\r
+                        Pb.Includes.append(NormPath(Item.FilePath))\r
 \r
+                #\r
                 # Packages\r
+                #\r
                 for Item in Module.PackageDependencies:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Packages.append(NormPath(Item.FilePath))\r
+                        Pb.Packages.append(NormPath(Item.FilePath))\r
 \r
+                #\r
                 # BuildOptions\r
+                #\r
                 for Item in Module.BuildOptions:\r
                     if Arch in Item.SupArchList:\r
-                        pb.BuildOptions[(Item.ToolChainFamily, Item.ToolChain)] = Item.Option\r
-                self.FindBuildOptions(Arch, Inf, pb.BuildOptions)\r
+                        Pb.BuildOptions[(Item.ToolChainFamily, Item.ToolChain)] = Item.Option\r
+                self.FindBuildOptions(Arch, Inf, Pb.BuildOptions)\r
 \r
+                #\r
                 # Depex\r
+                #\r
                 for Item in Module.Depex:\r
                     if Arch in Item.SupArchList:\r
-                        pb.Depex = pb.Depex + Item.Depex + ' '\r
-                pb.Depex = pb.Depex.strip()\r
+                        Pb.Depex = Pb.Depex + Item.Depex + ' '\r
+                Pb.Depex = Pb.Depex.strip()\r
 \r
+                #\r
                 # LibraryClasses\r
+                #\r
                 for Item in Module.LibraryClasses:\r
                     if Arch in Item.SupArchList:\r
                         Lib = Item.LibraryClass\r
                         RecommendedInstance = Item.RecommendedInstance\r
-                        if pb.LibraryClass != []:\r
+                        if Pb.LibraryClass != []:\r
+                            #\r
                             # For Library\r
-                            for Libs in pb.LibraryClass:\r
+                            #\r
+                            for Libs in Pb.LibraryClass:\r
                                 for Type in Libs.SupModList:\r
                                     Instance = self.FindLibraryClassInstanceOfLibrary(Lib, Arch, Type)\r
                                     if Instance == None:\r
                                         Instance = RecommendedInstance\r
-                                    pb.LibraryClasses[(Lib, Type)] = NormPath(Instance)\r
+                                    Pb.LibraryClasses[(Lib, Type)] = NormPath(Instance)\r
                         else:\r
+                            #\r
                             # For Module\r
-                            Instance = self.FindLibraryClassInstanceOfModule(Lib, Arch, pb.ModuleType, Inf)\r
+                            #\r
+                            Instance = self.FindLibraryClassInstanceOfModule(Lib, Arch, Pb.ModuleType, Inf)\r
                             if Instance == None:\r
                                 Instance = RecommendedInstance\r
-                            pb.LibraryClasses[(Lib, pb.ModuleType)] = NormPath(Instance)\r
+                            Pb.LibraryClasses[(Lib, Pb.ModuleType)] = NormPath(Instance)\r
 \r
+                #\r
                 # Pcds\r
+                #\r
                 for Item in Module.PcdCodes:\r
                     if Arch in Item.SupArchList:\r
                         Name = Item.CName\r
                         Guid = Item.TokenSpaceGuidCName\r
                         Type = Item.ItemType\r
-                        pb.Pcds[(Name, Guid)] = self.FindPcd(Arch, Inf, Name, Guid, Type, PcdsSet)\r
+                        Pb.Pcds[(Name, Guid)] = self.FindPcd(Arch, Inf, Name, Guid, Type, PcdsSet)\r
 \r
+                #\r
                 # Add to database\r
-                self.Build[Arch].ModuleDatabase[Inf] = pb\r
-                pb = None\r
+                #\r
+                self.Build[Arch].ModuleDatabase[Inf] = Pb\r
+                Pb = None\r
 \r
+    ## Update Libraries Of Platform Database\r
     #\r
-    # Update Libraries Of Platform Database\r
+    # @param InfList: A list for all inf files\r
     #\r
     def UpdateLibrariesOfPlatform(self, InfList = []):\r
         for Arch in self.SupArchList:\r
@@ -518,20 +836,12 @@ class WorkspaceBuild(object):
                             Lib = Module.LibraryClasses[Key]\r
                             if Lib not in Platform.Libraries:\r
                                 Platform.Libraries.append(Lib)\r
-##                    Stack = [NormPath(str(Module))]\r
-##                    Libs = []\r
-##                    while len(Stack) > 0:\r
-##                        M = self.Build[Arch].ModuleDatabase[Stack.pop()]\r
-##                        for Key, Lib in M.LibraryClasses.iteritems():\r
-##                            if Module.ModuleType not in Key or Lib == None or Lib == "":\r
-##                                continue\r
-##                            Lib = NormPath(Lib)\r
-##                            if Lib not in Platform.Libraries:\r
-##                                Platform.Libraries.append(Lib)\r
-##                            if Lib not in Libs:\r
-##                                Libs.append(Lib)\r
-##                                Stack.append(Lib)\r
 \r
+    ## Update Libraries Of Module Database\r
+    #\r
+    # @param Module:  The module need to be updated libraries\r
+    # @param Arch:    The supportted arch of the module\r
+    #\r
     def UpdateLibrariesOfModule(self, Module, Arch):\r
         ModuleDatabase = self.Build[Arch].ModuleDatabase\r
 \r
@@ -545,9 +855,11 @@ class WorkspaceBuild(object):
         EdkLogger.verbose("")\r
         EdkLogger.verbose("Library instances of module [%s]:" % str(Module))\r
         while len(LibraryConsumerList) > 0:\r
-            module = LibraryConsumerList.pop()\r
-            for Key, LibraryPath in module.LibraryClasses.iteritems():\r
+            _module = LibraryConsumerList.pop()\r
+            for Key, LibraryPath in _module.LibraryClasses.iteritems():\r
+                #\r
                 # The "Key" is in format of (library_class_name, supported_module_type)\r
+                #\r
                 LibraryClassName = Key[0]\r
                 if ModuleType != "USER_DEFINED" and ModuleType not in Key:\r
                     EdkLogger.debug(EdkLogger.DEBUG_3, "%s for module type %s is not supported (%s)" % (Key + (LibraryPath,)))\r
@@ -567,10 +879,10 @@ class WorkspaceBuild(object):
 \r
                 if LibraryModule not in ConsumedByList:\r
                     ConsumedByList[LibraryModule] = []\r
-                if module != Module:\r
-                    if module in ConsumedByList[LibraryModule]:\r
+                if _module != Module:\r
+                    if _module in ConsumedByList[LibraryModule]:\r
                         continue\r
-                    ConsumedByList[LibraryModule].append(module)\r
+                    ConsumedByList[LibraryModule].append(_module)\r
         #\r
         # Initialize the sorted output list to the empty set\r
         #\r
@@ -580,86 +892,86 @@ class WorkspaceBuild(object):
         #\r
         LibraryList = LibraryInstance.values()\r
         Q = []\r
-        for m in LibraryList:\r
+        for Item in LibraryList:\r
             #\r
             # check if there're duplicate library classes\r
             #\r
-            for Lc in m.LibraryClass:\r
-                if Lc.LibraryClass in LibraryInstance and str(m) != str(LibraryInstance[Lc.LibraryClass]):\r
+            for Lc in Item.LibraryClass:\r
+                if Lc.LibraryClass in LibraryInstance and str(Item) != str(LibraryInstance[Lc.LibraryClass]):\r
                     EdkLogger.error("AutoGen", AUTOGEN_ERROR,\r
                                     "More than one library instance found for library class %s in module %s" % (Lc.LibraryClass, Module),\r
-                                    ExtraData="\t%s\n\t%s" % (LibraryInstance[Lc.LibraryClass], str(m))\r
+                                    ExtraData="\t%s\n\t%s" % (LibraryInstance[Lc.LibraryClass], str(Item))\r
                                     )\r
-            if ConsumedByList[m] == []:\r
-                Q.insert(0, m)\r
+            if ConsumedByList[Item] == []:\r
+                Q.insert(0, Item)\r
         #\r
         # while Q is not empty do\r
         #\r
         while Q != []:\r
             #\r
-            # remove node from Q\r
+            # remove node from Q\r
             #\r
-            n = Q.pop()\r
+            Node = Q.pop()\r
             #\r
-            # output n\r
+            # output Node\r
             #\r
-            SortedLibraryList.append(n)\r
+            SortedLibraryList.append(Node)\r
             #\r
-            # for each node m with an edge e from n to m do\r
+            # for each node Item with an edge e from Node to Item do\r
             #\r
-            for m in LibraryList:\r
-                if n not in ConsumedByList[m]:\r
+            for Item in LibraryList:\r
+                if Node not in ConsumedByList[Item]:\r
                     continue\r
                 #\r
                 # remove edge e from the graph\r
                 #\r
-                ConsumedByList[m].remove(n)\r
+                ConsumedByList[Item].remove(Node)\r
                 #\r
-                # If m has no other incoming edges then\r
+                # If Item has no other incoming edges then\r
                 #\r
-                if ConsumedByList[m] == []:\r
+                if ConsumedByList[Item] == []:\r
                     #\r
-                    # insert m into Q\r
+                    # insert Item into Q\r
                     #\r
-                    Q.insert(0,m)\r
+                    Q.insert(0, Item)\r
 \r
             EdgeRemoved = True\r
             while Q == [] and EdgeRemoved:\r
                 EdgeRemoved = False\r
                 #\r
-                # for each node m with a Constructor\r
+                # for each node Item with a Constructor\r
                 #\r
-                for m in LibraryList:\r
-                    if m in Constructor:\r
+                for Item in LibraryList:\r
+                    if Item in Constructor:\r
                         #\r
-                        # for each node n without a constructor with an edge e from m to n\r
+                        # for each Node without a constructor with an edge e from Item to Node\r
                         #\r
-                        for n in ConsumedByList[m]:\r
-                            if n not in Constructor:\r
+                        for Node in ConsumedByList[Item]:\r
+                            if Node not in Constructor:\r
                                 #\r
                                 # remove edge e from the graph\r
                                 #\r
-                                ConsumedByList[m].remove(n)\r
+                                ConsumedByList[Item].remove(Node)\r
                                 EdgeRemoved = True\r
-                                if ConsumedByList[m] == []:\r
+                                if ConsumedByList[Item] == []:\r
                                     #\r
-                                    # insert m into Q\r
+                                    # insert Item into Q\r
                                     #\r
-                                    Q.insert(0,m)\r
+                                    Q.insert(0, Item)\r
                                     break\r
                     if Q != []:\r
                         break\r
 \r
         #\r
-        # if any remaining node m in the graph has a constructor and an incoming edge, then the graph has a cycle\r
+        # if any remaining node Item in the graph has a constructor and an incoming edge, then the graph has a cycle\r
         #\r
-        for m in LibraryList:\r
-            if ConsumedByList[m] != [] and m in Constructor and len(Constructor) > 1:\r
-                ErrorMessage = 'Library [%s] with constructors has a cycle' % str(m)\r
+        for Item in LibraryList:\r
+            if ConsumedByList[Item] != [] and Item in Constructor and len(Constructor) > 1:\r
+                ErrorMessage = 'Library [%s] with constructors has a cycle' % str(Item)\r
                 EdkLogger.error("AutoGen", AUTOGEN_ERROR, ErrorMessage,\r
-                                "\tconsumed by " + "\n\tconsumed by ".join([str(l) for l in ConsumedByList[m]]))\r
-            if m not in SortedLibraryList:\r
-                SortedLibraryList.append(m)\r
+                                "\tconsumed by " + "\n\tconsumed by ".join([str(L) for L in ConsumedByList[Item]]))\r
+            if Item not in SortedLibraryList:\r
+                SortedLibraryList.append(Item)\r
 \r
         #\r
         # Build the list of constructor and destructir names\r
@@ -695,27 +1007,53 @@ class WorkspaceBuild(object):
                 if CName not in Module.Ppis:\r
                     Module.Ppis.append(CName)\r
 \r
+    ## GenBuildDatabase\r
     #\r
     # Generate build database for all arches\r
     #\r
+    # @param PcdsSet: Pcd list for override from Fdf parse result\r
+    # @param InfList: Inf list for override from Fdf parse result\r
+    #\r
     def GenBuildDatabase(self, PcdsSet = {}, InfList = []):\r
+        #\r
+        # Add additional inf file defined in Fdf file\r
+        #\r
         for InfFile in InfList:\r
             self.AddToInfDatabase(InfFile)\r
+        \r
+        #\r
+        # Generate PlatformDatabase, PackageDatabase and ModuleDatabase\r
+        #\r
         self.GenPlatformDatabase()\r
         self.GenPackageDatabase()\r
         self.GenModuleDatabase(PcdsSet, InfList)\r
+        \r
+        #\r
+        # Update Libraries Of Platform\r
+        #\r
         self.UpdateLibrariesOfPlatform(InfList)\r
 \r
+    ## Create a full path with workspace dir\r
+    #\r
+    # Convert Filename with workspace dir to create a full path\r
+    #\r
+    # @param Filename: The filename need to be added workspace dir\r
     #\r
-    # Return a full path with workspace dir\r
+    # @retval string Full path\r
     #\r
     def WorkspaceFile(self, Filename):\r
         return WorkspaceFile(self.WorkspaceDir, Filename)\r
 \r
+    ## Update LibraryClass of Module\r
     #\r
     # If a module of a platform has its own override libraryclass but the libraryclass not defined in the module\r
     # Add this libraryclass to the module\r
     #\r
+    # @param InfFileName:       InfFileName specificed in platform\r
+    # @param LibraryClass:      LibraryClass specificed in platform\r
+    # @param Arch:              Supportted Arch\r
+    # @param InstanceFilePath:  InstanceFilePath specificed in platform\r
+    #\r
     def UpdateLibraryClassOfModule(self, InfFileName, LibraryClass, Arch, InstanceFilePath):\r
         #\r
         # Update the library instance itself to add this libraryclass name\r
@@ -756,9 +1094,12 @@ class WorkspaceBuild(object):
             Lib.SupArchList = [Arch]\r
             self.InfDatabase[NormPath(InfFileName)].Module.LibraryClasses.append(Lib)\r
 \r
+    ## Add Inf file to InfDatabase\r
     #\r
     # Create a Inf instance for input inf file and add it to InfDatabase\r
     #\r
+    # @param InfFileName: The InfFileName need to be added to database\r
+    #\r
     def AddToInfDatabase(self, InfFileName):\r
         InfFileName = NormPath(InfFileName)\r
         File = self.WorkspaceFile(InfFileName)\r
@@ -768,9 +1109,12 @@ class WorkspaceBuild(object):
         else:\r
             EdkLogger.error("AutoGen", FILE_NOT_FOUND, ExtraData=File)\r
 \r
+    ## Add Dec file to DecDatabase\r
     #\r
     # Create a Dec instance for input dec file and add it to DecDatabase\r
     #\r
+    # @param DecFileName: The DecFileName need to be added to database\r
+    #\r
     def AddToDecDatabase(self, DecFileName):\r
         DecFileName = NormPath(DecFileName)\r
         File = self.WorkspaceFile(DecFileName)\r
@@ -780,10 +1124,18 @@ class WorkspaceBuild(object):
         else:\r
             EdkLogger.error("AutoGen", FILE_NOT_FOUND, ExtraData=File)\r
 \r
+    ## Search LibraryClass Instance for Module\r
     #\r
     # Search PlatformBuildDatabase to find LibraryClass Instance for Module\r
     # Return the instance if found\r
     #\r
+    # @param Lib:         Input value for Library Class Name\r
+    # @param Arch:        Supportted Arch\r
+    # @param ModuleType:  Supportted ModuleType\r
+    # @param ModuleName:  Input value for Module Name\r
+    #\r
+    # @retval string Found LibraryClass Instance file path\r
+    #\r
     def FindLibraryClassInstanceOfModule(self, Lib, Arch, ModuleType, ModuleName):\r
         #\r
         # First find if exist in <LibraryClass> of <Components> from dsc file\r
@@ -801,10 +1153,18 @@ class WorkspaceBuild(object):
         #\r
         return self.FindLibraryClassInstanceOfLibrary(Lib, Arch, ModuleType)\r
 \r
+    ## Search LibraryClass Instance for Library\r
     #\r
     # Search PlatformBuildDatabase to find LibraryClass Instance for Library\r
     # Return the instance if found\r
     #\r
+    # @param Lib:   Input value for Library Class Name\r
+    # @param Arch:  Supportted Arch\r
+    # @param Type:  Supportted Library Usage Type\r
+    #\r
+    # @retval string Found LibraryClass Instance file path\r
+    # @retval None   Not Found\r
+    #\r
     def FindLibraryClassInstanceOfLibrary(self, Lib, Arch, Type):\r
         for Dsc in self.DscDatabase.keys():\r
             Platform  = self.DscDatabase[Dsc].Platform\r
@@ -814,10 +1174,15 @@ class WorkspaceBuild(object):
                 return self.Build[Arch].PlatformDatabase[Dsc].LibraryClasses[(Lib, '')]\r
         return None\r
 \r
+    ## Find BuildOptions\r
     #\r
     # Search DscDatabase to find component definition of ModuleName\r
     # Override BuildOption if it is defined in component\r
     #\r
+    # @param Arch:          Supportted Arch\r
+    # @param ModuleName:    The module which has buildoption definition in component of platform\r
+    # @param BuildOptions:  The set of all buildopitons\r
+    #\r
     def FindBuildOptions(self, Arch, ModuleName, BuildOptions):\r
         for Dsc in self.DscDatabase.keys():\r
             #\r
@@ -829,12 +1194,25 @@ class WorkspaceBuild(object):
                 if Arch in Module.SupArchList:\r
                     if NormPath(Module.FilePath) == ModuleName:\r
                         for BuildOption in Module.ModuleSaBuildOption.BuildOptionList:\r
+                            #\r
+                            # Add to BuildOptions\r
+                            #\r
                             BuildOptions[(BuildOption.ToolChainFamily, BuildOption.ToolChain)] = BuildOption.Option\r
 \r
+    ## Find Pcd\r
     #\r
     # Search platform database, package database, module database and PcdsSet from Fdf\r
     # Return found Pcd\r
     #\r
+    # @param Arch:        Supportted Arch\r
+    # @param ModuleName:  The module which has pcd definition in component of platform\r
+    # @param Name:        Name of Pcd\r
+    # @param Guid:        Guid of Pcd\r
+    # @param Type:        Type of Pcd\r
+    # @param PcdsSet:     A PcdSet get from Fdf parse result\r
+    #\r
+    # @retval PcdClassObject An instance for PcdClassObject with all members filled\r
+    #\r
     def FindPcd(self, Arch, ModuleName, Name, Guid, Type, PcdsSet):\r
         DatumType = ''\r
         Value = ''\r
@@ -904,15 +1282,22 @@ class WorkspaceBuild(object):
         # Not found in any platform and fdf\r
         #\r
         if not IsFoundInDsc:\r
-            ErrorMsg = "Pcd '%s.%s' defined in module '%s' is not found in any platform for %s" % (Guid, Name, ModuleName, Arch)\r
+            ErrorMsg = "Pcd '%s.%s' defined in module '%s' is not found in any platform" % (Guid, Name, ModuleName)\r
             EdkLogger.error("AutoGen", PARSER_ERROR, ErrorMsg)\r
 \r
         return PcdClassObject(Name, Guid, Type, DatumType, Value, Token, MaxDatumSize, SkuInfoList, IsOverrided)\r
 \r
+    ## Find Supportted Module List Of LibraryClass\r
     #\r
     # Search in InfDatabase, find the supmodulelist of the libraryclass\r
     #\r
-    def FindSupModuleListOfLibraryClass(self, LibraryClass, OverridedLibraryClassList):\r
+    # @param LibraryClass:               LibraryClass name for search\r
+    # @param OverridedLibraryClassList:  A list of all LibraryClass\r
+    # @param Arch:                       Supportted Arch\r
+    #\r
+    # @retval list SupModuleList\r
+    #\r
+    def FindSupModuleListOfLibraryClass(self, LibraryClass, OverridedLibraryClassList, Arch):\r
         Name = LibraryClass.Name\r
         FilePath = NormPath(LibraryClass.FilePath)\r
         SupModuleList = copy.copy(LibraryClass.SupModuleList)\r
@@ -924,7 +1309,7 @@ class WorkspaceBuild(object):
             EdkLogger.debug(EdkLogger.DEBUG_3, "\tLibraryClass %s supports all module types" % Name)\r
             for Item in OverridedLibraryClassList:\r
                 #\r
-                # Find a library class with the same name\r
+                # Find a library class (Item) with the same name\r
                 #\r
                 if Item.Name == Name:\r
                     #\r
@@ -935,7 +1320,7 @@ class WorkspaceBuild(object):
                     #\r
                     # If not itself, check arch first\r
                     #\r
-                    for Arch in LibraryClass.SupArchList:\r
+                    if Arch in LibraryClass.SupArchList:\r
                         #\r
                         # If arch is supportted, remove all related module type\r
                         #\r
@@ -947,13 +1332,18 @@ class WorkspaceBuild(object):
 \r
         return SupModuleList\r
 \r
+    ## Find Module inf Platform\r
     #\r
     # Check if the module is defined in <Compentent> of <Platform>\r
     #\r
+    # @param Inf:      Inf file (Module) need to be searched\r
+    # @param Arch:     Supportted Arch\r
+    # @param InfList:  A list for all Inf file\r
+    #\r
+    # @retval True     Mudule Found\r
+    # @retval Flase    Module Not Found\r
+    #\r
     def IsModuleDefinedInPlatform(self, Inf, Arch, InfList):\r
-#        for InfFile in InfList:\r
-#            if Inf == NormPath(InfFile):\r
-#                return True\r
         Inf = NormPath(Inf)\r
         for Dsc in self.DscDatabase.values():\r
             for LibraryClass in Dsc.Platform.LibraryClasses.LibraryList:\r
@@ -968,101 +1358,102 @@ class WorkspaceBuild(object):
 \r
         return False\r
 \r
+    ## Show all content of the workspacebuild\r
     #\r
-    # Show all content of the workspacebuild\r
+    # Print each item of the workspacebuild with (Key = Value) pair\r
     #\r
     def ShowWorkspaceBuild(self):\r
-        print ewb.DscDatabase\r
-        print ewb.InfDatabase\r
-        print ewb.DecDatabase\r
-        print 'SupArchList', ewb.SupArchList\r
-        print 'BuildTarget', ewb.BuildTarget\r
-        print 'SkuId', ewb.SkuId\r
-\r
-        for arch in ewb.SupArchList:\r
-            print arch\r
+        print self.DscDatabase\r
+        print self.InfDatabase\r
+        print self.DecDatabase\r
+        print 'SupArchList', self.SupArchList\r
+        print 'BuildTarget', self.BuildTarget\r
+        print 'SkuId', self.SkuId\r
+\r
+        for Arch in self.SupArchList:\r
+            print Arch\r
             print 'Platform'\r
-            for platform in ewb.Build[arch].PlatformDatabase.keys():\r
-                p = ewb.Build[arch].PlatformDatabase[platform]\r
-                print 'DescFilePath = ', p.DescFilePath\r
-                print 'PlatformName = ', p.PlatformName\r
-                print 'Guid = ', p.Guid\r
-                print 'Version = ', p.Version\r
-                print 'OutputDirectory = ', p.OutputDirectory\r
-                print 'FlashDefinition = ', p.FlashDefinition\r
-                print 'SkuIds = ', p.SkuIds\r
-                print 'Modules = ', p.Modules\r
-                print 'LibraryClasses = ', p.LibraryClasses\r
-                print 'Pcds = ', p.Pcds\r
-                for item in p.Pcds.keys():\r
-                    print p.Pcds[item]\r
-                print 'BuildOptions = ', p.BuildOptions\r
+            for Platform in self.Build[Arch].PlatformDatabase.keys():\r
+                P = self.Build[Arch].PlatformDatabase[Platform]\r
+                print 'DescFilePath = ', P.DescFilePath\r
+                print 'PlatformName = ', P.PlatformName\r
+                print 'Guid = ', P.Guid\r
+                print 'Version = ', P.Version\r
+                print 'OutputDirectory = ', P.OutputDirectory\r
+                print 'FlashDefinition = ', P.FlashDefinition\r
+                print 'SkuIds = ', P.SkuIds\r
+                print 'Modules = ', P.Modules\r
+                print 'LibraryClasses = ', P.LibraryClasses\r
+                print 'Pcds = ', P.Pcds\r
+                for item in P.Pcds.keys():\r
+                    print P.Pcds[item]\r
+                print 'BuildOptions = ', P.BuildOptions\r
                 print ''\r
             # End of Platform\r
 \r
             print 'package'\r
-            for package in ewb.Build[arch].PackageDatabase.keys():\r
-                p = ewb.Build[arch].PackageDatabase[package]\r
-                print 'DescFilePath = ', p.DescFilePath\r
-                print 'PackageName = ', p.PackageName\r
-                print 'Guid = ', p.Guid\r
-                print 'Version = ', p.Version\r
-                print 'Protocols = ', p.Protocols\r
-                print 'Ppis = ', p.Ppis\r
-                print 'Guids = ', p.Guids\r
-                print 'Includes = ', p.Includes\r
-                print 'LibraryClasses = ', p.LibraryClasses\r
-                print 'Pcds = ', p.Pcds\r
-                for item in p.Pcds.keys():\r
-                    print p.Pcds[item]\r
+            for Package in self.Build[Arch].PackageDatabase.keys():\r
+                P = self.Build[Arch].PackageDatabase[Package]\r
+                print 'DescFilePath = ', P.DescFilePath\r
+                print 'PackageName = ', P.PackageName\r
+                print 'Guid = ', P.Guid\r
+                print 'Version = ', P.Version\r
+                print 'Protocols = ', P.Protocols\r
+                print 'Ppis = ', P.Ppis\r
+                print 'Guids = ', P.Guids\r
+                print 'Includes = ', P.Includes\r
+                print 'LibraryClasses = ', P.LibraryClasses\r
+                print 'Pcds = ', P.Pcds\r
+                for item in P.Pcds.keys():\r
+                    print P.Pcds[item]\r
                 print ''\r
             # End of Package\r
 \r
             print 'module'\r
-            for module in ewb.Build[arch].ModuleDatabase.keys():\r
-                p = ewb.Build[arch].ModuleDatabase[module]\r
-                print 'DescFilePath = ', p.DescFilePath\r
-                print 'BaseName = ', p.BaseName\r
-                print 'ModuleType = ', p.ModuleType\r
-                print 'Guid = ', p.Guid\r
-                print 'Version = ', p.Version\r
-                print 'CustomMakefile = ', p.CustomMakefile\r
-                print 'Specification = ', p.Specification\r
-                print 'PcdIsDriver = ', p.PcdIsDriver\r
-                for Lib in p.LibraryClass:\r
+            for Module in self.Build[Arch].ModuleDatabase.keys():\r
+                P = self.Build[Arch].ModuleDatabase[Module]\r
+                print 'DescFilePath = ', P.DescFilePath\r
+                print 'BaseName = ', P.BaseName\r
+                print 'ModuleType = ', P.ModuleType\r
+                print 'Guid = ', P.Guid\r
+                print 'Version = ', P.Version\r
+                print 'CustomMakefile = ', P.CustomMakefile\r
+                print 'Specification = ', P.Specification\r
+                print 'PcdIsDriver = ', P.PcdIsDriver\r
+                for Lib in P.LibraryClass:\r
                     print 'LibraryClassDefinition = ', Lib.LibraryClass, 'SupModList = ', Lib.SupModList\r
-                print 'ModuleEntryPointList = ', p.ModuleEntryPointList\r
-                print 'ModuleUnloadImageList = ', p.ModuleUnloadImageList\r
-                print 'ConstructorList = ', p.ConstructorList\r
-                print 'DestructorList = ', p.DestructorList\r
+                print 'ModuleEntryPointList = ', P.ModuleEntryPointList\r
+                print 'ModuleUnloadImageList = ', P.ModuleUnloadImageList\r
+                print 'ConstructorList = ', P.ConstructorList\r
+                print 'DestructorList = ', P.DestructorList\r
 \r
                 print 'Binaries = '\r
-                for item in p.Binaries:\r
-                    print item.BinaryFile, item.FeatureFlag\r
+                for item in P.Binaries:\r
+                    print item.BinaryFile, item.FeatureFlag, item.SupArchList\r
                 print 'Sources = '\r
-                for item in p.Sources:\r
+                for item in P.Sources:\r
                     print item.SourceFile\r
-                print 'LibraryClasses = ', p.LibraryClasses\r
-                print 'Protocols = ', p.Protocols\r
-                print 'Ppis = ', p.Ppis\r
-                print 'Guids = ', p.Guids\r
-                print 'Includes = ', p.Includes\r
-                print 'Packages = ', p.Packages\r
-                print 'Pcds = ', p.Pcds\r
-                for item in p.Pcds.keys():\r
-                    print p.Pcds[item]\r
-                print 'BuildOptions = ', p.BuildOptions\r
-                print 'Depex = ', p.Depex\r
+                print 'LibraryClasses = ', P.LibraryClasses\r
+                print 'Protocols = ', P.Protocols\r
+                print 'Ppis = ', P.Ppis\r
+                print 'Guids = ', P.Guids\r
+                print 'Includes = ', P.Includes\r
+                print 'Packages = ', P.Packages\r
+                print 'Pcds = ', P.Pcds\r
+                for item in P.Pcds.keys():\r
+                    print P.Pcds[item]\r
+                print 'BuildOptions = ', P.BuildOptions\r
+                print 'Depex = ', P.Depex\r
                 print ''\r
             # End of Module\r
 \r
+##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
 # script.\r
 #\r
 if __name__ == '__main__':\r
-    # Nothing to do here. Could do some unit tests.\r
-    w = os.getenv('WORKSPACE')\r
-    ewb = WorkspaceBuild('Nt32Pkg/Nt32Pkg.dsc', w)\r
-    ewb.GenBuildDatabase({('PcdDevicePathSupportDevicePathFromText, gEfiMdeModulePkgTokenSpaceGuid') : 'KKKKKKKKKKKKKKKKKKKKK'}, ['Test.Inf'])\r
-    ewb.ShowWorkspaceBuild()\r
+    W = os.getenv('WORKSPACE')\r
+    Ewb = WorkspaceBuild('Nt32Pkg/Nt32Pkg.dsc', W)\r
+    Ewb.GenBuildDatabase({('PcdDevicePathSupportDevicePathFromText, gEfiMdeModulePkgTokenSpaceGuid') : 'KKKKKKKKKKKKKKKKKKKKK'}, ['Test.Inf'])\r
+    Ewb.ShowWorkspaceBuild()\r
index e79ba83..a24fd38 100755 (executable)
@@ -1,3 +1,6 @@
+## @file\r
+# This file is used to define the identification of INF/DEC/DSC files\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-"""\r
-This file is used to define the identification of INF/DEC/DSC files\r
-"""\r
-\r
+## Identification\r
+#\r
+# This class defined basic Identification information structure which is used by INF/DEC/DSC files\r
+#\r
+# @param object:          Inherited from object class\r
+#\r
+# @var FileName:          To store data for Filename\r
+# @var FileFullPath:      To store data for full path of the file\r
+# @var FileRelativePath:  To store data for relative path of the file\r
+# @var RunStatus:       Status of build system running\r
+#\r
 class Identification(object):\r
-  def __init__(self):\r
-    self.FileName = ''\r
-    self.FileFullPath = ''\r
-    self.FileRelativePath = ''\r
+    def __init__(self):\r
+        self.FileName = ''\r
+        self.FileFullPath = ''\r
+        self.FileRelativePath = ''\r
 \r
-  def GetFileName(self, FileFullPath, FileRelativePath):\r
-    pass\r
+    ## GetFileName\r
+    #\r
+    # Reserved\r
+    #\r
+    def GetFileName(self, FileFullPath, FileRelativePath):\r
+        pass\r
 \r
-  def GetFileFullPath(self, FileName, FileRelativePath):\r
-    pass\r
+    ## GetFileName\r
+    #\r
+    # Reserved\r
+    #\r
+    def GetFileFullPath(self, FileName, FileRelativePath):\r
+        pass\r
 \r
-  def GetFileRelativePath(self, FileName, FileFullPath):\r
-    pass\r
+    ## GetFileName\r
+    #\r
+    # Reserved\r
+    #\r
+    def GetFileRelativePath(self, FileName, FileFullPath):\r
+        pass\r
 \r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-  id = Identification()\r
+    id = Identification()\r
index 41869cc..514b570 100755 (executable)
@@ -1,16 +1,19 @@
+## @file\r
+# This file is used to define each component of INF file\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-#\r
-#This file is used to define each component of INF file\r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import os\r
 import EdkLogger\r
 from CommonDataClass.CommonClass import LibraryClassClass\r
@@ -21,21 +24,39 @@ from Identification import *
 from Dictionary import *\r
 from BuildToolError import *\r
 \r
+## InfObject\r
+#\r
+# This class defined basic Inf object which is used by inheriting\r
+# \r
+# @param object:       Inherited from object class\r
+#\r
 class InfObject(object):\r
     def __init__(self):\r
         object.__init__()\r
 \r
+## InfDefines\r
+#\r
+# This class defined basic Defines used in Inf object\r
+# \r
+# @param InfObject:        Inherited from InfObject class\r
+#\r
+# @var DefinesDictionary:  To store value for DefinesDictionary \r
+#\r
 class InfDefines(InfObject):\r
     def __init__(self):\r
         self.DefinesDictionary = {\r
-            #Required\r
+            #\r
+            # Required Fields\r
+            #\r
             TAB_INF_DEFINES_BASE_NAME                               : [''],\r
             TAB_INF_DEFINES_FILE_GUID                               : [''],\r
             TAB_INF_DEFINES_MODULE_TYPE                             : [''],\r
             TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION               : [''],\r
             TAB_INF_DEFINES_EDK_RELEASE_VERSION                     : [''],\r
             \r
-            #Optional            \r
+            #\r
+            # Optional Fields\r
+            #\r
             TAB_INF_DEFINES_INF_VERSION                             : [''],\r
             TAB_INF_DEFINES_BINARY_MODULE                           : [''],\r
             TAB_INF_DEFINES_LIBRARY_CLASS                           : [''],\r
@@ -59,6 +80,28 @@ class InfDefines(InfObject):
             TAB_INF_DEFINES_CUSTOM_MAKEFILE                         : ['']\r
         }\r
 \r
+## InfContents\r
+#\r
+# This class defined basic Contents used in Inf object\r
+# \r
+# @param InfObject:   Inherited from InfObject class\r
+#\r
+# @var Sources:       To store value for Sources\r
+# @var BuildOptions:  To store value for BuildOptions\r
+# @var Binaries:      To store value for Binaries\r
+# @var Includes:      To store value for Includes\r
+# @var Guids:         To store value for Guids\r
+# @var Protocols:     To store value for Protocols\r
+# @var Ppis:          To store value for Ppis\r
+# @var Libraries:     To store value for Libraries\r
+# @var Packages:      To store value for Packages\r
+# @var FixedPcd:      To store value for FixedPcd\r
+# @var PatchPcd:      To store value for PatchPcd\r
+# @var Pcd:           To store value for Pcd\r
+# @var PcdEx:         To store value for PcdEx\r
+# @var Depex:         To store value for Depex\r
+# @var Nmake:         To store value for Nmake\r
+#\r
 class InfContents(InfObject):\r
     def __init__(self):\r
         self.Sources = []\r
@@ -78,7 +121,31 @@ class InfContents(InfObject):
         self.PcdEx = []\r
         self.Depex = []\r
         self.Nmake = []\r
-        \r
+\r
+## Inf\r
+#\r
+# This class defined the structure used in Inf object\r
+# \r
+# @param InfObject:         Inherited from InfObject class\r
+# @param Ffilename:         Input value for Ffilename of Inf file, default is None\r
+# @param IsMergeAllArches:  Input value for IsMergeAllArches\r
+#                           True is to merge all arches\r
+#                           Fales is not to merge all arches\r
+#                           default is False\r
+# @param IsToModule:        Input value for IsToModule\r
+#                           True is to transfer to ModuleObject automatically\r
+#                           False is not to transfer to ModuleObject automatically\r
+#                           default is False\r
+# @param WorkspaceDir:      Input value for current workspace directory, default is None\r
+#\r
+# @var Identification:      To store value for Identification, it is a structure as Identification\r
+# @var Defines:             To store value for Defines, it is a structure as InfDefines\r
+# @var UserExtensions:      To store value for UserExtensions\r
+# @var Module:              To store value for Module, it is a structure as ModuleClass\r
+# @var WorkspaceDir:        To store value for WorkspaceDir\r
+# @var Contents:            To store value for Contents, it is a structure as InfContents\r
+# @var KeyList:             To store value for KeyList, a list for all Keys used in Dec\r
+#\r
 class Inf(InfObject):\r
     def __init__(self, Filename = None, IsMergeAllArches = False, IsToModule = False, WorkspaceDir = None):\r
         self.Identification = Identification()\r
@@ -95,22 +162,44 @@ class Inf(InfObject):
             TAB_SOURCES, TAB_BUILD_OPTIONS, TAB_BINARIES, TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, TAB_PACKAGES, TAB_LIBRARIES, \\r
             TAB_INF_FIXED_PCD, TAB_INF_PATCH_PCD, TAB_INF_FEATURE_PCD, TAB_INF_PCD, TAB_INF_PCD_EX, TAB_DEPEX, TAB_NMAKE\r
         ]\r
-                \r
+\r
+        #\r
+        # Load Inf file if filename is not None\r
+        #\r
         if Filename != None:\r
             self.LoadInfFile(Filename)\r
         \r
+        #\r
+        # Merge contents of Inf from all arches if IsMergeAllArches is True\r
+        #        \r
         if IsMergeAllArches:\r
             self.MergeAllArches()\r
-        \r
+\r
+        #\r
+        # Transfer to Module Object if IsToModule is True\r
+        #\r
         if IsToModule:\r
             self.InfToModule()\r
-    \r
+\r
+    ## Merge contents of Inf from all arches\r
+    #\r
+    # Find the contents defined in all arches and merge them to all\r
+    #\r
     def MergeAllArches(self):\r
-        for key in self.KeyList:\r
-            for arch in DataType.ARCH_LIST:\r
-                Command = "self.Contents[arch]." + key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + key + ")"\r
+        for Key in self.KeyList:\r
+            for Arch in DataType.ARCH_LIST:\r
+                Command = "self.Contents[Arch]." + Key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + Key + ")"\r
                 eval(Command)     \r
-            \r
+\r
+    ## Parse Inf file\r
+    #\r
+    # Go through input lines one by one to find the value defined in Key section.\r
+    # Save them to KeyField\r
+    #\r
+    # @param Lines:     Lines need to be parsed\r
+    # @param Key:       The key value of the section to be located\r
+    # @param KeyField:  To save the found contents\r
+    #\r
     def ParseInf(self, Lines, Key, KeyField):\r
         newKey = SplitModuleType(Key)\r
         if newKey[0].upper().find(DataType.TAB_LIBRARY_CLASSES.upper()) != -1:\r
@@ -118,6 +207,10 @@ class Inf(InfObject):
         else:\r
             GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
 \r
+    ## Transfer to Module Object\r
+    # \r
+    # Transfer all contents of an Inf file to a standard Module Object\r
+    #\r
     def InfToModule(self):\r
         #\r
         # Get value for Header\r
@@ -268,12 +361,23 @@ class Inf(InfObject):
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].LibraryClasses:\r
                 Status = GenDefines(Item[0], Arch, Defines)\r
-                if Status == 0:       # Find DEFINE statement\r
+                #\r
+                # Find DEFINE statement\r
+                #\r
+                if Status == 0:\r
                     pass\r
-                elif Status == -1:    # Find DEFINE statement but in wrong format\r
+                #\r
+                # Find DEFINE statement but in wrong format\r
+                #\r
+                elif Status == -1:\r
                     RaiseParserError(Item[0], 'LibraryClasses', File, 'DEFINE <VarName> = <PATH>')\r
-                elif Status == 1:     # Not find DEFINE statement\r
-                    #{ (LibraryClass, Instance, PcdFeatureFlag, ModuleType1|ModuleType2|ModuleType3) : [Arch1, Arch2, ...] }\r
+                #\r
+                # Not find DEFINE statement\r
+                #\r
+                elif Status == 1:\r
+                    #\r
+                    # { (LibraryClass, Instance, PcdFeatureFlag, ModuleType1|ModuleType2|ModuleType3) : [Arch1, Arch2, ...] }\r
+                    #\r
                     ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2))\r
                     CheckFileType(ItemList[1], '.Inf', self.Module.Header.FullPath, 'LibraryClasses', Item[0])\r
                     CheckFileExist(self.WorkspaceDir, ItemList[1], self.Module.Header.FullPath, 'LibraryClasses', Item[0])\r
@@ -301,11 +405,20 @@ class Inf(InfObject):
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Packages:\r
                 Status = GenDefines(Item, Arch, Defines)\r
-                if Status == 0:       # Find DEFINE statement\r
+                #\r
+                # Find DEFINE statement\r
+                #\r
+                if Status == 0:\r
                     pass\r
-                elif Status == -1:    # Find DEFINE statement but in wrong format\r
+                #\r
+                # Find DEFINE statement but in wrong format\r
+                #\r
+                elif Status == -1:\r
                     RaiseParserError(Item[0], 'Packages', File, 'DEFINE <VarName> = <PATH>')\r
-                elif Status == 1:     # Not find DEFINE statement\r
+                #\r
+                # Not find DEFINE statement\r
+                #\r
+                elif Status == 1:\r
                     CheckFileType(Item, '.Dec', self.Module.Header.FullPath, 'package', Item)\r
                     CheckFileExist(self.WorkspaceDir, Item, self.Module.Header.FullPath, 'Packages', Item)\r
                     MergeArches(Packages, Item, Arch)\r
@@ -454,11 +567,20 @@ class Inf(InfObject):
             Line = ''\r
             for Item in self.Contents[Arch].Depex:\r
                 Status = GenDefines(Item, Arch, Defines)\r
-                if Status == 0:       # Find DEFINE statement\r
+                #\r
+                # Find DEFINE statement\r
+                #\r
+                if Status == 0:\r
                     pass\r
-                elif Status == -1:    # Find DEFINE statement but in wrong format\r
+                #\r
+                # Find DEFINE statement but in wrong format\r
+                #\r
+                elif Status == -1:\r
                     RaiseParserError(Item, 'Depex', File, 'DEFINE <VarName> = <PATH>')\r
-                elif Status == 1:     # Not find DEFINE statement\r
+                #\r
+                # Not find DEFINE statement\r
+                #\r
+                elif Status == 1:\r
                     Line = Line + Item + ' '\r
             MergeArches(Depex, Line, Arch)\r
         for Key in Depex.keys():\r
@@ -486,9 +608,15 @@ class Inf(InfObject):
             Binary = ModuleBinaryFileClass(Key[1], Key[0], Key[2], Key[3], Binaries[Key])\r
             self.Module.Binaries.append(Binary)\r
         \r
+    ## Get Pcd Values of Inf\r
+    #\r
+    # Get Pcd of Inf as <TokenSpaceGuidCName>.<PcdCName>[|<Value>]\r
     #\r
-    # Get Pcd of Dec as <TokenSpaceGuidCName>.<PcdCName>[|<Value>]\r
-    # Return (TokenSpcCName, TokenCName, Value, ItemType)\r
+    # @param Item:  The string describes pcd\r
+    # @param Type:  The type of Pcd\r
+    # @param File:  The file which describes the pcd, used for error report\r
+    #\r
+    # @retval (TokenSpcCName, TokenCName, Value, ItemType) Formatted Pcd Item\r
     #\r
     def GetPcdOfInf(self, Item, Type, File):\r
         Format = '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'\r
@@ -516,7 +644,13 @@ class Inf(InfObject):
             RaiseParserError(Item, 'Pcds' + Type, File, Format)\r
 \r
         return (TokenInfo[0], TokenInfo[1], List[1], Type)\r
-    \r
+\r
+    ## Load Inf file\r
+    #\r
+    # Load the file if it exists\r
+    #\r
+    # @param Filename:  Input value for filename of Inf file\r
+    #\r
     def LoadInfFile(self, Filename):     \r
         (Filepath, Name) = os.path.split(Filename)\r
         self.Identification.FileName = Name\r
@@ -552,8 +686,9 @@ class Inf(InfObject):
                                 continue\r
             #EndFor\r
 \r
+    ## Show detailed information of Inf\r
     #\r
-    # Show detailed information of Inf\r
+    # Print all members and their values of Inf class\r
     #\r
     def ShowInf(self):\r
         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
@@ -567,85 +702,91 @@ class Inf(InfObject):
                 eval(Command)\r
         print ""\r
     \r
+    ## Show detailed information of Module\r
     #\r
-    # Show detailed information of Module\r
+    # Print all members and their values of Module class\r
     #\r
     def ShowModule(self):\r
-        m = self.Module\r
-        print 'Filename =', m.Header.FileName\r
-        print 'FullPath =', m.Header.FullPath\r
-        print 'BaseName =', m.Header.Name\r
-        print 'Guid =', m.Header.Guid\r
-        print 'Version =', m.Header.Version\r
-        print 'InfVersion =', m.Header.InfVersion\r
-        print 'EfiSpecificationVersion =', m.Header.EfiSpecificationVersion\r
-        print 'EdkReleaseVersion =', m.Header.EdkReleaseVersion                \r
-        print 'ModuleType =', m.Header.ModuleType\r
-        print 'BinaryModule =', m.Header.BinaryModule\r
-        print 'ComponentType =', m.Header.ComponentType\r
-        print 'MakefileName =', m.Header.MakefileName\r
-        print 'BuildNumber =', m.Header.BuildNumber\r
-        print 'BuildType =', m.Header.BuildType\r
-        print 'FfsExt =', m.Header.FfsExt\r
-        print 'FvExt =', m.Header.FvExt\r
-        print 'SourceFv =', m.Header.SourceFv\r
-        print 'PcdIsDriver =', m.Header.PcdIsDriver\r
-        print 'TianoR8FlashMap_h =', m.Header.TianoR8FlashMap_h\r
-        print 'LibraryClass =', m.Header.LibraryClass\r
-        for Item in m.Header.LibraryClass:\r
+        M = self.Module\r
+        print 'Filename =', M.Header.FileName\r
+        print 'FullPath =', M.Header.FullPath\r
+        print 'BaseName =', M.Header.Name\r
+        print 'Guid =', M.Header.Guid\r
+        print 'Version =', M.Header.Version\r
+        print 'InfVersion =', M.Header.InfVersion\r
+        print 'EfiSpecificationVersion =', M.Header.EfiSpecificationVersion\r
+        print 'EdkReleaseVersion =', M.Header.EdkReleaseVersion                \r
+        print 'ModuleType =', M.Header.ModuleType\r
+        print 'BinaryModule =', M.Header.BinaryModule\r
+        print 'ComponentType =', M.Header.ComponentType\r
+        print 'MakefileName =', M.Header.MakefileName\r
+        print 'BuildNumber =', M.Header.BuildNumber\r
+        print 'BuildType =', M.Header.BuildType\r
+        print 'FfsExt =', M.Header.FfsExt\r
+        print 'FvExt =', M.Header.FvExt\r
+        print 'SourceFv =', M.Header.SourceFv\r
+        print 'PcdIsDriver =', M.Header.PcdIsDriver\r
+        print 'TianoR8FlashMap_h =', M.Header.TianoR8FlashMap_h\r
+        print 'LibraryClass =', M.Header.LibraryClass\r
+        for Item in M.Header.LibraryClass:\r
             print Item.LibraryClass, DataType.TAB_VALUE_SPLIT.join(Item.SupModuleList)\r
-        print 'CustomMakefile =', m.Header.CustomMakefile\r
+        print 'CustomMakefile =', M.Header.CustomMakefile\r
         for Item in self.Module.ExternImages:\r
             print 'Entry_Point = %s, UnloadImage = %s' % (Item.ModuleEntryPoint, Item.ModuleUnloadImage)\r
         for Item in self.Module.ExternLibraries:\r
             print 'Constructor = %s, Destructor = %s' % (Item.Constructor, Item.Destructor)\r
-        print 'Define =', m.Header.Define\r
-        print 'Specification =', m.Header.Specification\r
-        print '\nBuildOptions =', m.BuildOptions\r
-        for Item in m.BuildOptions:\r
+        print 'Define =', M.Header.Define\r
+        print 'Specification =', M.Header.Specification\r
+        print '\nBuildOptions =', M.BuildOptions\r
+        for Item in M.BuildOptions:\r
             print Item.ToolChainFamily, Item.ToolChain, Item.Option, Item.SupArchList\r
-        print '\nIncludes =', m.Includes\r
-        for Item in m.Includes:\r
+        print '\nIncludes =', M.Includes\r
+        for Item in M.Includes:\r
             print Item.FilePath, Item.SupArchList\r
-        print '\nLibraries =', m.Libraries\r
-        for Item in m.Libraries:\r
+        print '\nLibraries =', M.Libraries\r
+        for Item in M.Libraries:\r
             print Item.Library, Item.SupArchList\r
-        print '\nLibraryClasses =', m.LibraryClasses\r
-        for Item in m.LibraryClasses:\r
+        print '\nLibraryClasses =', M.LibraryClasses\r
+        for Item in M.LibraryClasses:\r
             print Item.LibraryClass, Item.RecommendedInstance, Item.FeatureFlag, Item.SupModuleList, Item.SupArchList, Item.Define\r
-        print '\nPackageDependencies =', m.PackageDependencies\r
-        for Item in m.PackageDependencies:\r
+        print '\nPackageDependencies =', M.PackageDependencies\r
+        for Item in M.PackageDependencies:\r
             print Item.FilePath, Item.SupArchList, Item.Define\r
-        print '\nNmake =', m.Nmake\r
-        for Item in m.Nmake:\r
+        print '\nNmake =', M.Nmake\r
+        for Item in M.Nmake:\r
             print Item.Name, Item.Value, Item.SupArchList\r
-        print '\nPcds =', m.PcdCodes\r
-        for Item in m.PcdCodes:\r
+        print '\nPcds =', M.PcdCodes\r
+        for Item in M.PcdCodes:\r
             print '\tCName=',Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, Item.SupArchList\r
-        print '\nSources =', m.Sources\r
-        for Source in m.Sources:\r
+        print '\nSources =', M.Sources\r
+        for Source in M.Sources:\r
             print Source.SourceFile, 'Fam=', Source.ToolChainFamily, 'Pcd=', Source.FeatureFlag, 'Tag=', Source.TagName, 'ToolCode=', Source.ToolCode, Source.SupArchList\r
-        print '\nUserExtensions =', m.UserExtensions\r
-        for UserExtension in m.UserExtensions:\r
+        print '\nUserExtensions =', M.UserExtensions\r
+        for UserExtension in M.UserExtensions:\r
             print UserExtension.UserID, UserExtension.Identifier,UserExtension.Content\r
-        print '\nGuids =', m.Guids\r
-        for Item in m.Guids:\r
+        print '\nGuids =', M.Guids\r
+        for Item in M.Guids:\r
             print Item.CName, Item.SupArchList\r
-        print '\nProtocols =', m.Protocols\r
-        for Item in m.Protocols:\r
+        print '\nProtocols =', M.Protocols\r
+        for Item in M.Protocols:\r
             print Item.CName, Item.SupArchList\r
-        print '\nPpis =', m.Ppis\r
-        for Item in m.Ppis:\r
+        print '\nPpis =', M.Ppis\r
+        for Item in M.Ppis:\r
             print Item.CName, Item.SupArchList\r
-        print '\nDepex =', m.Depex\r
-        for Item in m.Depex:\r
+        print '\nDepex =', M.Depex\r
+        for Item in M.Depex:\r
             print Item.Depex, Item.SupArchList, Item.Define\r
-        print '\nBinaries =', m.Binaries\r
-        for Binary in m.Binaries:\r
-            print 'Type=', Binary.FileType, 'Target=', Binary.Target, 'Name=', Binary.BinaryFile, Binary.FeatureFlag\r
-        \r
+        print '\nBinaries =', M.Binaries\r
+        for Binary in M.Binaries:\r
+            print 'Type=', Binary.FileType, 'Target=', Binary.Target, 'Name=', Binary.BinaryFile, 'FeatureFlag=', Binary.FeatureFlag, 'SupArchList=', Binary.SupArchList\r
+\r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-    w = os.getenv('WORKSPACE')\r
-    f = os.path.join(w, 'MdeModulePkg/Application/HelloWorld/HelloWorld.inf')\r
-    p = Inf(os.path.normpath(f), True, True, w)\r
-    p.ShowModule()\r
+    W = os.getenv('WORKSPACE')\r
+    F = os.path.join(W, 'MdeModulePkg/Application/HelloWorld/HelloWorld.inf')\r
+    P = Inf(os.path.normpath(F), True, True, W)\r
+    P.ShowModule()\r
index 04fff15..e284723 100644 (file)
@@ -1,45 +1,69 @@
+## @file\r
+# This file is used to define common string related functions used in parsing process \r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-#\r
-#This file is used to define some common useful string functions\r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import DataType\r
 import os.path\r
 import string\r
 import EdkLogger\r
 from BuildToolError import *\r
 \r
+## GetSplitValueList\r
 #\r
 # Get a value list from a string with multiple values splited with SplitTag\r
 # The default SplitTag is DataType.TAB_VALUE_SPLIT\r
 # 'AAA|BBB|CCC' -> ['AAA', 'BBB', 'CCC']\r
 #\r
+# @param String:    The input string to be splitted\r
+# @param SplitTag:  The split key, default is DataType.TAB_VALUE_SPLIT\r
+# @param MaxSplit:  The max number of split values, default is -1\r
+#\r
+# @retval list() A list for splitted string\r
+#\r
 def GetSplitValueList(String, SplitTag = DataType.TAB_VALUE_SPLIT, MaxSplit = -1):\r
     return map(lambda l: l.strip(), String.split(SplitTag, MaxSplit))\r
 \r
+## MergeArches\r
 #\r
 # Find a key's all arches in dict, add the new arch to the list\r
 # If not exist any arch, set the arch directly\r
 #\r
+# @param Dict:  The input value for Dict\r
+# @param Key:   The input value for Key\r
+# @param Arch:  The Arch to be added or merged\r
+#\r
 def MergeArches(Dict, Key, Arch):\r
     if Key in Dict.keys():\r
         Dict[Key].append(Arch)\r
     else:\r
         Dict[Key] = Arch.split()\r
 \r
+## GenDefines\r
 #\r
 # Parse a string with format "DEFINE <VarName> = <PATH>"\r
 # Generate a map Defines[VarName] = PATH\r
 # Return False if invalid format\r
 #\r
+# @param String:   String with DEFINE statement\r
+# @param Arch:     Supportted Arch\r
+# @param Defines:  DEFINE statement to be parsed\r
+#\r
+# @retval 0   DEFINE statement found, and valid\r
+# @retval 1   DEFINE statement found, but not valid\r
+# @retval -1  DEFINE statement not found\r
+#\r
 def GenDefines(String, Arch, Defines):\r
     if String.find(DataType.TAB_DEFINE + ' ') > -1:\r
         List = String.replace(DataType.TAB_DEFINE + ' ', '').split(DataType.TAB_EQUAL_SPLIT)\r
@@ -51,11 +75,19 @@ def GenDefines(String, Arch, Defines):
 \r
     return 1\r
 \r
+## GenInclude\r
 #\r
 # Parse a string with format "!include <Filename>"\r
 # Return the file path\r
 # Return False if invalid format or NOT FOUND\r
 #\r
+# @param String:        String with INCLUDE statement\r
+# @param IncludeFiles:  INCLUDE statement to be parsed\r
+# @param Arch:          Supportted Arch\r
+#\r
+# @retval True\r
+# @retval False\r
+#\r
 def GenInclude(String, IncludeFiles, Arch):\r
     if String.upper().find(DataType.TAB_INCLUDE.upper() + ' ') > -1:\r
         IncludeFile = CleanString(String[String.upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
@@ -64,10 +96,15 @@ def GenInclude(String, IncludeFiles, Arch):
     else:\r
         return False\r
 \r
+## GetExec\r
 #\r
 # Parse a string with format "InfFilename [EXEC = ExecFilename]"\r
 # Return (InfFilename, ExecFilename)\r
 #\r
+# @param String:  String with EXEC statement\r
+#\r
+# @retval truple() A pair as (InfFilename, ExecFilename)\r
+#\r
 def GetExec(String):\r
     InfFilename = ''\r
     ExecFilename = ''\r
@@ -79,10 +116,16 @@ def GetExec(String):
 \r
     return (InfFilename, ExecFilename)\r
 \r
+## GetBuildOption\r
 #\r
 # Parse a string with format "[<Family>:]<ToolFlag>=Flag"\r
 # Return (Family, ToolFlag, Flag)\r
 #\r
+# @param String:  String with BuildOption statement\r
+# @param File:    The file which defines build option, used in error report\r
+#\r
+# @retval truple() A truple structure as (Family, ToolChain, Flag)\r
+#\r
 def GetBuildOption(String, File):\r
     if String.find(DataType.TAB_EQUAL_SPLIT) < 0:\r
         RaiseParserError(String, 'BuildOptions', File, '[<Family>:]<ToolFlag>=Flag')\r
@@ -97,12 +140,19 @@ def GetBuildOption(String, File):
 \r
     return (Family, ToolChain, Flag)\r
 \r
+## GetComponents\r
 #\r
 # Parse block of the components defined in dsc file\r
-# Return KeyValues [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...]\r
+# Set KeyValues as [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...]\r
+#\r
+# @param Lines:             The content to be parsed\r
+# @param Key:               Reserved \r
+# @param KeyValues:         To store data after parsing\r
+# @param CommentCharacter:  Comment char, used to ignore comment content\r
+#\r
+# @retval True Get component successfully\r
 #\r
 def GetComponents(Lines, Key, KeyValues, CommentCharacter):\r
-    #KeyValues [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...]\r
     if Lines.find(DataType.TAB_SECTION_END) > -1:\r
         Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1]\r
     (findBlock, findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, False, False, False, False, False)\r
@@ -119,11 +169,16 @@ def GetComponents(Lines, Key, KeyValues, CommentCharacter):
 \r
         if findBlock == False:\r
             ListItem = Line\r
-            #find '{' at line tail\r
+            #\r
+            # find '{' at line tail\r
+            #\r
             if Line.endswith('{'):\r
                 findBlock = True\r
                 ListItem = CleanString(Line.rsplit('{', 1)[0], CommentCharacter)\r
 \r
+        #\r
+        # Parse a block content\r
+        #\r
         if findBlock:\r
             if Line.find('<LibraryClasses>') != -1:\r
                 (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (True, False, False, False, False, False, False)\r
@@ -147,7 +202,9 @@ def GetComponents(Lines, Key, KeyValues, CommentCharacter):
                 (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, False, False, False, True)\r
                 continue\r
             if Line.endswith('}'):\r
-                #find '}' at line tail\r
+                #\r
+                # find '}' at line tail\r
+                #\r
                 KeyValues.append([ListItem, LibraryClassItem, BuildOption, Pcd])\r
                 findBlock = False\r
                 findLibraryClass = False\r
@@ -182,9 +239,17 @@ def GetComponents(Lines, Key, KeyValues, CommentCharacter):
 \r
     return True\r
 \r
+## GetLibraryClassesWithModuleType\r
 #\r
 # Get Library Class definition when no module type defined\r
 #\r
+# @param Lines:             The content to be parsed\r
+# @param Key:               Reserved \r
+# @param KeyValues:         To store data after parsing\r
+# @param CommentCharacter:  Comment char, used to ignore comment content\r
+#\r
+# @retval True Get library classes successfully\r
+#\r
 def GetLibraryClassesWithModuleType(Lines, Key, KeyValues, CommentCharacter):\r
     newKey = SplitModuleType(Key)\r
     Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1]\r
@@ -196,9 +261,17 @@ def GetLibraryClassesWithModuleType(Lines, Key, KeyValues, CommentCharacter):
 \r
     return True\r
 \r
+## GetDynamics\r
 #\r
 # Get Dynamic Pcds\r
 #\r
+# @param Lines:             The content to be parsed\r
+# @param Key:               Reserved \r
+# @param KeyValues:         To store data after parsing\r
+# @param CommentCharacter:  Comment char, used to ignore comment content\r
+#\r
+# @retval True Get Dynamic Pcds successfully\r
+#\r
 def GetDynamics(Lines, Key, KeyValues, CommentCharacter):\r
     #\r
     # Get SkuId Name List\r
@@ -214,14 +287,25 @@ def GetDynamics(Lines, Key, KeyValues, CommentCharacter):
 \r
     return True\r
 \r
+## SplitModuleType\r
 #\r
 # Split ModuleType out of section defien to get key\r
 # [LibraryClass.Arch.ModuleType|ModuleType|ModuleType] -> [ 'LibraryClass.Arch', ['ModuleType', 'ModuleType', 'ModuleType'] ]\r
 #\r
+# @param Key:  String to be parsed\r
+#\r
+# @retval ReturnValue A list for module types\r
+#\r
 def SplitModuleType(Key):\r
     KeyList = Key.split(DataType.TAB_SPLIT)\r
-    KeyList.append('')                    # Fill in for arch\r
-    KeyList.append('')                    # Fill in for moduletype\r
+    #\r
+    # Fill in for arch\r
+    #\r
+    KeyList.append('')\r
+    #\r
+    # Fill in for moduletype\r
+    #\r
+    KeyList.append('')\r
     ReturnValue = []\r
     KeyValue = KeyList[0]\r
     if KeyList[1] != '':\r
@@ -231,38 +315,74 @@ def SplitModuleType(Key):
 \r
     return ReturnValue\r
 \r
+## NormPath\r
 #\r
 # Create a normal path\r
 # And replace DFEINE in the path\r
 #\r
+# @param Path:     The input value for Path to be converted\r
+# @param Defines:  A set for DEFINE statement\r
+#\r
+# @retval Path Formatted path\r
+#\r
 def NormPath(Path, Defines = {}):\r
     if Path != '':\r
+        #\r
         # Replace with Define\r
+        #\r
         for Key in Defines.keys():\r
             Path = Path.replace(Key, Defines[Key])\r
 \r
+        #\r
         # Remove ${WORKSPACE}\r
+        #\r
         Path = Path.replace(DataType.TAB_WORKSPACE, '')\r
 \r
+        #\r
         # To local path format\r
+        #\r
         Path = os.path.normpath(Path)\r
 \r
     return Path\r
 \r
+## CleanString\r
 #\r
 # Remove comments in a string\r
 # Remove spaces\r
 #\r
+# @param Line:              The string to be cleaned\r
+# @param CommentCharacter:  Comment char, used to ignore comment content, default is DataType.TAB_COMMENT_SPLIT\r
+#\r
+# @retval Path Formatted path\r
+#\r
 def CleanString(Line, CommentCharacter = DataType.TAB_COMMENT_SPLIT):\r
-    #remove whitespace\r
+    #\r
+    # remove whitespace\r
+    #\r
     Line = Line.strip();\r
-    #remove comments\r
+    #\r
+    # remove comments\r
+    #\r
     Line = Line.split(CommentCharacter, 1)[0];\r
-    #remove whitespace again\r
+    #\r
+    # remove whitespace again\r
+    #\r
     Line = Line.strip();\r
 \r
     return Line\r
 \r
+## GetMultipleValuesOfKeyFromLines\r
+#\r
+# Parse multiple strings to clean comment and spaces\r
+# The result is saved to KeyValues\r
+#\r
+# @param Lines:             The content to be parsed\r
+# @param Key:               Reserved \r
+# @param KeyValues:         To store data after parsing\r
+# @param CommentCharacter:  Comment char, used to ignore comment content\r
+#\r
+# @retval True Successfully executed\r
+#\r
 def GetMultipleValuesOfKeyFromLines(Lines, Key, KeyValues, CommentCharacter):\r
     Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1]\r
     LineList = Lines.split('\n')\r
@@ -273,10 +393,37 @@ def GetMultipleValuesOfKeyFromLines(Lines, Key, KeyValues, CommentCharacter):
 \r
     return True\r
 \r
+## GetDefineValue\r
+#\r
+# Parse a DEFINE statement to get defined value\r
+# DEFINE Key Value\r
+#\r
+# @param String:            The content to be parsed\r
+# @param Key:               The key of DEFINE statement\r
+# @param CommentCharacter:  Comment char, used to ignore comment content\r
+#\r
+# @retval string The defined value\r
+#\r
 def GetDefineValue(String, Key, CommentCharacter):\r
     String = CleanString(String)\r
     return String[String.find(Key + ' ') + len(Key + ' ') : ]\r
 \r
+## GetSingleValueOfKeyFromLines\r
+#\r
+# Parse multiple strings as below to get value of each definition line\r
+# Key1 = Value1\r
+# Key2 = Value2\r
+# The result is saved to Dictionary\r
+#\r
+# @param Lines:                The content to be parsed\r
+# @param Dictionary:           To store data after parsing\r
+# @param CommentCharacter:     Comment char, be used to ignore comment content\r
+# @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
+# @param ValueSplitFlag:       Value split flag, be used to decide if has multiple values\r
+# @param ValueSplitCharacter:  Value split char, be used to split multiple values. Key1 = Value1|Value2, '|' is the value split char\r
+#\r
+# @retval True Successfully executed\r
+#\r
 def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter):\r
     Lines = Lines.split('\n')\r
     Keys = []\r
@@ -306,7 +453,9 @@ def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCh
         if len(LineList) >= 2:\r
             Key = LineList[0].split()\r
             if len(Key) == 1 and Key[0][0] != CommentCharacter:\r
-                #Remove comments and white spaces\r
+                #\r
+                # Remove comments and white spaces\r
+                #\r
                 LineList[1] = CleanString(LineList[1], CommentCharacter)\r
                 if ValueSplitFlag:\r
                     Value = map(string.strip, LineList[1].split(ValueSplitCharacter))\r
@@ -328,11 +477,16 @@ def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCh
 \r
     return True\r
 \r
+## The content to be parsed\r
 #\r
 # Do pre-check for a file before it is parsed\r
 # Check $()\r
 # Check []\r
 #\r
+# @param FileName:       Used for error report\r
+# @param FileContent:    File content to be parsed\r
+# @param SupSectionTag:  Used for error report\r
+#\r
 def PreCheck(FileName, FileContent, SupSectionTag):\r
     LineNo = 0\r
     IsFailed = False\r
@@ -373,11 +527,20 @@ def PreCheck(FileName, FileContent, SupSectionTag):
     if IsFailed:\r
        EdkLogger.error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName)\r
 \r
+## CheckFileType\r
 #\r
 # Check if the Filename is including ExtName\r
-# Pass if it exists\r
+# Return True if it exists\r
 # Raise a error message if it not exists\r
 #\r
+# @param CheckFilename:      Name of the file to be checked\r
+# @param ExtName:            Ext name of the file to be checked\r
+# @param ContainerFilename:  The container file which describes the file to be checked, used for error report\r
+# @param SectionName:        Used for error report\r
+# @param Line:               The line in container file which defines the file to be checked\r
+#\r
+# @retval True The file type is correct\r
+#\r
 def CheckFileType(CheckFilename, ExtName, ContainerFilename, SectionName, Line):\r
     if CheckFilename != '' and CheckFilename != None:\r
         (Root, Ext) = os.path.splitext(CheckFilename)\r
@@ -390,11 +553,20 @@ def CheckFileType(CheckFilename, ExtName, ContainerFilename, SectionName, Line):
 \r
     return True\r
 \r
+## CheckFileExist\r
 #\r
 # Check if the file exists\r
-# Pass if it exists\r
+# Return True if it exists\r
 # Raise a error message if it not exists\r
 #\r
+# @param CheckFilename:      Name of the file to be checked\r
+# @param WorkspaceDir:       Current workspace dir\r
+# @param ContainerFilename:  The container file which describes the file to be checked, used for error report\r
+# @param SectionName:        Used for error report\r
+# @param Line:               The line in container file which defines the file to be checked\r
+#\r
+# @retval True The file exists\r
+#\r
 def CheckFileExist(WorkspaceDir, CheckFilename, ContainerFilename, SectionName, Line):\r
     if CheckFilename != '' and CheckFilename != None:\r
         CheckFile = WorkspaceFile(WorkspaceDir, NormPath(CheckFilename))\r
@@ -409,9 +581,16 @@ def CheckFileExist(WorkspaceDir, CheckFilename, ContainerFilename, SectionName,
 \r
     return True\r
 \r
+## CheckPcdTokenInfo\r
 #\r
 # Check if PcdTokenInfo is following <TokenSpaceGuidCName>.<PcdCName>\r
 #\r
+# @param TokenInfoString:  String to be checked\r
+# @param Section:          Used for error report\r
+# @param File:             Used for error report\r
+#\r
+# @retval True PcdTokenInfo is in correct format\r
+#\r
 def CheckPcdTokenInfo(TokenInfoString, Section, File):\r
     if TokenInfoString != '' and TokenInfoString != None:\r
         Format = '<TokenSpaceGuidCName>.<PcdCName>'\r
@@ -421,9 +600,16 @@ def CheckPcdTokenInfo(TokenInfoString, Section, File):
 \r
     return True\r
 \r
+## GetLineNo\r
 #\r
 # Find the index of a line in a file\r
 #\r
+# @param FileContent:  Search scope\r
+# @param Line:         Search key\r
+#\r
+# @retval int  Index of the line\r
+# @retval -1     The line is not found\r
+#\r
 def GetLineNo(FileContent, Line):\r
     LineList = FileContent.splitlines()\r
     for Index in range(len(LineList)):\r
@@ -432,21 +618,38 @@ def GetLineNo(FileContent, Line):
 \r
     return -1\r
 \r
+## RaiseParserError\r
 #\r
 # Raise a parser error\r
 #\r
+# @param Line:     String which has error\r
+# @param Section:  Used for error report\r
+# @param File:     File which has the string\r
+# @param Format:   Correct format\r
+#\r
 def RaiseParserError(Line, Section, File, Format):\r
     LineNo = GetLineNo(open(os.path.normpath(File), 'r').read(), Line)\r
     ErrorMsg = "Invalid statement '%s' is found in section '%s'" % (Line, Section)\r
     EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=File, Line=LineNo,\r
                     ExtraData="Correct format is " + Format)\r
 \r
+## WorkspaceFile\r
 #\r
 # Return a full path with workspace dir\r
 #\r
+# @param WorkspaceDir:  Workspace dir\r
+# @param Filename:      Relative file name\r
+#\r
+# @retval string A full path\r
+# \r
 def WorkspaceFile(WorkspaceDir, Filename):\r
     return os.path.join(NormPath(WorkspaceDir), NormPath(Filename))\r
 \r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
     print SplitModuleType('LibraryClasses.common.DXE_RUNTIME_DRIVER')\r
     print SplitModuleType('Library.common')\r
index 8d3abaf..5ac8b32 100644 (file)
@@ -1,23 +1,35 @@
+## @file\r
+# This file is used to define each component of Target.txt file\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
 #\r
-#This file is used to define each component of Target.txt file\r
+\r
+##\r
+# Import Modules\r
 #\r
 import os\r
 import EdkLogger\r
 import DataType\r
 from BuildToolError import *\r
 \r
-\r
+## TargetTxtClassObject\r
+#\r
+# This class defined content used in file target.txt\r
+# \r
+# @param object:             Inherited from object class\r
+# @param Filename:           Input value for full path of target.txt\r
+#\r
+# @var TargetTxtDictionary:  To store keys and values defined in target.txt\r
+#\r
 class TargetTxtClassObject(object):\r
-    def __init__(self, filename = None):\r
+    def __init__(self, Filename = None):\r
         self.TargetTxtDictionary = {\r
             DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM                            : '',\r
             DataType.TAB_TAT_DEFINES_ACTIVE_MODULE                              : '',\r
@@ -28,24 +40,41 @@ class TargetTxtClassObject(object):
             DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG                             : [],\r
             DataType.TAB_TAT_DEFINES_TARGET_ARCH                                : []\r
         }\r
-        if filename != None:\r
-            self.LoadTargetTxtFile(filename)\r
+        if Filename != None:\r
+            self.LoadTargetTxtFile(Filename)\r
 \r
-    def LoadTargetTxtFile(self, filename):\r
-        if os.path.exists(filename) and os.path.isfile(filename):\r
-             return self.ConvertTextFileToDict(filename, '#', '=')\r
+    ## LoadTargetTxtFile\r
+    #\r
+    # Load target.txt file and parse it, return a set structure to store keys and values\r
+    #\r
+    # @param Filename:  Input value for full path of target.txt\r
+    #\r
+    # @retval set() A set structure to store keys and values\r
+    # @retval 1     Error happenes in parsing\r
+    #\r
+    def LoadTargetTxtFile(self, Filename):\r
+        if os.path.exists(Filename) and os.path.isfile(Filename):\r
+             return self.ConvertTextFileToDict(Filename, '#', '=')\r
         else:\r
-            EdkLogger.error("Target.txt Parser", FILE_NOT_FOUND, ExtraData=filename)\r
+            EdkLogger.error("Target.txt Parser", FILE_NOT_FOUND, ExtraData=Filename)\r
             return 1\r
 \r
-#\r
-# Convert a text file to a dictionary\r
-#\r
+    ## ConvertTextFileToDict\r
+    #\r
+    # Convert a text file to a dictionary of (name:value) pairs.\r
+    # The data is saved to self.TargetTxtDictionary\r
+    #\r
+    # @param FileName:             Text filename\r
+    # @param CommentCharacter:     Comment char, be used to ignore comment content\r
+    # @param KeySplitCharacter:    Key split char, between key name and key value. Key1 = Value1, '=' is the key split char\r
+    #\r
+    # @retval 0 Convert successfully\r
+    # @retval 1 Open file failed\r
+    #\r
     def ConvertTextFileToDict(self, FileName, CommentCharacter, KeySplitCharacter):\r
-        """Convert a text file to a dictionary of (name:value) pairs."""\r
         try:\r
-            f = open(FileName,'r')\r
-            for Line in f:\r
+            F = open(FileName,'r')\r
+            for Line in F:\r
                 if Line.startswith(CommentCharacter) or Line.strip() == '':\r
                     continue\r
                 LineList = Line.split(KeySplitCharacter,1)\r
@@ -59,33 +88,57 @@ class TargetTxtClassObject(object):
                         elif Key == DataType.TAB_TAT_DEFINES_TARGET or Key == DataType.TAB_TAT_DEFINES_TARGET_ARCH \\r
                           or Key == DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG:\r
                             self.TargetTxtDictionary[Key] = LineList[1].split()\r
-            f.close()\r
+            F.close()\r
             return 0\r
         except:\r
             EdkLogger.quiet('Open file failed')\r
             return 1\r
 \r
-    def printDict(dict):\r
-        if dict != None:\r
-            KeyList = dict.keys()\r
+    ## Print the dictionary\r
+    #\r
+    # Print all items of dictionary one by one\r
+    #\r
+    # @param Dict:  The dictionary to be printed\r
+    #\r
+    def printDict(Dict):\r
+        if Dict != None:\r
+            KeyList = Dict.keys()\r
             for Key in KeyList:\r
-                if dict[Key] != '':\r
-                    print Key + ' = ' + str(dict[Key])\r
-\r
-    def printList(key, list):\r
-        if type(list) == type([]):\r
-            if len(list) > 0:\r
-                if key.find(TAB_SPLIT) != -1:\r
-                    print "\n" + key\r
-                    for i in list:\r
-                        print i\r
+                if Dict[Key] != '':\r
+                    print Key + ' = ' + str(Dict[Key])\r
 \r
+    ## Print the dictionary\r
+    #\r
+    # Print the items of dictionary which matched with input key\r
+    #\r
+    # @param list:  The dictionary to be printed\r
+    # @param key:   The key of the item to be printed\r
+    #\r
+    def printList(Key, List):\r
+        if type(List) == type([]):\r
+            if len(List) > 0:\r
+                if Key.find(TAB_SPLIT) != -1:\r
+                    print "\n" + Key\r
+                    for Item in List:\r
+                        print Item\r
+## TargetTxtDict\r
+#\r
+# Load target.txt in input workspace dir\r
+#\r
+# @param WorkSpace:  Workspace dir\r
+#\r
+# @retval Target An instance of TargetTxtClassObject() with loaded target.txt\r
+#\r
 def TargetTxtDict(WorkSpace):\r
     Target = TargetTxtClassObject()\r
     Target.LoadTargetTxtFile(WorkSpace + '\\Conf\\target.txt')\r
     return Target\r
 \r
-\r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
     pass\r
     Target = TargetTxtDict(os.getenv("WORKSPACE"))\r
index 30325a6..e7cc869 100755 (executable)
@@ -1,16 +1,19 @@
+## @file\r
+# This file is used to define each component of tools_def.txt file\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution.    The full text of the license may be found at\r
+# which accompanies this distribution.  The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-#\r
-#This file is used to define each component of tools_def.txt file\r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import os\r
 import re\r
 import EdkLogger\r
@@ -19,10 +22,23 @@ from Dictionary import *
 from BuildToolError import *\r
 from TargetTxtClassObject import *\r
 \r
+##\r
+# Static vailabes used for pattern\r
+#\r
 gMacroRefPattern = re.compile('(DEF\([^\(\)]+\))')\r
 gEnvRefPattern = re.compile('(ENV\([^\(\)]+\))')\r
 gMacroDefPattern = re.compile("DEFINE\s+([^\s]+)")\r
 \r
+## ToolDefClassObject\r
+#\r
+# This class defined content used in file tools_def.txt\r
+# \r
+# @param object:               Inherited from object class\r
+# @param Filename:             Input value for full path of tools_def.txt\r
+#\r
+# @var ToolsDefTxtDictionary:  To store keys and values defined in target.txt\r
+# @var MacroDictionary:        To store keys and values defined in DEFINE statement\r
+#\r
 class ToolDefClassObject(object):\r
     def __init__(self, FileName = None):\r
         self.ToolsDefTxtDictionary = {}\r
@@ -33,6 +49,12 @@ class ToolDefClassObject(object):
         if FileName != None:\r
             self.LoadToolDefFile(FileName)\r
 \r
+    ## LoadToolDefFile\r
+    #\r
+    # Load target.txt file and parse it, return a set structure to store keys and values\r
+    #\r
+    # @param Filename:  Input value for full path of tools_def.txt\r
+    #\r
     def LoadToolDefFile(self, FileName):\r
         FileContent = []\r
         if os.path.isfile(FileName):\r
@@ -96,10 +118,10 @@ class ToolDefClassObject(object):
                 if List[3] != '*':\r
                     self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] += [List[3]]\r
 \r
-        self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET]                 = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET]))\r
+        self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET]))\r
         self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG]))\r
-        self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH]        = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH]))\r
-        self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE]     = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE]))\r
+        self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH]))\r
+        self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] = list(set(self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE]))\r
 \r
         self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET].sort()\r
         self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG].sort()\r
@@ -121,8 +143,15 @@ class ToolDefClassObject(object):
                 elif List[Index] not in self.ToolsDefTxtDatabase[KeyList[Index]]:\r
                     del self.ToolsDefTxtDictionary[Key]\r
 \r
+    ## ExpandMacros\r
+    #\r
+    # Replace defined macros with real value\r
+    #\r
+    # @param Value:   The string with unreplaced macros\r
+    #\r
+    # @retval Value:  The string which has been replaced with real value\r
+    #\r
     def ExpandMacros(self, Value):\r
-\r
         EnvReference = gEnvRefPattern.findall(Value)\r
         for Ref in EnvReference:\r
             if Ref not in self.MacroDictionary:\r
@@ -141,6 +170,14 @@ class ToolDefClassObject(object):
 \r
         return Value\r
 \r
+## ToolDefDict\r
+#\r
+# Load tools_def.txt in input workspace dir\r
+#\r
+# @param WorkSpace:  Workspace dir\r
+#\r
+# @retval ToolDef An instance of ToolDefClassObject() with loaded tools_def.txt\r
+#\r
 def ToolDefDict(WorkSpace):\r
     Target = TargetTxtClassObject()\r
     Target.LoadTargetTxtFile(WorkSpace + '\\Conf\\target.txt')\r
@@ -148,9 +185,11 @@ def ToolDefDict(WorkSpace):
     ToolDef.LoadToolDefFile(WorkSpace + '\\' + Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF])\r
     return ToolDef\r
 \r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-##    td = ToolDefClassObject('tool_def.txt')\r
-##    print td.ToolsDefTxtDatabase\r
-\r
     ToolDef = ToolDefDict(os.getenv("WORKSPACE"))\r
     pass\r
index ab333d6..d9bb5ed 100644 (file)
@@ -1,3 +1,6 @@
+## @file\r
+# This file is used to define common items of class object\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
+## CommonClass\r
 #\r
-# This file is used to define common items of class object\r
+# This class defined common items used in Module/Platform/Package files\r
+# \r
+# @param object:       Inherited from object class\r
+# @param Usage:        Input value for Usage, default is [] \r
+# @param FeatureFlag:  Input value for FeatureFalg, default is ''\r
+# @param SupArchList:  Input value for SupArchList, default is []\r
+# @param HelpText:     Input value for HelpText, default is ''\r
+#\r
+# @var Usage:          To store value for Usage, selection scope is in below list\r
+#                      ALWAYS_CONSUMED | SOMETIMES_CONSUMED | ALWAYS_PRODUCED | SOMETIMES_PRODUCED | TO_START | BY_START | PRIVATE\r
+# @var FeatureFlag:    To store value for FeatureFlag\r
+# @var SupArchList:    To store value for SupArchList, selection scope is in below list\r
+#                      EBC | IA32 | X64 | IPF | ARM | PPC\r
+# @var HelpText:       To store value for HelpText\r
 #\r
-\r
 class CommonClass(object):\r
     def __init__(self, Usage = [], FeatureFlag = '', SupArchList = [], HelpText = ''):\r
-        self.Usage = Usage                                   #ALWAYS_CONSUMED | SOMETIMES_CONSUMED | ALWAYS_PRODUCED | SOMETIMES_PRODUCED | TO_START | BY_START | PRIVATE\r
+        self.Usage = Usage                                   \r
         self.FeatureFlag = FeatureFlag\r
-        self.SupArchList = SupArchList                    #EBC | IA32 | X64 | IPF | ARM | PPC\r
+        self.SupArchList = SupArchList                    \r
         self.HelpText = HelpText\r
-        \r
+\r
+## CommonClass\r
+#\r
+# This class defined common items used in Module/Platform/Package files\r
+# \r
+# @param object:          Inherited from object class\r
+#\r
+# @var Abstract:          To store value for Abstract\r
+# @var Description:       To store value for Description\r
+# @var Copyright:         To store value for Copyright\r
+# @var License:           To store value for License\r
+# @var Specification:     To store value for Specification\r
+#\r
 class CommonHeaderClass(object):\r
     def __init__(self):\r
         self.Abstract = ''\r
         self.Description = ''\r
         self.Copyright = ''\r
         self.License = ''\r
-        self.Specification = {}                           #{ SpecificationName : SpecificationValue } \r
+        self.Specification = {}                           \r
 \r
+## DefineClass\r
+#\r
+# This class defined item DEFINE used in Module/Platform/Package files\r
+#\r
+# @param object:  Inherited from object class\r
+#\r
+# @var Define:    To store value for Define, it is a set structure as\r
+#                 { (DefineName, Arch) : DefineValue, ... }\r
+#\r
 class DefineClass(object):\r
     def __init__(self):\r
-        self.Define = {}                                  #{ (DefineName, Arch) : DefineValue, ...}\r
-        \r
+        self.Define = {}\r
+\r
+## ClonedRecordClass\r
+#\r
+# This class defined ClonedRecord items used in Module/Platform/Package files\r
+# \r
+# @param object:        Inherited from object class\r
+#\r
+# @var Id:              To store value for Id\r
+# @var FarGuid:         To store value for FarGuid\r
+# @var PackageGuid:     To store value for PackageGuid\r
+# @var PackageVersion:  To store value for PackageVersion\r
+# @var ModuleGuid:      To store value for ModuleGuid\r
+# @var ModuleVersion:   To store value for ModuleVersion\r
+#\r
 class ClonedRecordClass(object):\r
     def __init__(self):\r
         self.Id = 0\r
@@ -39,28 +89,81 @@ class ClonedRecordClass(object):
         self.ModuleGuid = ''\r
         self.ModuleVersion = ''\r
 \r
+## IdentificationClass\r
+#\r
+# This class defined Identification items used in Module/Platform/Package files\r
+# \r
+# @param object:  Inherited from object class\r
+#\r
+# @var Name:      To store value for Name\r
+#                 ModuleName(Inf) / PackageName(Dec) / PlatformName(Dsc)\r
+# @var Guid:      To store value for Guid\r
+# @var Version:   To store value for Version\r
+# @var FileName:  To store value for FileName\r
+# @var FullPath:  To store value for FullPath\r
+#\r
 class IdentificationClass(object):\r
     def __init__(self):\r
-        self.Name = ''                                    #ModuleName(BaseName) / PackageName / PlatformName\r
+        self.Name = ''\r
         self.Guid = ''\r
         self.Version = ''\r
         self.FileName = ''\r
         self.FullPath = ''\r
 \r
+## IncludeStatementClass\r
+#\r
+# This class defined IncludeFiles item used in Module/Platform/Package files\r
+# \r
+# @param object:      Inherited from object class\r
+#\r
+# @var IncludeFiles:  To store value for IncludeFiles\r
+#                     It is a set structure as { IncludeFile : [Arch1, Arch2, ...], ... }\r
+#\r
 class IncludeStatementClass(object):\r
     def __init__(self):\r
-        self.IncludeFiles = {}                             #{ IncludeFile : [Arch1, Arch2, ...], ...}\r
+        self.IncludeFiles = {}                             \r
 \r
+## GuidProtocolPpiCommonClass\r
+#\r
+# This class defined Guid, Protocol and Ppi like items used in Module/Platform/Package files\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var Name:           To store value for Name\r
+# @var CName:          To store value for CName\r
+# @var Guid:           To store value for Guid\r
+# @var Notify:         To store value for Notify\r
+# @var GuidTypeList:   To store value for GuidTypeList, selection scope is in below list\r
+#                      DATA_HUB_RECORD | EFI_EVENT | EFI_SYSTEM_CONFIGURATION_TABLE | EFI_VARIABLE | GUID | HII_PACKAGE_LIST | HOB | TOKEN_SPACE_GUID\r
+# @var SupModuleList:  To store value for SupModuleList, selection scope is in below list\r
+#                      BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+#\r
 class GuidProtocolPpiCommonClass(CommonClass):\r
     def __init__(self):\r
         self.Name = ''\r
         self.CName = ''\r
         self.Guid = ''\r
         self.Notify = False\r
-        self.GuidTypeList = []                            #DATA_HUB_RECORD | EFI_EVENT | EFI_SYSTEM_CONFIGURATION_TABLE | EFI_VARIABLE | GUID | HII_PACKAGE_LIST | HOB | TOKEN_SPACE_GUID\r
-        self.SupModuleList = []                           #BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+        self.GuidTypeList = []\r
+        self.SupModuleList = []                           \r
         CommonClass.__init__(self)\r
-        \r
+\r
+## LibraryClassClass\r
+#\r
+# This class defined Library item used in Module/Platform/Package files\r
+# \r
+# @param CommonClass:               Inherited from CommonClass class\r
+# @param DefineClass:               Inherited from DefineClass class\r
+#\r
+# @var LibraryClass:                To store value for LibraryClass\r
+# @var IncludeHeader:               To store value for IncludeHeader\r
+# @var RecommendedInstanceVersion:  To store value for RecommendedInstanceVersion\r
+# @var RecommendedInstanceGuid:     To store value for RecommendedInstanceGuid\r
+# @var RecommendedInstance:         To store value for RecommendedInstance, selection scope is in below list\r
+#                                   DATA_HUB_RECORD | EFI_EVENT | EFI_SYSTEM_CONFIGURATION_TABLE | EFI_VARIABLE | GUID | HII_PACKAGE_LIST | HOB | TOKEN_SPACE_GUID\r
+# @var SupModuleList:               To store value for SupModuleList, selection scope is in below list\r
+#                                   BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+#\r
 class LibraryClassClass(CommonClass, DefineClass):\r
     def __init__(self):\r
         self.LibraryClass = ''\r
@@ -68,40 +171,95 @@ class LibraryClassClass(CommonClass, DefineClass):
         self.RecommendedInstanceVersion = ''\r
         self.RecommendedInstanceGuid = ''\r
         self.RecommendedInstance = ''\r
-        self.SupModuleList = []                           #BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+        self.SupModuleList = []\r
         CommonClass.__init__(self)\r
         DefineClass.__init__(self)\r
 \r
+## GuidClass\r
+#\r
+# This class defined Guid item used in Module/Platform/Package files\r
+# \r
+# @param GuidProtocolPpiCommonClass:  Inherited from GuidProtocolPpiCommonClass class\r
+#\r
 class GuidClass(GuidProtocolPpiCommonClass):\r
     def __init__(self):\r
         GuidProtocolPpiCommonClass.__init__(self)\r
 \r
+## ProtocolClass\r
+#\r
+# This class defined Protocol item used in Module/Platform/Package files\r
+# \r
+# @param GuidProtocolPpiCommonClass:  Inherited from GuidProtocolPpiCommonClass class\r
+#\r
 class ProtocolClass(GuidProtocolPpiCommonClass):\r
     def __init__(self):\r
         GuidProtocolPpiCommonClass.__init__(self)\r
-        \r
+\r
+## PpiClass\r
+#\r
+# This class defined Ppi item used in Module/Platform/Package files\r
+# \r
+# @param GuidProtocolPpiCommonClass:  Inherited from GuidProtocolPpiCommonClass class\r
+#\r
 class PpiClass(GuidProtocolPpiCommonClass):        \r
     def __init__(self):\r
         GuidProtocolPpiCommonClass.__init__(self)\r
-        \r
+\r
+## SkuInfoClass\r
+#\r
+# This class defined SkuInfo item used in Module/Platform/Package files\r
+# \r
+# @param object:           Inherited from object class\r
+# @param SkuIdName:        Input value for SkuIdName, default is ''\r
+# @param SkuId:            Input value for SkuId, default is ''\r
+# @param VariableName:     Input value for VariableName, default is ''\r
+# @param VariableGuid:     Input value for VariableGuid, default is ''\r
+# @param VariableOffset:   Input value for VariableOffset, default is ''\r
+# @param HiiDefaultValue:  Input value for HiiDefaultValue, default is ''\r
+# @param VpdOffset:        Input value for VpdOffset, default is ''\r
+# @param DefaultValue:     Input value for DefaultValue, default is ''\r
+#\r
+# @var SkuIdName:          To store value for SkuIdName\r
+# @var SkuId:              To store value for SkuId\r
+# @var VariableName:       To store value for VariableName\r
+# @var VariableGuid:       To store value for VariableGuid\r
+# @var VariableOffset:     To store value for VariableOffset\r
+# @var HiiDefaultValue:    To store value for HiiDefaultValue\r
+# @var VpdOffset:          To store value for VpdOffset\r
+# @var DefaultValue:       To store value for DefaultValue\r
+#\r
 class SkuInfoClass(object):\r
     def __init__(self, SkuIdName = '', SkuId = '', VariableName = '', VariableGuid = '', VariableOffset = '', HiiDefaultValue = '', VpdOffset = '', DefaultValue = ''):\r
         self.SkuIdName = SkuIdName\r
         self.SkuId = SkuId\r
-        #Used by Hii\r
+        \r
+        #\r
+        # Used by Hii\r
+        #\r
         self.VariableName = VariableName\r
         self.VariableGuid = VariableGuid\r
         self.VariableOffset = VariableOffset\r
         self.HiiDefaultValue = HiiDefaultValue\r
         \r
-        #Used by Vpd\r
+        #\r
+        # Used by Vpd\r
+        #\r
         self.VpdOffset = VpdOffset\r
         \r
-        #Used by Default\r
+        #\r
+        # Used by Default\r
+        #\r
         self.DefaultValue = DefaultValue\r
         \r
+    ## Convert the class to a string\r
+    #\r
+    #  Convert each member of the class to string\r
+    #  Organize to a signle line format string\r
+    #\r
+    #  @retval Rtn Formatted String\r
+    #\r
     def __str__(self):\r
-        rtn = rtn = 'SkuId = ' + str(self.SkuId) + "," + \\r
+        Rtn = Rtn = 'SkuId = ' + str(self.SkuId) + "," + \\r
                     'SkuIdName = ' + str(self.SkuIdName) + "," + \\r
                     'VariableName = ' + str(self.VariableName) + "," + \\r
                     'VariableGuid = ' + str(self.VariableGuid) + "," + \\r
@@ -109,41 +267,113 @@ class SkuInfoClass(object):
                     'HiiDefaultValue = ' + str(self.HiiDefaultValue) + "," + \\r
                     'VpdOffset = ' + str(self.VpdOffset) + "," + \\r
                     'DefaultValue = ' + str(self.DefaultValue) + ","\r
-        return rtn\r
+        return Rtn\r
 \r
+## PcdClass\r
+#\r
+# This class defined Pcd item used in Module/Platform/Package files\r
+# \r
+# @param CommonClass:          Inherited from CommonClass class\r
+# @param CName:                Input value for CName, default is ''\r
+# @param Token:                Input value for Token, default is ''\r
+# @param TokenSpaceGuidCName:  Input value for TokenSpaceGuidCName, default is ''\r
+# @param DatumType:            Input value for DatumType, default is ''\r
+# @param MaxDatumSize:         Input value for MaxDatumSize, default is ''\r
+# @param DefaultValue:         Input value for DefaultValue, default is ''\r
+# @param ItemType:             Input value for ItemType, default is ''\r
+# @param ValidUsage:           Input value for ValidUsage, default is []\r
+# @param SkuInfoList:          Input value for SkuInfoList, default is {}\r
+# @param SupModuleList:        Input value for SupModuleList, default is []\r
+#\r
+# @var CName:                  To store value for CName\r
+# @var Token:                  To store value for Token\r
+# @var TokenSpaceGuidCName:    To store value for TokenSpaceGuidCName\r
+# @var DatumType:              To store value for DatumType, selection scope is in below list\r
+#                              UINT8 | UINT16 | UINT32 | UINT64 | VOID* | BOOLEAN \r
+# @var MaxDatumSize:           To store value for MaxDatumSize\r
+# @var DefaultValue:           To store value for DefaultValue\r
+# @var ItemType:               To store value for ItemType, selection scope is in below list\r
+#                              FEATURE_FLAG | FIXED_AT_BUILD | PATCHABLE_IN_MODULE | DYNAMIC | DYNAMIC_EX\r
+# @var ValidUsage:             To store value for ValidUsage, selection scope is in below list\r
+#                              FEATURE_FLAG | FIXED_AT_BUILD | PATCHABLE_IN_MODULE | DYNAMIC | DYNAMIC_EX\r
+# @var SkuInfoList:            To store value for SkuInfoList\r
+#                              It is a set structure as { [SkuIdName] : SkuInfoClass } \r
+# @var SupModuleList:          To store value for SupModuleList, selection scope is in below list\r
+#                              BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+#\r
 class PcdClass(CommonClass):\r
     def __init__(self, CName = '', Token = '', TokenSpaceGuidCName = '', DatumType = '', MaxDatumSize = '', DefaultValue = '', ItemType = '', ValidUsage = [], SkuInfoList = {}, SupModuleList = []):\r
         self.CName = CName\r
         self.Token = Token\r
         self.TokenSpaceGuidCName = TokenSpaceGuidCName\r
-        self.DatumType = DatumType                                 #UINT8 | UINT16 | UINT32 | UINT64 | VOID* | BOOLEAN \r
+        self.DatumType = DatumType\r
         self.MaxDatumSize = MaxDatumSize\r
         self.DefaultValue = DefaultValue\r
-        self.ItemType = ItemType                                   #FEATURE_FLAG | FIXED_AT_BUILD | PATCHABLE_IN_MODULE | DYNAMIC | DYNAMIC_EX\r
-        self.ValidUsage = ValidUsage                               #FEATURE_FLAG | FIXED_AT_BUILD | PATCHABLE_IN_MODULE | DYNAMIC | DYNAMIC_EX\r
-        self.SkuInfoList = SkuInfoList                             #{ [SkuIdName] : SkuInfoClass } \r
-        self.SupModuleList = SupModuleList                         #BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+        self.ItemType = ItemType\r
+        self.ValidUsage = ValidUsage\r
+        self.SkuInfoList = SkuInfoList\r
+        self.SupModuleList = SupModuleList\r
         CommonClass.__init__(self)\r
 \r
+## BuildOptionClass\r
+#\r
+# This class defined BuildOption item used in Module/Platform/Package files\r
+# \r
+# @param IncludeStatementClass:  Inherited from IncludeStatementClass class\r
+# @param ToolChainFamily:        Input value for ToolChainFamily, default is ''\r
+# @param ToolChain:              Input value for ToolChain, default is ''\r
+# @param Option:                 Input value for Option, default is ''\r
+#\r
+# @var Statement:                To store value for Statement\r
+#                                It is a string in a special format as "Family:Target_TagName_Tarch_ToolCode_FLAGS = String"\r
+# @var ToolChainFamily:          To store value for ToolChainFamily\r
+# @var ToolChain:                To store value for ToolChain\r
+# @var Option:                   To store value for Option\r
+# @var BuildTarget:              To store value for BuildTarget\r
+# @var TagName:                  To store value for TagName\r
+# @var ToolCode:                 To store value for ToolCode\r
+# @var SupArchList:              To store value for SupArchList, selection scope is in below list\r
+#                                EBC | IA32 | X64 | IPF | ARM | PPC\r
+#\r
 class BuildOptionClass(IncludeStatementClass):\r
     def __init__(self, ToolChainFamily = '', ToolChain = '', Option = ''):\r
         IncludeStatementClass.__init__(self)\r
-        self.Statement = ''                               #Family:Target_TagName_Tarch_ToolCode_FLAGS = String \r
+        self.Statement = ''                               \r
         self.ToolChainFamily = ToolChainFamily\r
         self.ToolChain = ToolChain\r
         self.Option = Option\r
         self.BuildTarget = ''\r
         self.TagName = ''\r
         self.ToolCode = ''\r
-        self.SupArchList = []                             #EBC | IA32 | X64 | IPF | ARM | PPC\r
-        \r
+        self.SupArchList = []\r
+\r
+## IncludeClass\r
+#\r
+# This class defined Include item used in Module/Platform/Package files\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var FilePath:       To store value for FilePath\r
+# @var ModuleType:     To store value for ModuleType\r
+# @var Comment:        To store value for Comment\r
+#\r
 class IncludeClass(CommonClass):\r
     def __init__(self):\r
         self.FilePath = ''\r
         self.ModuleType = ''\r
         self.Comment = ''\r
         CommonClass.__init__(self)        \r
-                \r
+\r
+## UserExtensionsClass\r
+#\r
+# This class defined UserExtensions item used in Module/Platform/Package files\r
+# \r
+# @param object:    Inherited from object class\r
+#\r
+# @var UserID:      To store value for UserID\r
+# @var Identifier:  To store value for Identifier\r
+# @var Content:     To store value for Content\r
+#       \r
 class UserExtensionsClass(object):\r
     def __init__(self):\r
         self.UserID = ''\r
index 13bcc8a..dad22d3 100755 (executable)
@@ -1,3 +1,6 @@
+## @file\r
+# This file is used to define a class object to describe a module\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
+##\r
+# Import Modules\r
 #\r
-# This file is used to define a class object to describe a module\r
-#\r
-\r
 from CommonClass import *\r
 \r
+## ModuleHeaderClass\r
+#\r
+# This class defined header items used in Module file\r
+# \r
+# @param IdentificationClass:    Inherited from IdentificationClass class\r
+# @param CommonHeaderClass:      Inherited from CommonHeaderClass class\r
+# @param DefineClass:            Inherited from DefineClass class\r
+#\r
+# @var ModuleType:               To store value for ModuleType\r
+# @var SupArchList:              To store value for SupArchList, selection scope is in below list\r
+#                                EBC | IA32 | X64 | IPF | ARM | PPC\r
+# @var BinaryModule:             To store value for BinaryModule\r
+# @var OutputFileBasename:       To store value for OutputFileBasename\r
+# @var ClonedFrom:               To store value for ClonedFrom, it is a set structure as\r
+#                                [ ClonedRecordClass, ... ]\r
+# @var PcdIsDriver:              To store value for PcdIsDriver, selection scope is in below list\r
+#                                PEI_PCD_DRIVER | DXE_PCD_DRIVER\r
+# @var TianoR8FlashMap_h:        To store value for TianoR8FlashMap_h\r
+# @var InfVersion:               To store value for InfVersion\r
+# @var EfiSpecificationVersion:  To store value for EfiSpecificationVersion\r
+# @var EdkReleaseVersion:        To store value for EdkReleaseVersion\r
+# @var LibraryClass:             To store value for LibraryClass, it is a set structure as\r
+#                                [ LibraryClassClass, ...]\r
+# @var ComponentType:            To store value for ComponentType, selection scope is in below list\r
+#                                LIBRARY | SECURITY_CORE | PEI_CORE | COMBINED_PEIM_DRIVER | PIC_PEIM | RELOCATABLE_PEIM | BS_DRIVER | RT_DRIVER | SAL_RT_DRIVER | APPLICATION\r
+# @var MakefileName:             To store value for MakefileName\r
+# @var BuildNumber:              To store value for BuildNumber\r
+# @var BuildType:                To store value for BuildType\r
+# @var FfsExt:                   To store value for FfsExt\r
+# @var FvExt:                    To store value for FvExt\r
+# @var SourceFv:                 To store value for SourceFv\r
+# @var CustomMakefile:           To store value for CustomMakefile, it is a set structure as\r
+#                                { Family : Filename, ... }\r
+#\r
 class ModuleHeaderClass(IdentificationClass, CommonHeaderClass, DefineClass):\r
     def __init__(self):\r
         IdentificationClass.__init__(self)\r
         CommonHeaderClass.__init__(self)\r
         DefineClass.__init__(self)\r
         self.ModuleType = ''\r
-        self.SupArchList = []                       #EBC | IA32 | X64 | IPF | ARM | PPC\r
+        self.SupArchList = []\r
         self.BinaryModule = False\r
         self.OutputFileBasename = ''\r
-        self.ClonedFrom = []                        #[ ClonedRecordClass, ...]\r
-        self.PcdIsDriver = ''                       #PEI_PCD_DRIVER | DXE_PCD_DRIVER\r
+        self.ClonedFrom = []\r
+        self.PcdIsDriver = ''\r
         self.TianoR8FlashMap_h = False\r
         self.InfVersion = ''\r
         self.EfiSpecificationVersion = ''\r
         self.EdkReleaseVersion = ''\r
-        self.LibraryClass = []                      #[ LibraryClassClass, ...]\r
-        self.ComponentType = ''                     #LIBRARY | SECURITY_CORE | PEI_CORE | COMBINED_PEIM_DRIVER | PIC_PEIM | RELOCATABLE_PEIM | BS_DRIVER | RT_DRIVER | SAL_RT_DRIVER | APPLICATION\r
+        self.LibraryClass = []\r
+        self.ComponentType = ''\r
         self.MakefileName = ''\r
         self.BuildNumber = ''\r
         self.BuildType = ''\r
         self.FfsExt = ''\r
         self.FvExt = ''\r
         self.SourceFv = ''\r
-        self.CustomMakefile = {}                    #{ Family : Filename, ... }\r
-        \r
+        self.CustomMakefile = {}\r
+\r
+## ModuleSourceFileClass\r
+#\r
+# This class defined source file item used in Module file\r
+# \r
+# @param CommonClass:      Inherited from CommonClass class\r
+# @param SourceFile:       Input value for SourceFile, default is ''\r
+# @param TagName:          Input value for TagName, default is ''\r
+# @param ToolCode:         Input value for ToolCode, default is ''\r
+# @param ToolChainFamily:  Input value for ToolChainFamily, default is ''\r
+# @param FeatureFlag:      Input value for FeatureFlag, default is ''\r
+# @param SupArchList:      Input value for SupArchList, default is []\r
+#\r
+# @var SourceFile:         To store value for SourceFile\r
+# @var TagName:            To store value for TagName\r
+# @var ToolCode:           To store value for ToolCode\r
+# @var ToolChainFamily:    To store value for ToolChainFamily\r
+#\r
 class ModuleSourceFileClass(CommonClass):\r
     def __init__(self, SourceFile = '', TagName = '', ToolCode = '', ToolChainFamily = '', FeatureFlag = '', SupArchList = []):\r
         self.SourceFile = SourceFile\r
@@ -46,13 +99,41 @@ class ModuleSourceFileClass(CommonClass):
         self.ToolChainFamily = ToolChainFamily\r
         CommonClass.__init__(self, FeatureFlag = FeatureFlag, SupArchList = SupArchList)\r
 \r
+## ModuleBinaryFileClass\r
+#\r
+# This class defined binary file item used in Module file\r
+# \r
+# @param CommonClass:    Inherited from CommonClass class\r
+# @param BinaryFile:     Input value for BinaryFile, default is ''\r
+# @param FileType:       Input value for FileType, default is ''\r
+# @param FeatureFlag:    Input value for FeatureFlag, default is ''\r
+# @param SupArchList:    Input value for SupArchList, default is []\r
+#\r
+# @var BinaryFile:       To store value for BinaryFile\r
+# @var FileType:         To store value for FileType, selection scope is in below list\r
+#                        FW | GUID | PREEFORM | UEFI_APP | UNI_UI | UNI_VER | LIB | PE32 | PIC | PEI_DEPEX | DXE_DEPEX | TE | VER | UI | BIN | FV\r
+# @var Target:           To store value for Target\r
+# @var ToolChainFamily:  To store value for ToolChainFamily\r
+#\r
 class ModuleBinaryFileClass(CommonClass):\r
     def __init__(self, BinaryFile = '', FileType = '', Target = '', FeatureFlag = '', SupArchList = []):\r
         self.BinaryFile = BinaryFile\r
-        self.FileType = FileType                          #FW | GUID | PREEFORM | UEFI_APP | UNI_UI | UNI_VER | LIB | PE32 | PIC | PEI_DEPEX | DXE_DEPEX | TE | VER | UI | BIN | FV\r
+        self.FileType = FileType\r
         self.Target = Target\r
         CommonClass.__init__(self, FeatureFlag = FeatureFlag, SupArchList = SupArchList)\r
-        \r
+\r
+## ModulePackageDependencyClass\r
+#\r
+# This class defined package dependency item used in Module file\r
+# \r
+# @param CommonClass:   Inherited from CommonClass class\r
+# @param DefineClass:   Input value for DefineClass class\r
+#\r
+# @var FilePath:        To store value for FilePath\r
+# @var PackageName:     To store value for PackageName\r
+# @var PackageVersion:  To store value for PackageVersion\r
+# @var PackageGuid:     To store value for PackageGuid\r
+#\r
 class ModulePackageDependencyClass(CommonClass, DefineClass):\r
     def __init__(self):\r
         self.FilePath = ''\r
@@ -61,61 +142,161 @@ class ModulePackageDependencyClass(CommonClass, DefineClass):
         self.PackageGuid = ''\r
         CommonClass.__init__(self)\r
         DefineClass.__init__(self)       \r
-        \r
+\r
+## ModuleLibraryClass\r
+#\r
+# This class defined library item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var Library:        To store value for Library\r
+#\r
 class ModuleLibraryClass(CommonClass):\r
     def __init__(self):\r
         self.Library = ''\r
         CommonClass.__init__(self)\r
-        \r
+\r
+## ModuleEventClass\r
+#\r
+# This class defined event item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var CName:          To store value for CName\r
+# @var GuidCName:      To store value for GuidCName\r
+# @var Type:           To store value for Type, selection scope is in below list\r
+#                      CREATE_EVENT | SIGNAL_EVENT\r
+#\r
 class ModuleEventClass(CommonClass):        \r
     def __init__(self):\r
         self.CName = ''\r
         self.GuidCName = ''\r
-        self.Type = ''                              #CREATE_EVENT | SIGNAL_EVENT\r
+        self.Type = ''                              \r
         CommonClass.__init__(self)\r
-        \r
+\r
+## ModuleHobClass\r
+#\r
+# This class defined hob item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var GuidCName:      To store value for GuidCName\r
+# @var Type:           To store value for Type, selection scope is in below list\r
+#                      PHIT | MEMORY_ALLOCATION | RESOURCE_DESCRIPTOR | GUID_EXTENSION | FIRMWARE_VOLUME | CPU | POOL | CAPSULE_VOLUME\r
+#\r
 class ModuleHobClass(CommonClass):\r
     def __init__(self):\r
-        self.Type = ''                              #PHIT | MEMORY_ALLOCATION | RESOURCE_DESCRIPTOR | GUID_EXTENSION | FIRMWARE_VOLUME | CPU | POOL | CAPSULE_VOLUME\r
+        self.Type = ''\r
         self.GuidCName = ''\r
         CommonClass.__init__(self)\r
-        \r
+\r
+## ModuleVariableClass\r
+#\r
+# This class defined variable item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var GuidCName:      To store value for GuidCName\r
+# @var Name:           To store value for Name\r
+#\r
 class ModuleVariableClass(CommonClass):\r
     def __init__(self):\r
         self.Name = ''\r
         self.GuidCName = ''\r
         CommonClass.__init__(self)\r
 \r
+## ModuleBootModeClass\r
+#\r
+# This class defined boot mode item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var Name:           To store value for Name, selection scope is in below list\r
+#                      FULL | MINIMAL | NO_CHANGE | DIAGNOSTICS | DEFAULT | S2_RESUME | S3_RESUME | S4_RESUME | S5_RESUME | FLASH_UPDATE | RECOVERY_FULL | RECOVERY_MINIMAL | RECOVERY_NO_CHANGE | RECOVERY_DIAGNOSTICS | RECOVERY_DEFAULT | RECOVERY_S2_RESUME | RECOVERY_S3_RESUME | RECOVERY_S4_RESUME | RECOVERY_S5_RESUME | RECOVERY_FLASH_UPDATE \r
+#\r
 class ModuleBootModeClass(CommonClass):\r
     def __init__(self):\r
-        self.Name = ''                              #FULL | MINIMAL | NO_CHANGE | DIAGNOSTICS | DEFAULT | S2_RESUME | S3_RESUME | S4_RESUME | S5_RESUME | FLASH_UPDATE | RECOVERY_FULL | RECOVERY_MINIMAL | RECOVERY_NO_CHANGE | RECOVERY_DIAGNOSTICS | RECOVERY_DEFAULT | RECOVERY_S2_RESUME | RECOVERY_S3_RESUME | RECOVERY_S4_RESUME | RECOVERY_S5_RESUME | RECOVERY_FLASH_UPDATE \r
+        self.Name = ''\r
         CommonClass.__init__(self)\r
-        \r
+\r
+## ModuleSystemTableClass\r
+#\r
+# This class defined system table item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var CName:          To store value for CName\r
+#\r
 class ModuleSystemTableClass(CommonClass):\r
     def __init__(self):\r
         self.CName = ''\r
         CommonClass.__init__(self)\r
 \r
+## ModuleDataHubClass\r
+#\r
+# This class defined data hub item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var CName:          To store value for CName\r
+#\r
 class ModuleDataHubClass(CommonClass):\r
     def __init__(self):\r
         self.CName = ''\r
         CommonClass.__init__(self)        \r
 \r
+## ModuleHiiPackageClass\r
+#\r
+# This class defined Hii package item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var CName:          To store value for CName\r
+#\r
 class ModuleHiiPackageClass(CommonClass):\r
     def __init__(self):\r
         self.CName = ''\r
         CommonClass.__init__(self)\r
-        \r
+\r
+## ModuleExternImageClass\r
+#\r
+# This class defined Extern Image item used in Module file\r
+# \r
+# @param object:           Inherited from object class\r
+#\r
+# @var ModuleEntryPoint:   To store value for ModuleEntryPoint\r
+# @var ModuleUnloadImage:  To store value for ModuleUnloadImage\r
+#\r
 class ModuleExternImageClass(object):\r
     def __init__(self):\r
         self.ModuleEntryPoint = ''\r
         self.ModuleUnloadImage = ''\r
 \r
+## ModuleExternLibraryClass\r
+#\r
+# This class defined Extern Library item used in Module file\r
+# \r
+# @param object:     Inherited from object class\r
+#\r
+# @var Constructor:  To store value for Constructor\r
+# @var Destructor:   To store value for Destructor\r
+#\r
 class ModuleExternLibraryClass(object):\r
     def __init__(self):\r
         self.Constructor = ''\r
         self.Destructor = ''\r
 \r
+## ModuleExternDriverClass\r
+#\r
+# This class defined Extern Driver item used in Module file\r
+# \r
+# @param object:       Inherited from object class\r
+#\r
+# @var DriverBinding:  To store value for DriverBinding\r
+# @var ComponentName:  To store value for ComponentName\r
+# @var DriverConfig:   To store value for DriverConfig\r
+# @var DriverDiag:     To store value for DriverDiag\r
+#\r
 class ModuleExternDriverClass(object):\r
     def __init__(self):\r
         self.DriverBinding= ''\r
@@ -123,52 +304,145 @@ class ModuleExternDriverClass(object):
         self.DriverConfig = ''\r
         self.DriverDiag = ''\r
 \r
+## ModuleExternCallBackClass\r
+#\r
+# This class defined Extern Call Back item used in Module file\r
+# \r
+# @param object:                      Inherited from object class\r
+#\r
+# @var SetVirtualAddressMapCallBack:  To store value for SetVirtualAddressMapCallBack\r
+# @var ExitBootServicesCallBack:      To store value for ExitBootServicesCallBack\r
+#\r
 class ModuleExternCallBackClass(object):\r
     def __init__(self):\r
         self.SetVirtualAddressMapCallBack = ''\r
         self.ExitBootServicesCallBack = ''\r
 \r
+## ModuleDepexClass\r
+#\r
+# This class defined depex item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+# @param DefineClass:  Input value for DefineClass class\r
+#\r
+# @var Depex:          To store value for Depex\r
+#\r
 class ModuleDepexClass(CommonClass, DefineClass):\r
     def __init__(self):\r
         CommonClass.__init__(self)\r
         DefineClass.__init__(self)\r
         self.Depex = ''\r
 \r
+## ModuleNmakeClass\r
+#\r
+# This class defined nmake item used in Module file\r
+# \r
+# @param CommonClass:  Inherited from CommonClass class\r
+#\r
+# @var Name:           To store value for Name\r
+# @var Value:          To store value for Value\r
+#\r
 class ModuleNmakeClass(CommonClass):\r
     def __init__(self):\r
         CommonClass.__init__(self)\r
         self.Name = ''\r
         self.Value = ''\r
 \r
+## ModuleClass\r
+#\r
+# This class defined a complete module item\r
+# \r
+# @param object:    Inherited from object class\r
+#\r
+# @var Header:               To store value for Header, it is a structure as\r
+#                            ModuleHeaderClass\r
+# @var LibraryClasses:       To store value for LibraryClasses, it is a list structure as\r
+#                            [ LibraryClassClass, ...]\r
+# @var Libraries:            To store value for Libraries, it is a list structure as\r
+#                            [ ModuleLibraryClass, ...]\r
+# @var Sources:              To store value for Sources, it is a list structure as\r
+#                            [ ModuleSourceFileClass, ...]\r
+# @var Binaries:             To store value for Binaries, it is a list structure as\r
+#                            [ ModuleBinaryFileClass, ...]\r
+# @var NonProcessedFiles:    To store value for NonProcessedFiles, it is a list structure as\r
+#                            [ '', '', ...]\r
+# @var PackageDependencies:  To store value for PackageDependencies, it is a list structure as\r
+#                            [ ModulePackageDependencyClass, ... ] \r
+# @var Nmake:                To store value for Nmake, it is a list structure as\r
+#                            [ ModuleNmakeClass, ... ]\r
+# @var Depex:                To store value for Depex, it is a list structure as\r
+#                            [ ModuleDepexClass, ... ]\r
+# @var Includes:             To store value for Includes, it is a list structure as\r
+#                            [ IncludeClass, ...]\r
+# @var Protocols:            To store value for Protocols, it is a list structure as\r
+#                            [ ProtocolClass, ...]\r
+# @var Ppis:                 To store value for Ppis, it is a list structure as\r
+#                            [ PpiClass, ...]\r
+# @var Events:               To store value for Events, it is a list structure as\r
+#                            [ ModuleEventClass, ...]\r
+# @var Hobs:                 To store value for Hobs, it is a list structure as\r
+#                            [ ModuleHobClass, ...] \r
+# @var Variables:            To store value for Variables, it is a list structure as\r
+#                            [ ModuleVariableClass, ...]\r
+# @var BootModes:            To store value for BootModes, it is a list structure as\r
+#                            [ ModuleBootModeClass, ...]\r
+# @var SystemTables:         To store value for SystemTables, it is a list structure as\r
+#                            [ ModuleSystemTableClass, ...]\r
+# @var DataHubs:             To store value for DataHubs, it is a list structure as\r
+#                            [ ModuleDataHubClass, ...]\r
+# @var HiiPackages:          To store value for HiiPackages, it is a list structure as\r
+#                            [ ModuleHiiPackageClass, ...]\r
+# @var Guids:                To store value for Guids, it is a list structure as\r
+#                            [ GuidClass, ...]\r
+# @var PcdCodes:             To store value for PcdCodes, it is a list structure as\r
+#                            [ PcdClass, ...]\r
+# @var ExternImages:         To store value for ExternImages, it is a list structure as\r
+#                            [ ModuleExternImageClass, ...]\r
+# @var ExternLibraries:      To store value for ExternLibraries, it is a list structure as\r
+#                            [ ModuleExternLibraryClass, ...]\r
+# @var ExternDrivers:        To store value for ExternDrivers, it is a list structure as\r
+#                            [ ModuleExternDriverClass, ...]\r
+# @var ExternCallBacks:      To store value for ExternCallBacks, it is a list structure as\r
+#                            [ ModuleExternCallBackClass, ...]\r
+# @var BuildOptions:         To store value for BuildOptions, it is a list structure as\r
+#                            [ BuildOptionClass, ...]\r
+# @var UserExtensions:       To store value for UserExtensions, it is a list structure as\r
+#                            [ UserExtensionsClass, ...]\r
+#\r
 class ModuleClass(object):\r
     def __init__(self):\r
         self.Header = ModuleHeaderClass()\r
-        self.LibraryClasses = []                    #[ LibraryClassClass, ...]\r
-        self.Libraries = []                         #[ ModuleLibraryClass, ...]\r
-        self.Sources = []                           #[ ModuleSourceFileClass, ...]\r
-        self.Binaries = []                          #[ ModuleBinaryFileClass, ...]\r
-        self.NonProcessedFiles = []                 #[ '', '', ...]\r
-        self.PackageDependencies = []               #[ ModulePackageDependencyClass, ... ] \r
-        self.Nmake = []                             #[ ModuleNmakeClass, ... ]\r
-        self.Depex = []                             #[ ModuleDepexClass, ... ]\r
-        self.Includes = []                          #[ IncludeClass, ...]\r
-        self.Protocols = []                         #[ ProtocolClass, ...]\r
-        self.Ppis = []                              #[ PpiClass, ...]\r
-        self.Events = []                            #[ ModuleEventClass, ...]\r
-        self.Hobs = []                              #[ ModuleHobClass, ...] \r
-        self.Variables = []                         #[ ModuleVariableClass, ...]\r
-        self.BootModes = []                         #[ ModuleBootModeClass, ...]\r
-        self.SystemTables = []                      #[ ModuleSystemTableClass, ...]\r
-        self.DataHubs = []                          #[ ModuleDataHubClass, ...]\r
-        self.HiiPackages = []                       #[ ModuleHiiPackageClass, ...]\r
-        self.Guids = []                             #[ GuidClass, ...]\r
-        self.PcdCodes = []                          #[ PcdClass, ...]\r
-        self.ExternImages = []                      #[ ModuleExternImageClass, ...]\r
-        self.ExternLibraries = []                   #[ ModuleExternLibraryClass, ...]\r
-        self.ExternDrivers = []                     #[ ModuleExternDriverClass, ...]\r
-        self.ExternCallBacks = []                   #[ ModuleExternCallBackClass, ...]                \r
-        self.BuildOptions = []                      #[ BuildOptionClass, ...]\r
-        self.UserExtensions = []                    #[ UserExtensionsClass, ...]\r
+        self.LibraryClasses = []\r
+        self.Libraries = []\r
+        self.Sources = []\r
+        self.Binaries = []\r
+        self.NonProcessedFiles = []\r
+        self.PackageDependencies = []\r
+        self.Nmake = []\r
+        self.Depex = []\r
+        self.Includes = []\r
+        self.Protocols = []\r
+        self.Ppis = []\r
+        self.Events = []\r
+        self.Hobs = []\r
+        self.Variables = []\r
+        self.BootModes = []\r
+        self.SystemTables = []\r
+        self.DataHubs = []\r
+        self.HiiPackages = []\r
+        self.Guids = []\r
+        self.PcdCodes = []\r
+        self.ExternImages = []\r
+        self.ExternLibraries = []\r
+        self.ExternDrivers = []\r
+        self.ExternCallBacks = []\r
+        self.BuildOptions = []\r
+        self.UserExtensions = []\r
 \r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-    m = ModuleClass()\r
+    M = ModuleClass()\r
index baa89f7..fd57af7 100755 (executable)
@@ -1,3 +1,6 @@
+## @file\r
+# This file is used to define a class object to describe a package\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
+##\r
+# Import Modules\r
 #\r
-# This file is used to define a class object to describe a package\r
-#\r
-\r
 from CommonClass import *\r
 \r
+## PackageHeaderClass\r
+#\r
+# This class defined header items used in Package file\r
+# \r
+# @param IdentificationClass:  Inherited from IdentificationClass class\r
+# @param CommonHeaderClass:    Inherited from CommonHeaderClass class\r
+#\r
+# @var DecSpecification:       To store value for DecSpecification\r
+# @var ReadOnly:               To store value for ReadOnly\r
+# @var RePackage:              To store value for RePackage\r
+# @var ClonedFrom:             To store value for ClonedFrom, it is a set structure as\r
+#                              [ ClonedRecordClass, ...]\r
+#\r
 class PackageHeaderClass(IdentificationClass, CommonHeaderClass):\r
     def __init__(self):\r
         IdentificationClass.__init__(self)\r
@@ -20,32 +35,85 @@ class PackageHeaderClass(IdentificationClass, CommonHeaderClass):
         self.DecSpecification = ''\r
         self.ReadOnly = False\r
         self.RePackage = False\r
-        self.ClonedFrom = []                                   #[ ClonedRecordClass, ...]\r
-        \r
+        self.ClonedFrom = []\r
+\r
+## PackageIndustryStdHeaderClass\r
+#\r
+# This class defined industry std header items used in Package file\r
+# \r
+# @param CommonHeaderClass:  Inherited from CommonHeaderClass class\r
+#\r
+# @var Name:                 To store value for Name\r
+# @var IncludeHeader:        To store value for IncludeHeader\r
+#\r
 class PackageIndustryStdHeaderClass(CommonClass):\r
     def __init__(self):\r
         self.Name = ''\r
         self.IncludeHeader = ''\r
         CommonClass.__init__(self)\r
-        \r
+\r
+## PackageIncludePkgHeaderClass\r
+#\r
+# This class defined include Pkg header items used in Package file\r
+# \r
+# @param object:       Inherited from object class\r
+#\r
+# @var IncludeHeader:  To store value for IncludeHeader\r
+# @var ModuleType:     To store value for ModuleType, it is a set structure as\r
+#                      BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | TOOL | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+#\r
 class PackageIncludePkgHeaderClass(object):\r
     def __init__(self):\r
         self.IncludeHeader = ''\r
-        self.ModuleType = []                                   #BASE | SEC | PEI_CORE | PEIM | DXE_CORE | DXE_DRIVER | DXE_RUNTIME_DRIVER | DXE_SAL_DRIVER | DXE_SMM_DRIVER | TOOL | UEFI_DRIVER | UEFI_APPLICATION | USER_DEFINED\r
+        self.ModuleType = []\r
 \r
+## PackageClass\r
+#\r
+# This class defined a complete package item\r
+# \r
+# @param object:                  Inherited from object class\r
+#\r
+# @var Header:                    To store value for Header, it is a structure as\r
+#                                 PackageHeaderClass\r
+# @var Includes:                  To store value for Includes, it is a list structure as\r
+#                                 [ IncludeClass, ...]\r
+# @var LibraryClassDeclarations:  To store value for LibraryClassDeclarations, it is a list structure as\r
+#                                 [ LibraryClassClass, ...]\r
+# @var IndustryStdHeaders:        To store value for IndustryStdHeaders, it is a list structure as\r
+#                                 [ PackageIndustryStdHeader, ...]\r
+# @var ModuleFiles:               To store value for ModuleFiles, it is a list structure as\r
+#                                 [ '', '', ...] \r
+# @var PackageIncludePkgHeaders:  To store value for PackageIncludePkgHeaders, it is a list structure as\r
+#                                 [ PackageIncludePkgHeader, ...]\r
+# @var GuidDeclarations:          To store value for GuidDeclarations, it is a list structure as\r
+#                                 [ GuidClass, ...]\r
+# @var ProtocolDeclarations:      To store value for ProtocolDeclarations, it is a list structure as\r
+#                                 [ ProtocolClass, ...]\r
+# @var PpiDeclarations:           To store value for PpiDeclarations, it is a list structure as\r
+#                                 [ PpiClass, ...]\r
+# @var PcdDeclarations:           To store value for PcdDeclarations, it is a list structure as\r
+#                                 [ PcdClass, ...]\r
+# @var UserExtensions:            To store value for UserExtensions, it is a list structure as\r
+#                                 [ UserExtensionsClass, ...]\r
+#\r
 class PackageClass(object):\r
     def __init__(self):\r
         self.Header = PackageHeaderClass()\r
-        self.Includes = []                                     #[ IncludeClass, ...]   \r
-        self.LibraryClassDeclarations = []                     #[ LibraryClassClass, ...]\r
-        self.IndustryStdHeaders = []                           #[ PackageIndustryStdHeader, ...]\r
-        self.ModuleFiles = []                                  #[ '', '', ...] \r
-        self.PackageIncludePkgHeaders = []                     #[ PackageIncludePkgHeader, ...]\r
-        self.GuidDeclarations = []                             #[ GuidClass, ...]\r
-        self.ProtocolDeclarations = []                         #[ ProtocolClass, ...]\r
-        self.PpiDeclarations = []                              #[ PpiClass, ...]\r
-        self.PcdDeclarations = []                              #[ PcdClass, ...]\r
-        self.UserExtensions = []                               #[ UserExtensionsClass, ...]\r
-        \r
+        self.Includes = []\r
+        self.LibraryClassDeclarations = []\r
+        self.IndustryStdHeaders = []\r
+        self.ModuleFiles = []\r
+        self.PackageIncludePkgHeaders = []\r
+        self.GuidDeclarations = []\r
+        self.ProtocolDeclarations = []\r
+        self.PpiDeclarations = []\r
+        self.PcdDeclarations = []\r
+        self.UserExtensions = []\r
+\r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-    p = PackageClass()\r
+    P = PackageClass()\r
index f993391..d39339a 100644 (file)
@@ -1,3 +1,6 @@
+## @file\r
+# This file is used to define a class object to describe a platform\r
+#\r
 # Copyright (c) 2007, Intel Corporation\r
 # All rights reserved. This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
+##\r
+# Import Modules\r
 #\r
-# This file is used to define a class object to describe a platform\r
-#\r
-\r
 from CommonClass import *\r
 \r
+## SkuInfoListClass\r
+#\r
+# This class defined sku info list item used in platform file\r
+# \r
+# @param IncludeStatementClass:  Inherited from IncludeStatementClass class\r
+#\r
+# @var SkuInfoList:              To store value for SkuInfoList, it is a set structure as\r
+#                                { SkuName : SkuId }\r
+#\r
 class SkuInfoListClass(IncludeStatementClass):\r
     def __init__(self):\r
         IncludeStatementClass.__init__(self)\r
-        self.SkuInfoList = {}                                       #{ SkuName : SkuId }\r
+        self.SkuInfoList = {}\r
 \r
+## PlatformHeaderClass\r
+#\r
+# This class defined header items used in Platform file\r
+# \r
+# @param IdentificationClass:    Inherited from IdentificationClass class\r
+# @param CommonHeaderClass:      Inherited from CommonHeaderClass class\r
+# @param DefineClass:            Inherited from DefineClass class\r
+#\r
+# @var DscSpecification:         To store value for DscSpecification\r
+# @var SupArchList:              To store value for SupArchList, selection scope is in below list\r
+#                                EBC | IA32 | X64 | IPF | ARM | PPC\r
+# @var BuildTargets:             To store value for BuildTargets, selection scope is in below list\r
+#                                RELEASE | DEBUG\r
+# @var IntermediateDirectories:  To store value for IntermediateDirectories, selection scope is in below list\r
+#                                MODULE | UNIFIED\r
+# @var OutputDirectory:          To store value for OutputDirectory\r
+# @var ForceDebugTarget:         To store value for ForceDebugTarget\r
+# @var SkuIdName:                To store value for SkuIdName\r
+# @var BuildNumber:              To store value for BuildNumber\r
+# @var MakefileName:             To store value for MakefileName\r
+# @var ClonedFrom:               To store value for ClonedFrom, it is a list structure as\r
+#                                [ ClonedRecordClass, ... ]\r
+#\r
 class PlatformHeaderClass(IdentificationClass, CommonHeaderClass, DefineClass):\r
     def __init__(self):\r
         IdentificationClass.__init__(self)\r
         CommonHeaderClass.__init__(self)\r
         DefineClass.__init__(self)\r
         self.DscSpecification = ''\r
-        self.SupArchList = []                                        #EBC | IA32 | X64 | IPF | ARM | PPC\r
-        self.BuildTargets = []                                       #RELEASE | DEBUG\r
-        self.IntermediateDirectories = ''                            #MODULE | UNIFIED\r
+        self.SupArchList = []\r
+        self.BuildTargets = []\r
+        self.IntermediateDirectories = ''\r
         self.OutputDirectory = ''                                                    \r
         self.ForceDebugTarget = ''\r
         self.SkuIdName = []\r
         self.BuildNumber = ''\r
         self.MakefileName = ''\r
-        self.ClonedFrom = []                                         #[ ClonedRecordClass, ...]\r
+        self.ClonedFrom = []\r
 \r
+## PlatformFlashDefinitionFileClass\r
+#\r
+# This class defined FlashDefinitionFile item used in platform file\r
+# \r
+# @param object:   Inherited from object class\r
+#\r
+# @var Id:         To store value for Id\r
+# @var UiName:     To store value for UiName\r
+# @var Preferred:  To store value for Preferred\r
+# @var FilePath:   To store value for FilePath\r
+#\r
 class PlatformFlashDefinitionFileClass(object):\r
     def __init__(self):\r
         self.Id = ''\r
@@ -41,83 +86,224 @@ class PlatformFlashDefinitionFileClass(object):
         self.Preferred = False\r
         self.FilePath = ''\r
 \r
+## PlatformFvImageOptionClass\r
+#\r
+# This class defined FvImageOption item used in platform file\r
+# \r
+# @param object:             Inherited from object class\r
+#\r
+# @var FvImageOptionName:    To store value for FvImageOptionName\r
+# @var FvImageOptionValues:  To store value for FvImageOptionValues\r
+#\r
 class PlatformFvImageOptionClass(object):\r
     def __init__(self):\r
         self.FvImageOptionName = ''\r
         self.FvImageOptionValues = []\r
-        \r
+\r
+## PlatformFvImageClass\r
+#\r
+# This class defined FvImage item used in platform file\r
+# \r
+# @param object:        Inherited from object class\r
+#\r
+# @var Name:            To store value for Name\r
+# @var Value:           To store value for Value\r
+# @var Type:            To store value for Type, selection scope is in below list\r
+#                       Attributes | Options | Components | ImageName \r
+# @var FvImageNames:    To store value for FvImageNames\r
+# @var FvImageOptions:  To store value for FvImageOptions, it is a list structure as\r
+#                       [ PlatformFvImageOption, ...]\r
+#\r
 class PlatformFvImageClass(object):\r
     def __init__(self):\r
         self.Name = ''\r
         self.Value = ''\r
-        self.Type = ''                                               #Attributes | Options | Components | ImageName \r
+        self.Type = ''\r
         self.FvImageNames = []\r
-        self.FvImageOptions = []                                     #[ PlatformFvImageOption, ...]\r
+        self.FvImageOptions = []\r
 \r
+## PlatformFvImageNameClass\r
+#\r
+# This class defined FvImageName item used in platform file\r
+# \r
+# @param object:        Inherited from object class\r
+#\r
+# @var Name:            To store value for Name\r
+# @var Type:            To store value for Type, selection scope is in below list\r
+#                       FV_MAIN | FV_MAIN_COMPACT | NV_STORAGE | FV_RECOVERY | FV_RECOVERY_FLOPPY | FV_FILE | CAPSULE_CARGO | NULL | USER_DEFINED \r
+# @var FvImageOptions:  To store value for FvImageOptions, it is a list structure as\r
+#                       [ PlatformFvImageOption, ...]\r
+#\r
 class PlatformFvImageNameClass(object):\r
     def __init__(self):\r
         self.Name = ''\r
-        self.Type = ''                                               #FV_MAIN | FV_MAIN_COMPACT | NV_STORAGE | FV_RECOVERY | FV_RECOVERY_FLOPPY | FV_FILE | CAPSULE_CARGO | NULL | USER_DEFINED \r
-        self.FvImageOptions = []                                     #[ PlatformFvImageOption, ...]\r
-        \r
+        self.Type = ''\r
+        self.FvImageOptions = []\r
+\r
+## PlatformFvImagesClass\r
+#\r
+# This class defined FvImages item used in platform file\r
+# \r
+# @param object:  Inherited from object class\r
+#\r
+# @var FvImages:  To store value for FvImages\r
+#\r
 class PlatformFvImagesClass(object):\r
     def __init__(self):\r
-        #self.FvImages1 = []                                          #[ PlatformFvImageClass, ...]\r
-        #self.FvImages2 = []                                          #[ PlatformFvImageNameClass, ...]\r
         self.FvImages = []\r
-        \r
+\r
+## PlatformAntTaskClass\r
+#\r
+# This class defined AntTask item used in platform file\r
+# \r
+# @param object:       Inherited from object class\r
+#\r
+# @var Id:             To store value for Id\r
+# @var AntCmdOptions:  To store value for AntCmdOptions\r
+# @var FilePath:       To store value for FilePath\r
+#\r
 class PlatformAntTaskClass(object):\r
     def __init__(self):\r
         self.Id = ''\r
         self.AntCmdOptions = ''\r
         self.FilePath = ''\r
 \r
+## PlatformFfsSectionClass\r
+#\r
+# This class defined FfsSection item used in platform file\r
+# \r
+# @param CommonClass:        Inherited from CommonClass class\r
+#\r
+# @var BindingOrder:         To store value for BindingOrder\r
+# @var Compressible:         To store value for Compressible\r
+# @var SectionType:          To store value for SectionType\r
+# @var EncapsulationType:    To store value for EncapsulationType\r
+# @var ToolName:             To store value for ToolName\r
+# @var Filenames:            To store value for Filenames\r
+# @var Args:                 To store value for Args\r
+# @var OutFile:              To store value for OutFile\r
+# @var OutputFileExtension:  To store value for OutputFileExtension\r
+# @var ToolNameElement:      To store value for ToolNameElement\r
+#\r
 class PlatformFfsSectionClass(CommonClass):\r
     def __init__(self):\r
         CommonClass.__init__(self)\r
-        self.BindingOrder                = ''\r
-        self.Compressible                = ''\r
-        self.SectionType                 = ''\r
-        self.EncapsulationType     = ''\r
-        self.ToolName                        = ''\r
+        self.BindingOrder = ''\r
+        self.Compressible = ''\r
+        self.SectionType  = ''\r
+        self.EncapsulationType  = ''\r
+        self.ToolName = ''\r
         self.Filenames = []\r
-        self.Args                                = ''\r
-        self.OutFile                         = ''\r
+        self.Args = ''\r
+        self.OutFile = ''\r
         self.OutputFileExtension = ''\r
-        self.ToolNameElement         = ''\r
-        \r
+        self.ToolNameElement = ''\r
+\r
+## PlatformFfsSectionsClass\r
+#\r
+# This class defined FfsSections item used in platform file\r
+# \r
+# @param CommonClass:      Inherited from CommonClass class\r
+#\r
+# @var BindingOrder:       To store value for BindingOrder\r
+# @var Compressible:       To store value for Compressible\r
+# @var SectionType:        To store value for SectionType\r
+# @var EncapsulationType:  To store value for EncapsulationType\r
+# @var ToolName:           To store value for ToolName\r
+# @var Section:            To store value for Section, it is a list structure as\r
+#                          [ PlatformFfsSectionClass, ... ]\r
+# @var Sections:           To store value for Sections, it is a list structure as\r
+#                          [ PlatformFfsSectionsClass, ...]\r
+#\r
 class PlatformFfsSectionsClass(CommonClass):\r
     def __init__(self):\r
-        CommonClass.__init__(self)        \r
-        self.BindingOrder            = ''\r
-        self.Compressible            = ''\r
-        self.SectionType             = ''\r
+        CommonClass.__init__(self)\r
+        self.BindingOrder = ''\r
+        self.Compressible = ''\r
+        self.SectionType = ''\r
         self.EncapsulationType = ''\r
-        self.ToolName                    = ''\r
-        self.Section = []                                            #[ PlatformFfsSectionClass, ... ]\r
-        self.Sections = []                                           #[ PlatformFfsSectionsClass, ...]\r
-        \r
+        self.ToolName = ''\r
+        self.Section = []\r
+        self.Sections = []\r
+\r
+## PlatformFfsClass\r
+#\r
+# This class defined Ffs item used in platform file\r
+# \r
+# @param object:   Inherited from object class\r
+#\r
+# @var Attribute:  To store value for Attribute, it is a set structure as\r
+#                  { [(Name, PlatformFfsSectionsClass)] : Value}\r
+# @var Sections:   To store value for Sections, it is a list structure as\r
+#                  [ PlatformFfsSectionsClass]\r
+# @var ToolName:   To store value for ToolName\r
+#\r
 class PlatformFfsClass(object):\r
     def __init__(self):\r
-        self.Attribute = {}                                          #{ [(Name, PlatformFfsSectionsClass)] : Value}\r
-        self.Sections = []                                           #[ PlatformFfsSectionsClass]\r
+        self.Attribute = {}\r
+        self.Sections = []\r
         self.Key = ''\r
-        \r
+\r
+## PlatformBuildOptionClass\r
+#\r
+# This class defined BuildOption item used in platform file\r
+# \r
+# @param object:             Inherited from object class\r
+#\r
+# @var UserDefinedAntTasks:  To store value for UserDefinedAntTasks, it is a set structure as\r
+#                            { [Id] : PlatformAntTaskClass, ...}\r
+# @var Options:              To store value for Options, it is a list structure as\r
+#                            [ BuildOptionClass, ...]\r
+# @var UserExtensions:       To store value for UserExtensions, it is a set structure as\r
+#                            { [(UserID, Identifier)] : UserExtensionsClass, ...}\r
+# @var FfsKeyList:           To store value for FfsKeyList, it is a set structure as\r
+#                            { [FfsKey]: PlatformFfsClass, ...} \r
+#\r
 class PlatformBuildOptionClass(object):\r
     def __init__(self):\r
-        self.UserDefinedAntTasks = {}                                #{ [Id] : PlatformAntTaskClass, ...}\r
-        self.Options = []                                            #[ BuildOptionClass, ...]\r
-        self.UserExtensions = {}                                     #{ [(UserID, Identifier)] : UserExtensionsClass, ...}\r
-        self.FfsKeyList = {}                                         #{ [FfsKey]: PlatformFfsClass, ...} \r
+        self.UserDefinedAntTasks = {}\r
+        self.Options = []\r
+        self.UserExtensions = {}\r
+        self.FfsKeyList = {}\r
 \r
+## PlatformBuildOptionClasses\r
+#\r
+# This class defined BuildOption item list used in platform file\r
+# \r
+# @param IncludeStatementClass:  Inherited from IncludeStatementClass class\r
+#\r
+# @var FvBinding:                To store value for FvBinding\r
+# @var FfsFileNameGuid:          To store value for FfsFileNameGuid\r
+# @var FfsFormatKey:             To store value for FfsFormatKey\r
+# @var BuildOptionList:          To store value for BuildOptionList, it is a list structure as\r
+#                                [ BuildOptionClass, ... ]\r
+#\r
 class PlatformBuildOptionClasses(IncludeStatementClass):\r
     def __init__(self):\r
         IncludeStatementClass.__init__(self)\r
         self.FvBinding = ''\r
         self.FfsFileNameGuid = ''\r
         self.FfsFormatKey = ''\r
-        self.BuildOptionList = []                                    #[ BuildOptionClass, ...]\r
+        self.BuildOptionList = []\r
 \r
+## PlatformLibraryClass\r
+#\r
+# This class defined Library item used in platform file\r
+# \r
+# @param CommonClass:   Inherited from CommonClass class\r
+# @param DefineClass:   Inherited from DefineClass class\r
+# @param Name:          Input value for Name, default is ''\r
+# @param FilePath:      Input value for FilePath, default is ''\r
+#\r
+# @var Name:            To store value for Name\r
+# @var FilePath:        To store value for FilePath\r
+# @var ModuleType:      To store value for ModuleType\r
+# @var SupModuleList:   To store value for SupModuleList\r
+# @var ModuleGuid:      To store value for ModuleGuid\r
+# @var ModuleVersion:   To store value for ModuleVersion\r
+# @var PackageGuid:     To store value for PackageGuid\r
+# @var PackageVersion:  To store value for PackageVersion\r
+#\r
 class PlatformLibraryClass(CommonClass, DefineClass):\r
     def __init__(self, Name = '', FilePath = ''):\r
         CommonClass.__init__(self)\r
@@ -131,30 +317,98 @@ class PlatformLibraryClass(CommonClass, DefineClass):
         self.PackageGuid = ''\r
         self.PackageVersion = ''\r
 \r
+## PlatformLibraryClasses\r
+#\r
+# This class defined Library item list used in platform file\r
+# \r
+# @param IncludeStatementClass:  Inherited from IncludeStatementClass class\r
+#\r
+# @var LibraryList:              To store value for LibraryList, it is a list structure as\r
+#                                [ PlatformLibraryClass, ... ]\r
+#\r
 class PlatformLibraryClasses(IncludeStatementClass):\r
     def __init__(self):\r
         IncludeStatementClass.__init__(self)\r
-        self.LibraryList = []                                        #[ PlatformLibraryClass, ...]\r
-        \r
+        self.LibraryList = []\r
+\r
+## PlatformModuleClass\r
+#\r
+# This class defined Module item used in platform file\r
+# \r
+# @param CommonClass:            Inherited from CommonClass class\r
+# @param DefineClass:            Inherited from DefineClass class\r
+# @param IncludeStatementClass:  Inherited from IncludeStatementClass class\r
+#\r
+# @var Name:                     To store value for Name (Library name or libraryclass name or module name)\r
+# @var FilePath:                 To store value for FilePath\r
+# @var Type:                     To store value for Type, selection scope is in below list\r
+#                                LIBRARY | LIBRARY_CLASS | MODULE\r
+# @var ModuleType:               To store value for ModuleType\r
+# @var ExecFilePath:             To store value for ExecFilePath\r
+# @var LibraryClasses:           To store value for LibraryClasses, it is a structure as\r
+#                                PlatformLibraryClasses\r
+# @var PcdBuildDefinitions:      To store value for PcdBuildDefinitions, it is a list structure as\r
+#                                [ PcdClass, ...]\r
+# @var ModuleSaBuildOption:      To store value for ModuleSaBuildOption, it is a structure as\r
+#                                PlatformBuildOptionClasses\r
+# @var Specifications:           To store value for Specifications, it is a list structure as\r
+#                                [ '', '', ...]\r
+#\r
 class PlatformModuleClass(CommonClass, DefineClass, IncludeStatementClass):\r
     def __init__(self):\r
         CommonClass.__init__(self)\r
         DefineClass.__init__(self)\r
-        self.Name = ''                                               #Library name or libraryclass name or module name\r
+        self.Name = ''\r
         self.FilePath = ''\r
-        self.Type = ''                                               #LIBRARY | LIBRARY_CLASS | MODULE, used by dsc\r
+        self.Type = ''\r
         self.ModuleType = ''\r
         self.ExecFilePath = ''\r
         self.LibraryClasses = PlatformLibraryClasses()\r
-        self.PcdBuildDefinitions = []                                #[ PcdClass, ...]\r
+        self.PcdBuildDefinitions = []\r
         self.ModuleSaBuildOption = PlatformBuildOptionClasses()\r
-        self.Specifications = []                                     #[ '', '', ...]\r
+        self.Specifications = []\r
 \r
+## PlatformModuleClasses\r
+#\r
+# This class defined Module item list used in platform file\r
+# \r
+# @param IncludeStatementClass:  Inherited from IncludeStatementClass class\r
+#\r
+# @var ModuleList:               To store value for ModuleList, it is a list structure as\r
+#                                [ PlatformModuleClass, ... ]\r
+#\r
 class PlatformModuleClasses(IncludeStatementClass):\r
     def __init__(self):\r
         IncludeStatementClass.__init__(self)\r
-        self.ModuleList = []                                         #[ PlatformModuleClass, ...]\r
+        self.ModuleList = []\r
 \r
+## PlatformClass\r
+#\r
+# This class defined a complete platform item\r
+# \r
+# @param object:                    Inherited from object class\r
+#\r
+# @var Header:                      To store value for Header, it is a structure as\r
+#                                   PlatformHeaderClass\r
+# @var SkuInfos:                    To store value for SkuInfos, it is a structure as\r
+#                                   SkuInfoListClass\r
+# @var Libraries:                   To store value for Libraries, it is a structure as\r
+#                                   PlatformLibraryClasses\r
+# @var LibraryClasses:              To store value for LibraryClasses, it is a structure as\r
+#                                   PlatformLibraryClasses\r
+# @var Modules:                     To store value for Modules, it is a structure as\r
+#                                   PlatformModuleClasses\r
+# @var FlashDefinitionFile:         To store value for FlashDefinitionFile, it is a structure as\r
+#                                   PlatformFlashDefinitionFileClass\r
+# @var BuildOptions:                To store value for BuildOptions, it is a structure as\r
+#                                   PlatformBuildOptionClasses\r
+# @var DynamicPcdBuildDefinitions:  To store value for DynamicPcdBuildDefinitions, it is a list structure as\r
+#                                   [ PcdClass, ...]\r
+# @var Fdf:                         To store value for Fdf, it is a list structure as\r
+#                                   [ FdfClass, ...]\r
+# @var UserExtensions:              To store value for UserExtensions, it is a list structure as\r
+#                                   [ UserExtensionsClass, ...]\r
+#\r
 class PlatformClass(object):\r
     def __init__(self):\r
         self.Header = PlatformHeaderClass()\r
@@ -164,9 +418,14 @@ class PlatformClass(object):
         self.Modules = PlatformModuleClasses()\r
         self.FlashDefinitionFile = PlatformFlashDefinitionFileClass()\r
         self.BuildOptions = PlatformBuildOptionClasses()\r
-        self.DynamicPcdBuildDefinitions = []                         #[ PcdClass, ...] \r
-        self.Fdf = []                                                #[ FdfClass, ...]\r
-        self.UserExtensions = []                                     #[ UserExtensionsClass, ...]\r
+        self.DynamicPcdBuildDefinitions = []\r
+        self.Fdf = []\r
+        self.UserExtensions = []\r
 \r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
 if __name__ == '__main__':\r
-    p = PlatformClass()\r
+    P = PlatformClass()\r