a. Added doxygen comments
authorjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 24 Apr 2008 03:37:32 +0000 (03:37 +0000)
committerjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 24 Apr 2008 03:37:32 +0000 (03:37 +0000)
b. Removed BuildInfo.py
c. Moved default db path string definition to WorkspaceDatabase class

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

Source/Python/AutoGen/AutoGen.py
Source/Python/AutoGen/BuildInfo.py [deleted file]
Source/Python/AutoGen/GenC.py
Source/Python/AutoGen/GenMake.py
Source/Python/build/build.py

index 28de2ce..61ef3c7 100755 (executable)
@@ -81,16 +81,33 @@ gAutoGenCodeFileName = "AutoGen.c"
 gAutoGenHeaderFileName = "AutoGen.h"\r
 gAutoGenDepexFileName = "%(module_name)s.depex"\r
 \r
+## Base class for AutoGen\r
+#\r
+#   This class just implements the cache mechanism of AutoGen objects.\r
+# \r
 class AutoGen(object):\r
-    # database to maintain the objects of PlatformAutoGen\r
-    _CACHE_ = {}    # (platform file, BuildTarget, ToolChain) : {ARCH : AutoGen object}\r
-\r
+    # database to maintain the objects of xxxAutoGen\r
+    _CACHE_ = {}    # (BuildTarget, ToolChain) : {ARCH : {platform file: AutoGen object}}}\r
+\r
+    ## Factory method\r
+    #\r
+    #   @param  Class           class object of real AutoGen class\r
+    #                           (WorkspaceAutoGen, ModuleAutoGen or PlatformAutoGen)\r
+    #   @param  Workspace       Workspace directory or WorkspaceAutoGen object\r
+    #   @param  MetaFile        The path of meta file\r
+    #   @param  Target          Build target\r
+    #   @param  Toolchain       Tool chain name\r
+    #   @param  Arch            Target arch\r
+    #   @param  *args           The specific class related parameters\r
+    #   @param  **kwargs        The specific class related dict parameters\r
+    # \r
     def __new__(Class, Workspace, MetaFile, Target, Toolchain, Arch, *args, **kwargs):\r
         # check if the object has been created\r
         Key = (Target, Toolchain)\r
         if Key not in Class._CACHE_ or Arch not in Class._CACHE_[Key] \\r
            or MetaFile not in Class._CACHE_[Key][Arch]:\r
             AutoGenObject = super(AutoGen, Class).__new__(Class)\r
+            # call real constructor\r
             if not AutoGenObject._Init(Workspace, MetaFile, Target, Toolchain, Arch, *args, **kwargs):\r
                 return None\r
             if Key not in Class._CACHE_:\r
@@ -125,7 +142,30 @@ class AutoGen(object):
     def __eq__(self, Other):\r
         return Other != None and self._MetaFile == str(Other)\r
 \r
+## Workspace AutoGen class\r
+#\r
+#   This class is used mainly to control the whole platform build for different\r
+# architecture. This class will generate top level makefile.\r
+# \r
 class WorkspaceAutoGen(AutoGen):\r
+    ## Real constructor of WorkspaceAutoGen\r
+    # \r
+    # This method behaves the same as __init__ except that it needs explict invoke\r
+    # (in super class's __new__ method)\r
+    #\r
+    #   @param  WorkspaceDir            Root directory of workspace\r
+    #   @param  ActivePlatform          Meta-file of active platform\r
+    #   @param  Target                  Build target\r
+    #   @param  Toolchain               Tool chain name\r
+    #   @param  ArchList                List of architecture of current build\r
+    #   @param  MetaFileDb              Database containing meta-files\r
+    #   @param  BuildConfig             Configuration of build\r
+    #   @param  ToolDefinition          Tool chain definitions\r
+    #   @param  FlashDefinitionFile     File of flash definition\r
+    #   @param  Fds                     FD list to be generated\r
+    #   @param  Fvs                     FV list to be generated\r
+    #   @param  SkuId                   SKU id from command line\r
+    # \r
     def _Init(self, WorkspaceDir, ActivePlatform, Target, Toolchain, ArchList, MetaFileDb,\r
               BuildConfig, ToolDefinition, FlashDefinitionFile='', Fds=[], Fvs=[], SkuId=''):\r
         self._MetaFile      = str(ActivePlatform)\r
@@ -144,7 +184,7 @@ class WorkspaceAutoGen(AutoGen):
         self.FvTargetList   = Fvs\r
         self.AutoGenObjectList = []\r
 \r
-        # there's many relative directory operation, so ...\r
+        # there's many relative directory operations, so ...\r
         os.chdir(self.WorkspaceDir)\r
 \r
         # parse FDF file to get PCDs in it, if any\r
@@ -166,8 +206,6 @@ class WorkspaceAutoGen(AutoGen):
 \r
             Pa = PlatformAutoGen(self, self._MetaFile, Target, Toolchain, Arch)\r
             self.AutoGenObjectList.append(Pa)\r
-            #for M in ModuleList:\r
-            #    Platform.AddModule(M)\r
 \r
         self._BuildDir = None\r
         self._FvDir = None\r
@@ -176,29 +214,37 @@ class WorkspaceAutoGen(AutoGen):
 \r
         return True\r
 \r
+    ## Return the directory to store FV files\r
     def _GetFvDir(self):\r
         if self._FvDir == None:\r
             self._FvDir = path.join(self.BuildDir, 'FV')\r
         return self._FvDir\r
             \r
+    ## Return the directory to store all intermediate and final files built\r
     def _GetBuildDir(self):\r
         return self.AutoGenObjectList[0].BuildDir\r
 \r
+    ## Return the build output directory platform specifies\r
     def _GetOutputDir(self):\r
         return self.Platform.OutputDirectory\r
 \r
+    ## Return platform name\r
     def _GetName(self):\r
         return self.Platform.PlatformName\r
 \r
+    ## Return meta-file GUID\r
     def _GetGuid(self):\r
         return self.Platform.Guid\r
 \r
+    ## Return platform version\r
     def _GetVersion(self):\r
         return self.Platform.Version\r
 \r
+    ## Return paths of tools\r
     def _GetToolPaths(self):\r
         return self.AutoGenObjectList[0].ToolPath\r
 \r
+    ## Return options of tools\r
     def _GetToolOptions(self):\r
         return self.AutoGenObjectList[0].ToolOption\r
 \r
@@ -223,7 +269,7 @@ class WorkspaceAutoGen(AutoGen):
 \r
     ## Create makefile for the platform and mdoules in it\r
     #\r
-    #   @param      CreateLibraryCodeFile   Flag indicating if the makefile for\r
+    #   @param      CreateDepsMakeFile      Flag indicating if the makefile for\r
     #                                       modules will be created as well\r
     #\r
     def CreateMakeFile(self, CreateDepsMakeFile=False):\r
@@ -245,7 +291,7 @@ class WorkspaceAutoGen(AutoGen):
     #  Since there's no autogen code for platform, this method will do nothing\r
     #  if CreateModuleCodeFile is set to False.\r
     #\r
-    #   @param      CreateModuleCodeFile    Flag indicating if creating module's\r
+    #   @param      CreateDepsCodeFile      Flag indicating if creating module's\r
     #                                       autogen code file or not\r
     #\r
     def CreateCodeFile(self, CreateDepsCodeFile=False):\r
@@ -259,8 +305,8 @@ class WorkspaceAutoGen(AutoGen):
     Version             = property(_GetVersion)                       \r
     OutputDir           = property(_GetOutputDir)\r
 \r
-    ToolPath            = property(_GetToolPaths)    # toolcode : tool path\r
-    ToolOption          = property(_GetToolOptions)    # toolcode : tool option string\r
+    ToolPath            = property(_GetToolPaths)       # toolcode : tool path\r
+    ToolOption          = property(_GetToolOptions)     # toolcode : tool option string\r
 \r
     BuildDir            = property(_GetBuildDir)\r
     FvDir               = property(_GetFvDir)\r
@@ -269,21 +315,21 @@ class WorkspaceAutoGen(AutoGen):
 \r
 ## AutoGen class for platform\r
 #\r
-#  PlatformAutoGen class will re-organize the original information in platform\r
+#  PlatformAutoGen class will process the original information in platform\r
 #  file in order to generate makefile for platform.\r
 #\r
 class PlatformAutoGen(AutoGen):\r
     ## The real constructor of PlatformAutoGen\r
     #\r
     #  This method is not supposed to be called by users of PlatformAutoGen. It's\r
-    #  only used by factory method New() to do real initialization work for an\r
+    #  only used by factory method __new__() to do real initialization work for an\r
     #  object of PlatformAutoGen\r
     #\r
     #   @param      Workspace       EdkIIWorkspaceBuild object\r
     #   @param      PlatformFile    Platform file (DSC file)\r
     #   @param      Target          Build target (DEBUG, RELEASE)\r
     #   @param      Toolchain       Name of tool chain\r
-    #   @param      ArchList        List of arch the platform supports\r
+    #   @param      Arch            arch of the platform supports\r
     #\r
     def _Init(self, Workspace, PlatformFile, Target, Toolchain, Arch):\r
         EdkLogger.verbose("\nAutoGen platform [%s] [%s]" % (PlatformFile, Arch))\r
@@ -357,7 +403,7 @@ class PlatformAutoGen(AutoGen):
 \r
     ## Create makefile for the platform and mdoules in it\r
     #\r
-    #   @param      CreateLibraryCodeFile   Flag indicating if the makefile for\r
+    #   @param      CreateModuleMakeFile    Flag indicating if the makefile for\r
     #                                       modules will be created as well\r
     #\r
     def CreateMakeFile(self, CreateModuleMakeFile=False):\r
@@ -382,20 +428,25 @@ class PlatformAutoGen(AutoGen):
                            (self._MetaFile, self.Arch))\r
         self.IsMakeFileCreated = True\r
 \r
+    ## Return the platform build data object\r
     def _GetPlatform(self):\r
         if self._Platform == None:\r
             self._Platform = self.BuildDatabase[self._MetaFile, self.Arch]\r
         return self._Platform\r
 \r
+    ## Return platform name\r
     def _GetName(self):\r
         return self.Platform.PlatformName\r
 \r
+    ## Return the meta file GUID\r
     def _GetGuid(self):\r
         return self.Platform.Guid\r
 \r
+    ## Return the platform version\r
     def _GetVersion(self):\r
         return self.Platform.Version\r
 \r
+    ## Return the FDF file name\r
     def _GetFdfFile(self):\r
         if self._FdfFile == None:\r
             if self.Workspace.FdfFile != "":\r
@@ -404,12 +455,11 @@ class PlatformAutoGen(AutoGen):
                 self._FdfFile = ''\r
         return self._FdfFile\r
 \r
-    def _GetDebugDir(self):\r
-        return ''\r
-\r
+    ## Return the build output directory platform specifies\r
     def _GetOutputDir(self):\r
         return self.Platform.OutputDirectory\r
 \r
+    ## Return the directory to store all intermediate and final files built\r
     def _GetBuildDir(self):\r
         if self._BuildDir == None:\r
             if os.path.isabs(self.OutputDir):\r
@@ -453,8 +503,6 @@ class PlatformAutoGen(AutoGen):
     #\r
     #  Get each tool defition for given tool chain from tools_def.txt and platform\r
     #\r
-    #   @param      Info    PlatformBuildInfo object to store the definition\r
-    #\r
     def _GetToolDefinition(self):\r
         ToolDefinition = self.Workspace.ToolDef.ToolsDefTxtDictionary\r
         ToolCodeList = self.Workspace.ToolDef.ToolsDefTxtDatabase["COMMAND_TYPE"]\r
@@ -511,41 +559,49 @@ class PlatformAutoGen(AutoGen):
             self._OutputFlag[Tool] = OutputFlag\r
             self._IncludeFlag[Tool] = InputFlag\r
 \r
+    ## Return the paths of tools\r
     def _GetToolPaths(self):\r
         if self._ToolPath == None:\r
             self._GetToolDefinition()\r
         return self._ToolPath\r
 \r
+    ## Return the dll paths of tools\r
     def _GetToolDllPaths(self):\r
         if self._ToolDllPath == None:\r
             self._GetToolDefinition()\r
         return self._ToolDllPath\r
 \r
+    ## Return the static libraries of tools\r
     def _GetToolStaticLibs(self):\r
         if self._ToolStaticLib == None:\r
             self._GetToolDefinition()\r
         return self._ToolStaticLib\r
 \r
+    ## Return the families of tools\r
     def _GetToolChainFamilies(self):\r
         if self._ToolChainFamily == None:\r
             self._GetToolDefinition()\r
         return self._ToolChainFamily\r
 \r
+    ## Return the build options specific to this platform\r
     def _GetBuildOptions(self):\r
         if self._BuildOption == None:\r
             self._BuildOption = self._ExpandBuildOption(self.Platform.BuildOptions)\r
         return self._BuildOption\r
 \r
+    ## Return the output flag of tools\r
     def _GetOuputFlags(self):\r
         if self._OutputFlag == None:\r
             self._GetToolDefinition()\r
         return self._OutputFlag\r
 \r
+    ## Return the include flags of tools\r
     def _GetIncludeFlags(self):\r
         if self._IncludeFlag == None:\r
             self._GetToolDefinition()\r
         return self._IncludeFlag\r
 \r
+    ## Return the default options of tools\r
     def _GetToolOptions(self):\r
         if self._ToolOption == None:\r
             self._GetToolDefinition()\r
@@ -563,6 +619,7 @@ class PlatformAutoGen(AutoGen):
             self._BuildRule = BuildRule(BuildRuleFile)\r
         return self._BuildRule\r
 \r
+    ## Summarize the packages used by modules in this platform\r
     def _GetPackageList(self):\r
         if self._PackageList == None:\r
             self._PackageList = set()\r
@@ -576,11 +633,6 @@ class PlatformAutoGen(AutoGen):
     #\r
     #  Gather dynamic PCDs list from each module and their settings from platform\r
     #\r
-    #   @param      Platform    The object of the platform\r
-    #   @param      Arch        One of the arch the platform supports\r
-    #\r
-    #   @retval     lsit        The list of dynamic PCD\r
-    #\r
     def _GetPcdList(self):\r
         self._NonDynamicPcdList = []\r
         self._DynamicPcdList = []\r
@@ -619,23 +671,19 @@ class PlatformAutoGen(AutoGen):
                             ExtraData="\n\tPCD(s) without MaxDatumSize:\n\t\t%s\n"\r
                                       % NoDatumTypePcdListString)\r
 \r
+    ## Get list of non-dynamic PCDs\r
     def _GetNonDynamicPcdList(self):\r
         if self._NonDynamicPcdList == None:\r
             self._GetPcdList()\r
         return self._NonDynamicPcdList\r
 \r
+    ## Get list of dynamic PCDs\r
     def _GetDynamicPcdList(self):\r
         if self._DynamicPcdList == None:\r
             self._GetPcdList()\r
         return self._DynamicPcdList\r
 \r
     ## Generate Token Number for all PCD\r
-    #\r
-    #   @param      Platform        The object of the platform\r
-    #   @param      DynamicPcdList  The list of all dynamic PCDs\r
-    #\r
-    #   @retval     dict            A dict object containing the PCD and its token number\r
-    #\r
     def _GetPcdTokenNumbers(self):\r
         if self._PcdTokenNumber == None:\r
             self._PcdTokenNumber = sdict()\r
@@ -657,6 +705,7 @@ class PlatformAutoGen(AutoGen):
                 TokenNumber += 1\r
         return self._PcdTokenNumber\r
 \r
+    ## Summarize ModuleAutoGen objects of all modules/libraries to be built for this platform\r
     def _GetAutoGenObjectList(self):\r
         self._ModuleAutoGenList = []\r
         self._LibraryAutoGenList = []\r
@@ -675,11 +724,13 @@ class PlatformAutoGen(AutoGen):
                 if La not in self._LibraryAutoGenList:\r
                     self._LibraryAutoGenList.append(La)\r
 \r
+    ## Summarize ModuleAutoGen objects of all modules to be built for this platform\r
     def _GetModuleAutoGenList(self):\r
         if self._ModuleAutoGenList == None:\r
             self._GetAutoGenObjectList()\r
         return self._ModuleAutoGenList\r
 \r
+    ## Summarize ModuleAutoGen objects of all libraries to be built for this platform\r
     def _GetLibraryAutoGenList(self):\r
         if self._LibraryAutoGenList == None:\r
             self._GetAutoGenObjectList()\r
@@ -690,19 +741,18 @@ class PlatformAutoGen(AutoGen):
     #  An error will be raised directly if the module or its arch is not supported\r
     #  by the platform or current configuration\r
     #\r
-    #   @param      Module  The module file\r
-    #   @param      Arch    The arch the module will be built for\r
-    #\r
     def ValidModule(self, Module):\r
-        #if Arch not in self.Workspace.SupArchList:\r
-        #    return False\r
-        #    #EdkLogger.error("AutoGen", AUTOGEN_ERROR, "[%s] is not supported by active platform [%s] [%s]!"\r
-        #    #                                          % (Arch, self._MetaFile, self.Workspace.SupArchList))\r
-        #if Arch not in self.ArchList:\r
-        #    return False\r
-        #    #EdkLogger.error("AutoGen", AUTOGEN_ERROR, "[%s] is not supported by current build configuration!" % Arch)\r
         return Module in self.Platform.Modules or Module in self.Platform.LibraryInstances\r
 \r
+    ## Resolve the library classes in a module to library instances\r
+    #\r
+    # This method will not only resolve library classes but also sort the library\r
+    # instances according to the dependency-ship.\r
+    # \r
+    #   @param  Module      The module from which the library classes will be resolved\r
+    # \r
+    #   @retval library_list    List of library instances sorted\r
+    # \r
     def ApplyLibraryInstance(self, Module):\r
         ModuleType = Module.ModuleType\r
         # apply library instances from platform\r
@@ -861,6 +911,11 @@ class PlatformAutoGen(AutoGen):
         return SortedLibraryList\r
     \r
 \r
+    ## Override PCD setting (type, value, ...)\r
+    #\r
+    #   @param  ToPcd       The PCD to be overrided\r
+    #   @param  FromPcd     The PCD overrideing from\r
+    # \r
     def _OverridePcd(self, ToPcd, FromPcd):\r
         # \r
         # in case there's PCDs coming from FDF file, which have no type given.\r
@@ -905,14 +960,24 @@ class PlatformAutoGen(AutoGen):
                 SkuName : SkuInfoClass(SkuName, self.Platform.SkuIds[SkuName], '', '', '', '', '', ToPcd.DefaultValue)\r
             }\r
 \r
+    ## Apply PCD setting defined platform to a module\r
+    #\r
+    #   @param  Module  The module from which the PCD setting will be overrided\r
+    # \r
+    #   @retval PCD_list    The list PCDs with settings from platform\r
+    # \r
     def ApplyPcdSetting(self, Module):\r
+        # for each PCD in module\r
         for Name,Guid in Module.Pcds:\r
             PcdInModule = Module.Pcds[Name,Guid]\r
+            # find out the PCD setting in platform\r
             if (Name,Guid) in self.Platform.Pcds:\r
                 PcdInPlatform = self.Platform.Pcds[Name,Guid]\r
             else:\r
                 PcdInPlatform = None\r
+            # then override the settings if any\r
             self._OverridePcd(PcdInModule, PcdInPlatform)\r
+            # resolve the VariableGuid value\r
             for SkuId in PcdInModule.SkuInfoList:\r
                 Sku = PcdInModule.SkuInfoList[SkuId]\r
                 if Sku.VariableGuid == '': continue\r
@@ -936,8 +1001,13 @@ class PlatformAutoGen(AutoGen):
                     self._OverridePcd(Module.Pcds[Key], PlatformModule.Pcds[Key])\r
         return Module.Pcds.values()\r
 \r
-    ##\r
-    # for R8.x modules\r
+    ## Resolve library names to library modules\r
+    # \r
+    # (for R8.x modules)\r
+    # \r
+    #   @param  Module  The module from which the library names will be resolved\r
+    # \r
+    #   @retval library_list    The list of library modules\r
     # \r
     def ResolveLibraryReference(self, Module):\r
         EdkLogger.verbose("")\r
@@ -962,6 +1032,12 @@ class PlatformAutoGen(AutoGen):
                     EdkLogger.verbose("\t" + LibraryName + " : " + str(Library) + ' ' + str(type(Library)))\r
         return LibraryList\r
 \r
+    ## Expand * in build option key\r
+    #\r
+    #   @param  Options     Options to be expanded\r
+    # \r
+    #   @retval options     Options expanded\r
+    # \r
     def _ExpandBuildOption(self, Options):\r
         BuildOptions = {}\r
         for Key in Options:\r
@@ -984,6 +1060,12 @@ class PlatformAutoGen(AutoGen):
                             BuildOptions[Tool] += " " + Options[Key]\r
         return BuildOptions\r
 \r
+    ## Append build options in platform to a module\r
+    # \r
+    #   @param  Module  The module to which the build options will be appened\r
+    # \r
+    #   @retval options     The options appended with build options in platform\r
+    # \r
     def ApplyBuildOption(self, Module):\r
         PlatformOptions = self.BuildOption\r
         ModuleOptions = self._ExpandBuildOption(Module.BuildOptions)\r
@@ -1037,26 +1119,25 @@ class PlatformAutoGen(AutoGen):
     ModuleAutoGenList   = property(_GetModuleAutoGenList)\r
     LibraryAutoGenList  = property(_GetLibraryAutoGenList)\r
 \r
-## AutoGen class\r
+## ModuleAutoGen class\r
 #\r
 # This class encapsules the AutoGen behaviors for the build tools. In addition to\r
-# the generation of AutoGen.h and AutoGen.c, it can generate *.depex file according\r
-# to the [depex] section in module's inf file. The result of parsing unicode file\r
-# has been incorporated either.\r
+# the generation of AutoGen.h and AutoGen.c, it will generate *.depex file according\r
+# to the [depex] section in module's inf file.\r
 #\r
 class ModuleAutoGen(AutoGen):\r
     ## The real constructor of ModuleAutoGen\r
     #\r
     #  This method is not supposed to be called by users of ModuleAutoGen. It's\r
-    #  only used by factory method New() to do real initialization work for an\r
+    #  only used by factory method __new__() to do real initialization work for an\r
     #  object of ModuleAutoGen\r
     #\r
     #   @param      Workspace           EdkIIWorkspaceBuild object\r
-    #   @param      PlatformAutoGenObj  Platform file (DSC file)\r
     #   @param      ModuleFile          The path of module file\r
     #   @param      Target              Build target (DEBUG, RELEASE)\r
     #   @param      Toolchain           Name of tool chain\r
     #   @param      Arch                The arch the module supports\r
+    #   @param      PlatformFile        Platform meta-file\r
     #\r
     def _Init(self, Workspace, ModuleFile, Target, Toolchain, Arch, PlatformFile):\r
         EdkLogger.verbose("\nAutoGen module [%s] [%s]" % (ModuleFile, Arch))\r
@@ -1066,6 +1147,7 @@ class ModuleAutoGen(AutoGen):
 \r
         self._MetaFile = str(ModuleFile)\r
         self.PlatformInfo = PlatformAutoGen(Workspace, PlatformFile, Target, Toolchain, Arch)\r
+        # check if this module is employed by active platform\r
         if not self.PlatformInfo.ValidModule(self._MetaFile):\r
             EdkLogger.verbose("Module [%s] for [%s] is not employed by active platform\n" \\r
                               % (self._MetaFile, Arch))\r
@@ -1122,32 +1204,41 @@ class ModuleAutoGen(AutoGen):
         return True\r
 \r
 \r
+    ## Return the module build data object\r
     def _GetModule(self):\r
         if self._Module == None:\r
             self._Module = self.Workspace.BuildDatabase[self._MetaFile, self.Arch]\r
         return self._Module\r
 \r
+    ## Return the module name\r
     def _GetBaseName(self):\r
         return self.Module.BaseName\r
 \r
+    ## Return the module meta-file GUID\r
     def _GetGuid(self):\r
         return self.Module.Guid\r
 \r
+    ## Return the module version\r
     def _GetVersion(self):\r
         return self.Module.Version\r
 \r
+    ## Return the module type\r
     def _GetModuleType(self):\r
         return self.Module.ModuleType\r
 \r
+    ## Return the component type (for R8.x style of module)\r
     def _GetComponentType(self):\r
         return self.Module.ComponentType\r
 \r
+    ## Return the PCD_IS_DRIVER setting\r
     def _GetPcdIsDriver(self):\r
         return self.Module.PcdIsDriver\r
 \r
+    ## Return the autogen version, i.e. module meta-file version\r
     def _GetAutoGenVersion(self):\r
         return self.Module.AutoGenVersion\r
 \r
+    ## Check if the module is library or not\r
     def _IsLibrary(self):\r
         if self._LibraryFlag == None:\r
             if self.Module.LibraryClass != None and self.Module.LibraryClass != []:\r
@@ -1156,6 +1247,7 @@ class ModuleAutoGen(AutoGen):
                 self._LibraryFlag = False\r
         return self._LibraryFlag\r
 \r
+    ## Return the directory to store intermediate files of the module\r
     def _GetBuildDir(self):\r
         if self._BuildDir == None:\r
             self._BuildDir = path.join(\r
@@ -1166,19 +1258,19 @@ class ModuleAutoGen(AutoGen):
                                     )\r
         return self._BuildDir\r
 \r
+    ## Return the directory to store the intermediate object files of the mdoule\r
     def _GetOutputDir(self):\r
         if self._OutputDir == None:\r
             self._OutputDir = path.join(self.BuildDir, "OUTPUT")\r
         return self._OutputDir\r
 \r
+    ## Return the directory to store auto-gened source files of the mdoule\r
     def _GetDebugDir(self):\r
         if self._DebugDir == None:\r
             self._DebugDir = path.join(self.BuildDir, "DEBUG")\r
         return self._DebugDir\r
 \r
-    def _GetMakeFileDir(self):\r
-        return path.join(PlatformInfo.BuildDir, self.BuildDir)\r
-\r
+    ## Return the path of custom file\r
     def _GetCustomMakefile(self):\r
         if self._CustomMakefile == None:\r
             self._CustomMakefile = {}\r
@@ -1214,9 +1306,8 @@ class ModuleAutoGen(AutoGen):
                 PackageList.append(Package)\r
         return PackageList\r
 \r
-    ## Parse dependency expression\r
+    ## Merge dependency expression\r
     #\r
-    #   @param      Info    The object of ModuleBuildInfo\r
     #   @retval     list    The token list of the dependency expression after parsed\r
     #\r
     def _GetDepexTokenList(self):\r
@@ -1317,6 +1408,7 @@ class ModuleAutoGen(AutoGen):
 \r
         return self._SourceFileList\r
 \r
+    ## Return the list of unicode files\r
     def _GetUnicodeFileList(self):\r
         if self._UnicodeFileList == None:\r
             self._GetSourceFileList()\r
@@ -1326,7 +1418,6 @@ class ModuleAutoGen(AutoGen):
     #\r
     #  "Build" binary files are just to copy them to build directory.\r
     #\r
-    #   @param      PlatformInfo    The object of PlatformBuildInfo\r
     #   @retval     list            The list of files which can be built later\r
     #\r
     def _GetBinaryFiles(self):\r
@@ -1349,7 +1440,6 @@ class ModuleAutoGen(AutoGen):
 \r
     ## Return the list of auto-generated code file\r
     #\r
-    #   @param      BuildInfo   The object ModuleBuildInfo\r
     #   @retval     list        The list of auto-generated file\r
     #\r
     def _GetAutoGenFileList(self):\r
@@ -1364,6 +1454,7 @@ class ModuleAutoGen(AutoGen):
                 self._AutoGenFileList[gAutoGenHeaderFileName] = AutoGenH\r
         return self._AutoGenFileList\r
 \r
+    ## Return the list of library modules explicitly or implicityly used by this module\r
     def _GetLibraryList(self):\r
         if self._DependentLibraryList == None:\r
             # only merge library classes and PCD for non-library module\r
@@ -1378,7 +1469,6 @@ class ModuleAutoGen(AutoGen):
 \r
     ## Get the list of PCD\r
     #\r
-    #   @param      DependentLibraryList    The list of dependent library\r
     #   @retval     list                    The list of PCD\r
     #\r
     def _GetPcdList(self):\r
@@ -1429,7 +1519,6 @@ class ModuleAutoGen(AutoGen):
 \r
     ## Get the list of include search path\r
     #\r
-    #   @param      DependentPackageList    The list of package object\r
     #   @retval     list                    The list path\r
     #\r
     def _GetIncludePathList(self):\r
@@ -1534,6 +1623,7 @@ class ModuleAutoGen(AutoGen):
         self.IsCodeFileCreated = True\r
         return AutoGenList\r
 \r
+    ## Summarize the ModuleAutoGen objects of all libraries used by this module\r
     def _GetLibraryAutoGenList(self):\r
         if self._LibraryAutoGenList == None:\r
             self._LibraryAutoGenList = []\r
diff --git a/Source/Python/AutoGen/BuildInfo.py b/Source/Python/AutoGen/BuildInfo.py
deleted file mode 100644 (file)
index 52bb1df..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-## @file
-# Class definitions for storing build information
-#
-# Copyright (c) 2007, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-
-## Base class of build information
-# 
-#   BuildInfo defines basic operations which are needed for it to be used as KEY
-# in dictionary. This should be used for derivation only.
-# 
-class BuildInfo(object):
-    ## Constructor
-    #
-    #   @param  MetaInfo    The raw information the build information will be 
-    #                       extracted from
-    # 
-    def __init__(self, MetaInfo):
-        self._Key = str(MetaInfo)
-
-    ## str() operator
-    def __str__(self):
-        return self._Key
-
-    ## "==" operator
-    def __eq__(self, other):
-        return self._Key == str(other)
-
-    ## hash() operator
-    def __hash__(self):
-        return hash(self._Key)
-
-## Build information of a module
-# 
-#   ModuleBuildInfo class is intended to gather build information for a module.
-# The input "Module" ojbect must support str() operation.
-# 
-class ModuleBuildInfo(BuildInfo):
-    ## Constructor
-    #
-    #   @param  Module  The ModuleBuildClassObject object
-    # 
-    def __init__(self, Module):
-        BuildInfo.__init__(self, Module)
-        self.Module     = Module
-        self.AutoGenVersion = Module.AutoGenVersion
-
-        self.Name       = Module.BaseName
-        self.Guid       = Module.Guid
-        self.Version    = Module.Version
-        self.ModuleType = Module.ModuleType
-
-        self.PlatformInfo = None
-        self.PackageInfo = None
-        self.Arch = ""
-        self.ToolChain = ""
-        self.BuildTarget = ""
-        self.PcdIsDriver = ""
-
-        self.IsLibrary = False
-        self.IsBinary = False
-
-        self.BaseName = ""
-        self.FileBase = ""
-        self.FileExt = ""
-
-        self.WorkspaceDir = ""
-        self.SourceDir = ""
-        self.BuildDir = ""
-        self.OutputDir = ""
-        self.DebugDir = ""
-        self.MakeFileDir = ""
-        self.CustomMakefile = {}
-
-        self.IncludePathList = []
-        self.AutoGenFileList = []
-        self.UnicodeFileList = []
-        self.SourceFileList = []
-        self.ObjectFileList = []
-        self.BinaryFileDict = {} # FileType : [File List]
-
-        self.DependentPackageList = []
-        self.DependentLibraryList = []
-        self.LibraryAutoGenList = []
-        self.DerivedPackageList = []
-
-        self.FileDependency = {}
-        self.BuildOption = {}
-
-        self.PcdList = []
-        self.GuidList = []
-        self.ProtocolList = []
-        self.PpiList = []
-
-        self.Macro = {}
-        self.DepexList = []
-
-## Build information of a package
-# 
-#   PackageBuildInfo class is intended to gather build information for a package.
-# The input "Package" ojbect must support str() operation.
-# 
-class PackageBuildInfo(BuildInfo):
-    ## Constructor
-    #
-    #   @param  Package     The PackageBuildClassObject object
-    # 
-    def __init__(self, Package):
-        BuildInfo.__init__(self, Package)
-        self.Package    = Package
-        self.Name       = Package.PackageName
-        self.Guid       = Package.Guid
-        self.Version    = Package.Version
-
-        self.SourceDir = ""
-        self.IncludePathList = []
-
-## Build information of a platform
-# 
-#   PlatformBuildInfo class is intended to gather build information for a platform.
-# The input "Platform" ojbect must support str() operation.
-# 
-class PlatformBuildInfo(BuildInfo):
-    ## Constructor
-    #
-    #   @param  Platform    The PlatformBuildClassObject object
-    # 
-    def __init__(self, Platform):
-        BuildInfo.__init__(self, Platform)
-        self.Platform   = Platform
-        self.Name       = Platform.PlatformName
-        self.Guid       = Platform.Guid
-        self.Version    = Platform.Version
-
-        self.ArchList = []
-        self.ToolChain = ""
-        self.BuildTarget = ""
-        self.BuildRule = ""
-
-        self.WorkspaceDir = ""
-        self.SourceDir = ""
-        self.BuildDir = ""
-        self.OutputDir = ""
-        self.DebugDir = ""
-        self.LibraryDir = ""
-        self.FvDir = ""
-        self.MakeFileDir = ""
-        self.FdfFile = ""
-
-        self.ModuleAutoGenList = []
-        self.LibraryAutoGenList = []
-        self.PackageList = []
-
-        self.PcdTokenNumber = {}    # (TokenCName, TokenSpaceGuidCName) : GeneratedTokenNumber
-        self.DynamicPcdList = []    # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]
-        self.NonDynamicPcdList = [] # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]
-
-        self.ToolPath = {}          # toolcode : tool path
-        self.ToolDllPath = {}       # toolcode : lib path
-        self.ToolStaticLib = {}     # toolcode : lib path
-        self.ToolChainFamily = {}   # toolcode : tool chain family
-        self.BuildOption = {}       # toolcode : option
-        self.OutputFlag = {}        # toolcode : output flag
-        self.IncludeFlag = {}       # toolcode : include flag
-        self.ToolOption = {}        # toolcode : tool option string
-
index c72d75f..9ddb9cf 100644 (file)
@@ -21,7 +21,6 @@ from Common.BuildToolError import *
 from Common.DataType import *\r
 from Common.EdkIIWorkspace import *\r
 from Common.Misc import *\r
-from BuildInfo import *\r
 from StrGather import *\r
 \r
 ## PCD type string\r
@@ -768,7 +767,7 @@ gModuleTypeHeaderFile = {
 \r
 ## Create code for module PCDs\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #   @param      Pcd         The PCD object\r
@@ -872,7 +871,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
 \r
 ## Create code for library module PCDs\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #   @param      Pcd         The PCD object\r
@@ -1264,7 +1263,7 @@ def CreatePcdDatabasePhaseSpecificAutoGen (Platform, Phase):
 \r
 ## Create code for PCD database\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1290,7 +1289,7 @@ def CreatePcdDatabaseCode (Info, AutoGenC, AutoGenH):
 \r
 ## Create code for library constructor\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1339,7 +1338,7 @@ def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for library destructor\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1390,7 +1389,7 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for ModuleEntryPoint\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1430,7 +1429,7 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for ModuleUnloadImage\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1449,7 +1448,7 @@ def CreateModuleUnloadImageCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for GUID\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1470,7 +1469,7 @@ def CreateGuidDefinitionCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for protocol\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1491,7 +1490,7 @@ def CreateProtocolDefinitionCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for PPI\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1512,7 +1511,7 @@ def CreatePpiDefinitionCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for PCD\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1527,7 +1526,7 @@ def CreatePcdCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for unicode string definition\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1552,7 +1551,7 @@ def CreateUnicodeStringCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create common code\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1594,7 +1593,7 @@ def CreateHeaderCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create common code for header file\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
@@ -1603,7 +1602,7 @@ def CreateFooterCode(Info, AutoGenC, AutoGenH):
 \r
 ## Create code for a module\r
 #\r
-#   @param      Info        The ModuleBuildInfo object\r
+#   @param      Info        The ModuleAutoGen object\r
 #   @param      AutoGenC    The TemplateString object for C code\r
 #   @param      AutoGenH    The TemplateString object for header file\r
 #\r
index 19ac708..43ec941 100755 (executable)
@@ -23,7 +23,6 @@ from Common.EdkIIWorkspaceBuild import *
 from Common.EdkIIWorkspace import *\r
 from Common.BuildToolError import *\r
 from Common.Misc import *\r
-from BuildInfo import *\r
 from BuildEngine import *\r
 import Common.GlobalData as GlobalData\r
 \r
@@ -33,7 +32,7 @@ gIncludePattern = re.compile("^[ #]*include[ \t]+[\"<]*([^\"<>\n\r]+)[>\" ]*$",
 ## Regular expression for matching macro used in header file inclusion\r
 gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE)\r
 \r
-##\r
+## pattern for include style in R8.x code\r
 gProtocolDefinition = "Protocol/%(HeaderKey)s/%(HeaderKey)s.h"\r
 gGuidDefinition = "Guid/%(HeaderKey)s/%(HeaderKey)s.h"\r
 gArchProtocolDefinition = "ArchProtocol/%(HeaderKey)s/%(HeaderKey)s.h"\r
@@ -54,6 +53,7 @@ gIncludeMacroConversion = {
   "EFI_PPI_DEPENDENCY"              :   gPpiDefinition,\r
 }\r
 \r
+## default makefile type\r
 gMakeType = ""\r
 if sys.platform == "win32":\r
     gMakeType = "nmake"\r
@@ -63,17 +63,20 @@ else:
 \r
 ## BuildFile class\r
 #\r
-#  This class encapsules makefie and its generation. It uses template to generate\r
-#  the content of makefile. The content of makefile will be got from PlatformBuildInfo\r
-#  or ModuleBuildInfo objects.\r
+#  This base class encapsules build file and its generation. It uses template to generate\r
+#  the content of build file. The content of build file will be got from AutoGen objects.\r
 #\r
 class BuildFile(object):\r
+    ## template used to generate the build file (i.e. makefile if using make)\r
     _TEMPLATE_ = ''\r
+\r
+    ## default file name for each type of build file\r
     _FILE_NAME_ = {\r
         "nmake" :   "Makefile",\r
         "gmake" :   "GNUmakefile"\r
     }\r
 \r
+    ## Fixed header string for makefile\r
     _MAKEFILE_HEADER = '''#\r
 # DO NOT EDIT\r
 # This file is auto-generated by build utility\r
@@ -87,13 +90,14 @@ class BuildFile(object):
 #   Auto-generated makefile for building modules, libraries or platform\r
 #\r
     '''\r
-    \r
+\r
+    ## Header string for each type of build file\r
     _FILE_HEADER_ = {\r
         "nmake" :   _MAKEFILE_HEADER % _FILE_NAME_["nmake"],\r
         "gmake" :   _MAKEFILE_HEADER % _FILE_NAME_["gmake"]\r
     }\r
 \r
-    #   \r
+    ## shell commands which can be used in build file in the form of macro\r
     #   $(CP)     copy file command\r
     #   $(MV)     move file command\r
     #   $(RM)     remove file command\r
@@ -118,31 +122,44 @@ class BuildFile(object):
         }\r
     }\r
 \r
+    ## directory separator\r
     _SEP_ = {\r
         "nmake" :   "\\", \r
         "gmake" :   "/"\r
     }\r
-    \r
+\r
+    ## directory creation template\r
     _MD_TEMPLATE_ = {\r
         "nmake" :   'if not exist %(dir)s $(MD) %(dir)s',\r
         "gmake" :   "test ! -e %(dir)s && $(MD) %(dir)s"\r
     }\r
 \r
+    ## directory removal template\r
     _RD_TEMPLATE_ = {\r
         "nmake" :   'if exist %(dir)s $(RD) %(dir)s',\r
         "gmake" :   "test -e %(dir)s && $(RD) %(dir)s"\r
     }\r
-    \r
+\r
     _INC_FLAG_ = {"MSFT" : "/I", "GCC" : "-I", "INTEL" : "-I"}\r
     \r
     _LIB_GROUP_START_ = {"MSFT" : "", "GCC" : "-(", "INTEL" : ""}\r
-    _LIB_GROUP_END = {"MSFT" : "", "GCC" : "-)", "INTEL" : ""}\r
-    \r
+    _LIB_GROUP_END = {"MSFT" : "", "GCC" : "-)", "INTEL" : ""}    \r
 \r
+    ## Constructor of BuildFile\r
+    #\r
+    #   @param  AutoGenObject   Object of AutoGen class\r
+    # \r
     def __init__(self, AutoGenObject):\r
         self._AutoGenObject = AutoGenObject\r
         self._FileType = gMakeType\r
 \r
+    ## Create build file\r
+    #\r
+    #   @param  FileType    Type of build file. Only nmake and gmake are supported now.\r
+    # \r
+    #   @retval TRUE        The build file is created or re-created successfully\r
+    #   @retval FALSE       The build file exists and is the same as the one to be generated\r
+    # \r
     def Generate(self, FileType=gMakeType):\r
         self._FileType = FileType\r
         FileContent = TemplateString()\r
@@ -154,7 +171,6 @@ class BuildFile(object):
     ## Return a list of directory creation command string\r
     #\r
     #   @param      DirList     The list of directory to be created\r
-    #   @param      MakeType    GNU makefile or MS makefile\r
     #\r
     #   @retval     list        The directory creation command list\r
     #\r
@@ -164,7 +180,6 @@ class BuildFile(object):
     ## Return a list of directory removal command string\r
     #\r
     #   @param      DirList     The list of directory to be removed\r
-    #   @param      MakeType    GNU makefile or MS makefile\r
     #\r
     #   @retval     list        The directory removal command list\r
     #\r
@@ -172,7 +187,13 @@ class BuildFile(object):
         return [self._RD_TEMPLATE_[self._FileType] % {'dir':Dir} for Dir in DirList]\r
 \r
 \r
+## ModuleMakefile class\r
+#\r
+#  This class encapsules makefie and its generation for module. It uses template to generate\r
+#  the content of makefile. The content of makefile will be got from ModuleAutoGen object.\r
+#\r
 class ModuleMakefile(BuildFile):\r
+    ## template used to generate the makefile for module\r
     _TEMPLATE_ = '''\\r
 ${makefile_header}\r
 \r
@@ -362,7 +383,11 @@ cleanpch:
 cleanlib:\r
 \t${BEGIN}@cd ${dependent_library_build_directory} && "$(MAKE)" $(MAKE_FLAGS) cleanall\r
 \t${END}@cd $(MODULE_BUILD_DIR)\n'''\r
-    \r
+\r
+    ## Constructor of ModuleMakefile\r
+    #\r
+    #   @param  ModuleAutoGen   Object of ModuleAutoGen class\r
+    # \r
     def __init__(self, ModuleAutoGen):\r
         BuildFile.__init__(self, ModuleAutoGen)\r
         self.PlatformInfo = self._AutoGenObject.PlatformInfo\r
@@ -370,11 +395,11 @@ cleanlib:
         self.ResultFileList = []\r
         self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"]\r
     \r
-        self.SourceFileDatabase = {}  # {file type : file path}\r
-        self.DestFileDatabase = {}  # {file type : file path}\r
-        self.FileBuildTargetList = [] # [(src, target string)]\r
-        self.BuildTargetList = [] # [target string]\r
-        self.PendingBuildTargetList = [] # [FileBuildRule objects]\r
+        self.SourceFileDatabase = {}        # {file type : file path}\r
+        self.DestFileDatabase = {}          # {file type : file path}\r
+        self.FileBuildTargetList = []       # [(src, target string)]\r
+        self.BuildTargetList = []           # [target string]\r
+        self.PendingBuildTargetList = []    # [FileBuildRule objects]\r
         self.CommonFileDependency = []\r
 \r
         self.FileDependency = []\r
@@ -384,6 +409,7 @@ cleanlib:
         self.LibraryBuildDirectoryList = []\r
         self.SystemLibraryList = []\r
 \r
+    # Compose a dict object containing information used to do replacement in template\r
     def _CreateTemplateDict(self):\r
         if self._FileType not in self._SEP_:\r
             EdkLogger.error("build", PARAMETER_INVALID, "Invalid Makefile type", ExtraData=self._FileType)\r
@@ -523,8 +549,6 @@ cleanlib:
     #  build rules in $(WORKSPACE)/Conf/build_rule.txt. The dependencies of source\r
     #  file are figured out by search included files in the source file.\r
     #\r
-    #   @param      MakeType    GNU makefile or MS makefile\r
-    #\r
     def ProcessSourceFileList(self):\r
         Separator = self._SEP_[self._FileType]\r
 \r
@@ -743,8 +767,6 @@ cleanlib:
     #\r
     # All binary files are just copied to $(OUTPUT_DIR)\r
     # \r
-    #   @param      MakeType    GNU makefile or MS makefile\r
-    #\r
     def ProcessBinaryFileList(self):\r
         BinaryFiles = self._AutoGenObject.BinaryFileDict\r
         BuildTargetString = "%(dst)s : %(src)s\n"\\r
@@ -761,9 +783,6 @@ cleanlib:
                 self.BuildTargetList.append(BuildTargetString % {"dst":Dst, "src":Src})\r
 \r
     ## For creating makefile targets for dependent libraries\r
-    #\r
-    #   @param      MakeType    GNU makefile or MS makefile\r
-    #\r
     def ProcessDependentLibrary(self):\r
         for LibraryAutoGen in self._AutoGenObject.LibraryAutoGenList:\r
             self.LibraryBuildDirectoryList.append(LibraryAutoGen.BuildDir)\r
@@ -879,7 +898,13 @@ cleanlib:
 \r
     _TemplateDict = property(_CreateTemplateDict)\r
 \r
+## CustomMakefile class\r
+#\r
+#  This class encapsules makefie and its generation for module. It uses template to generate\r
+#  the content of makefile. The content of makefile will be got from ModuleAutoGen object.\r
+#\r
 class CustomMakefile(BuildFile):\r
+    ## template used to generate the makefile for module with custom makefile\r
     _TEMPLATE_ = '''\\r
 ${makefile_header}\r
 \r
@@ -969,29 +994,27 @@ init:
 ${BEGIN}\t-@${create_directory_command}\n${END}\\r
 \r
 '''\r
+    ## Constructor of CustomMakefile\r
+    #\r
+    #   @param  ModuleAutoGen   Object of ModuleAutoGen class\r
+    # \r
     def __init__(self, ModuleAutoGen):\r
         BuildFile.__init__(self, ModuleAutoGen)\r
         self.PlatformInfo = self._AutoGenObject.PlatformInfo\r
         self.IntermediateDirectoryList = ["$(DEBUG_DIR)", "$(OUTPUT_DIR)"]\r
 \r
-    ## Create customized makefile for a module\r
-    #\r
-    #   @param      File        The path of the makefile\r
-    #   @param      MakeType    GNU makefile or MS makefile\r
-    #\r
-    #   @retval     True        If the file is changed or doesn't exist\r
-    #   @retval     False       If the file exists and its content is not changed\r
-    #                           since last time\r
-    #\r
+    # Compose a dict object containing information used to do replacement in template\r
     def _CreateTemplateDict(self):\r
         Separator = self._SEP_[self._FileType]\r
         try:\r
-            CustomMakefile = open(\r
-                                os.path.join(\r
-                                            self._AutoGenObject.WorkspaceDir, \r
-                                            self._AutoGenObject.CustomMakefile[self._FileType]\r
-                                            ),\r
-                                'r').read()\r
+            if self._FileType not in self._AutoGenObject.CustomMakefile:\r
+                EdkLogger.error('build', OPTION_NOT_SUPPORTED, "No custom makefile for %s" % self._FileType,\r
+                                ExtraData=str(self._AutoGenObject))\r
+            MakefilePath = os.path.join(\r
+                                    self._AutoGenObject.WorkspaceDir, \r
+                                    self._AutoGenObject.CustomMakefile[self._FileType]\r
+                                    )\r
+            CustomMakefile = open(MakefilePath, 'r').read()\r
         except:\r
             EdkLogger.error('build', FILE_OPEN_FAILURE, ExtraData=self._AutoGenObject.CustomMakefile[self._FileType])\r
 \r
@@ -1035,7 +1058,14 @@ ${BEGIN}\t-@${create_directory_command}\n${END}\
 \r
     _TemplateDict = property(_CreateTemplateDict)\r
 \r
+## PlatformMakefile class\r
+#\r
+#  This class encapsules makefie and its generation for platform. It uses \r
+# template to generate the content of makefile. The content of makefile will be\r
+# got from PlatformAutoGen object.\r
+#\r
 class PlatformMakefile(BuildFile):\r
+    ## template used to generate the makefile for platform\r
     _TEMPLATE_ = '''\\r
 ${makefile_header}\r
 \r
@@ -1129,6 +1159,10 @@ cleanlib:
 \t${END}@cd $(BUILD_DIR)\n\r
 '''\r
 \r
+    ## Constructor of PlatformMakefile\r
+    #\r
+    #   @param  ModuleAutoGen   Object of PlatformAutoGen class\r
+    # \r
     def __init__(self, PlatformAutoGen):\r
         BuildFile.__init__(self, PlatformAutoGen)\r
         self.ModuleBuildCommandList = []\r
@@ -1137,15 +1171,7 @@ cleanlib:
         self.ModuleBuildDirectoryList = []\r
         self.LibraryBuildDirectoryList = []\r
 \r
-    ## Create makefile of platform\r
-    #\r
-    #   @param      File        The path of the makefile\r
-    #   @param      MakeType    GNU makefile or MS makefile\r
-    #\r
-    #   @retval     True        If the file is changed or doesn't exist\r
-    #   @retval     False       If the file exists and its content is not changed\r
-    #                           since last time\r
-    #\r
+    # Compose a dict object containing information used to do replacement in template\r
     def _CreateTemplateDict(self):\r
         Separator = self._SEP_[self._FileType]\r
 \r
@@ -1208,7 +1234,14 @@ cleanlib:
 \r
     _TemplateDict = property(_CreateTemplateDict)\r
 \r
+## TopLevelMakefile class\r
+#\r
+#  This class encapsules makefie and its generation for entrance makefile. It \r
+# uses template to generate the content of makefile. The content of makefile \r
+# will be got from WorkspaceAutoGen object.\r
+#\r
 class TopLevelMakefile(BuildFile):\r
+    ## template used to generate toplevel makefile\r
     _TEMPLATE_ = '''\\r
 ${makefile_header}\r
 \r
@@ -1304,19 +1337,15 @@ ${BEGIN}\t@cd $(BUILD_DIR)${separator}${arch} && "$(MAKE)" $(MAKE_FLAGS) cleanli
 ${END}\t@cd $(BUILD_DIR)\n\r
 '''\r
 \r
+    ## Constructor of TopLevelMakefile\r
+    #\r
+    #   @param  Workspace   Object of WorkspaceAutoGen class\r
+    # \r
     def __init__(self, Workspace):\r
         BuildFile.__init__(self, Workspace)\r
         self.IntermediateDirectoryList = []\r
 \r
-    ## Create makefile of platform\r
-    #\r
-    #   @param      File        The path of the makefile\r
-    #   @param      MakeType    GNU makefile or MS makefile\r
-    #\r
-    #   @retval     True        If the file is changed or doesn't exist\r
-    #   @retval     False       If the file exists and its content is not changed\r
-    #                           since last time\r
-    #\r
+    # Compose a dict object containing information used to do replacement in template\r
     def _CreateTemplateDict(self):\r
         Separator = self._SEP_[self._FileType]\r
 \r
@@ -1403,7 +1432,7 @@ ${END}\t@cd $(BUILD_DIR)\n
 \r
     _TemplateDict = property(_CreateTemplateDict)\r
 \r
-\r
 # This acts like the main() function for the script, unless it is 'import'ed into another script.\r
 if __name__ == '__main__':\r
     pass\r
+\r
index 96cbc56..3bc3937 100644 (file)
@@ -48,7 +48,6 @@ gSupportedTarget = ['all', 'genc', 'genmake', 'modules', 'libraries', 'fds', 'cl
 ## build configuration file\r
 gBuildConfiguration = "Conf/target.txt"\r
 gBuildCacheDir = "Conf/.cache"\r
-gDatabaseFile = "Conf/.cache/build.db"\r
 \r
 ## Check environment PATH variable to make sure the specified tool is found\r
 #\r
@@ -655,7 +654,7 @@ class Build():
 \r
         self.TargetTxt      = TargetTxtClassObject()\r
         self.ToolDef        = ToolDefClassObject()\r
-        self.Db             = WorkspaceDatabase(gDatabaseFile, GlobalData.gGlobalDefines, self.Reparse)\r
+        self.Db             = WorkspaceDatabase(None, GlobalData.gGlobalDefines, self.Reparse)\r
         self.BuildDatabase  = self.Db.BuildObject\r
         self.Platform       = None\r
 \r
@@ -850,8 +849,8 @@ class Build():
         if AutoGenObject == None:\r
             return False\r
 \r
-        # skip file generation for cleanxxx targets and run target\r
-        if Target not in ['clean', 'cleanlib', 'cleanall', 'run']:    \r
+        # skip file generation for cleanxxx targets, run and fds target\r
+        if Target not in ['clean', 'cleanlib', 'cleanall', 'run', 'fds']:\r
             # for target which must generate AutoGen code and makefile\r
             if not self.SkipAutoGen or Target == 'genc':\r
                 self.Progress.Start("Generating code")\r