Fixed an error which caused value of PCD cannot be overridden.
authorjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 16 May 2008 08:44:07 +0000 (08:44 +0000)
committerjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 16 May 2008 08:44:07 +0000 (08:44 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1235 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/AutoGen/AutoGen.py

index 61ef3c7..093087c 100755 (executable)
@@ -18,6 +18,7 @@ import os
 import re\r
 import os.path as path\r
 import imp\r
+import copy\r
 from optparse import OptionParser\r
 from optparse import make_option\r
 \r
@@ -84,7 +85,7 @@ gAutoGenDepexFileName = "%(module_name)s.depex"
 ## Base class for AutoGen\r
 #\r
 #   This class just implements the cache mechanism of AutoGen objects.\r
-# \r
+#\r
 class AutoGen(object):\r
     # database to maintain the objects of xxxAutoGen\r
     _CACHE_ = {}    # (BuildTarget, ToolChain) : {ARCH : {platform file: AutoGen object}}}\r
@@ -100,7 +101,7 @@ class AutoGen(object):
     #   @param  Arch            Target arch\r
     #   @param  *args           The specific class related parameters\r
     #   @param  **kwargs        The specific class related dict parameters\r
-    # \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
@@ -146,10 +147,10 @@ class AutoGen(object):
 #\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
+#\r
 class WorkspaceAutoGen(AutoGen):\r
     ## Real constructor of WorkspaceAutoGen\r
-    # \r
+    #\r
     # This method behaves the same as __init__ except that it needs explict invoke\r
     # (in super class's __new__ method)\r
     #\r
@@ -165,7 +166,7 @@ class WorkspaceAutoGen(AutoGen):
     #   @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
+    #\r
     def _Init(self, WorkspaceDir, ActivePlatform, Target, Toolchain, ArchList, MetaFileDb,\r
               BuildConfig, ToolDefinition, FlashDefinitionFile='', Fds=[], Fvs=[], SkuId=''):\r
         self._MetaFile      = str(ActivePlatform)\r
@@ -219,7 +220,7 @@ class WorkspaceAutoGen(AutoGen):
         if self._FvDir == None:\r
             self._FvDir = path.join(self.BuildDir, 'FV')\r
         return self._FvDir\r
-            \r
+\r
     ## Return the directory to store all intermediate and final files built\r
     def _GetBuildDir(self):\r
         return self.AutoGenObjectList[0].BuildDir\r
@@ -302,7 +303,7 @@ class WorkspaceAutoGen(AutoGen):
 \r
     Name                = property(_GetName)\r
     Guid                = property(_GetGuid)\r
-    Version             = property(_GetVersion)                       \r
+    Version             = property(_GetVersion)\r
     OutputDir           = property(_GetOutputDir)\r
 \r
     ToolPath            = property(_GetToolPaths)       # toolcode : tool path\r
@@ -409,7 +410,7 @@ class PlatformAutoGen(AutoGen):
     def CreateMakeFile(self, CreateModuleMakeFile=False):\r
         if CreateModuleMakeFile:\r
             for ModuleFile in self.Platform.Modules:\r
-                Ma = ModuleAutoGen(self.Workspace, ModuleFile, \r
+                Ma = ModuleAutoGen(self.Workspace, ModuleFile,\r
                                               self.BuildTarget, self.ToolChain,\r
                                               self.Arch, self._MetaFile)\r
                 Ma.CreateMakeFile(True)\r
@@ -464,7 +465,7 @@ class PlatformAutoGen(AutoGen):
         if self._BuildDir == None:\r
             if os.path.isabs(self.OutputDir):\r
                 self._BuildDir = path.join(\r
-                                            path.abspath(self.OutputDir), \r
+                                            path.abspath(self.OutputDir),\r
                                             self.BuildTarget + "_" + self.ToolChain,\r
                                             )\r
             else:\r
@@ -693,13 +694,13 @@ class PlatformAutoGen(AutoGen):
                     EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
                     self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
                     TokenNumber += 1\r
-        \r
+\r
             for Pcd in self.DynamicPcdList:\r
                 if Pcd.Phase == "DXE":\r
                     EdkLogger.debug(EdkLogger.DEBUG_5, "%s %s (%s) -> %d" % (Pcd.TokenCName, Pcd.TokenSpaceGuidCName, Pcd.Phase, TokenNumber))\r
                     self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
                     TokenNumber += 1\r
-        \r
+\r
             for Pcd in self.NonDynamicPcdList:\r
                 self._PcdTokenNumber[Pcd.TokenCName, Pcd.TokenSpaceGuidCName] = TokenNumber\r
                 TokenNumber += 1\r
@@ -714,8 +715,8 @@ class PlatformAutoGen(AutoGen):
                     self.Workspace,\r
                     ModuleFile,\r
                     self.BuildTarget,\r
-                    self.ToolChain, \r
-                    self.Arch, \r
+                    self.ToolChain,\r
+                    self.Arch,\r
                     self._MetaFile\r
                     )\r
             if Ma not in self._ModuleAutoGenList:\r
@@ -748,11 +749,11 @@ class PlatformAutoGen(AutoGen):
     #\r
     # This method will not only resolve library classes but also sort the library\r
     # instances according to the dependency-ship.\r
-    # \r
+    #\r
     #   @param  Module      The module from which the library classes will be resolved\r
-    # \r
+    #\r
     #   @retval library_list    List of library instances sorted\r
-    # \r
+    #\r
     def ApplyLibraryInstance(self, Module):\r
         ModuleType = Module.ModuleType\r
         # apply library instances from platform\r
@@ -792,7 +793,7 @@ class PlatformAutoGen(AutoGen):
                     elif ModuleType not in LibraryModule.LibraryClass[0].SupModList:\r
                         EdkLogger.error("build", OPTION_MISSING,\r
                                         "Module type [%s] is not supported by library instance [%s]" \\r
-                                        % (ModuleType, LibraryPath), File=self._MetaFile, \r
+                                        % (ModuleType, LibraryPath), File=self._MetaFile,\r
                                         ExtraData="\tconsumed by [%s]" % str(Module))\r
 \r
                     LibraryInstance[LibraryClassName] = LibraryModule\r
@@ -906,22 +907,22 @@ class PlatformAutoGen(AutoGen):
         #\r
         # Build the list of constructor and destructir names\r
         # The DAG Topo sort produces the destructor order, so the list of constructors must generated in the reverse order\r
-        #                \r
+        #\r
         SortedLibraryList.reverse()\r
         return SortedLibraryList\r
-    \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
+    #\r
     def _OverridePcd(self, ToPcd, FromPcd):\r
-        # \r
+        #\r
         # in case there's PCDs coming from FDF file, which have no type given.\r
         # at this point, PcdInModule.Type has the type found from dependent\r
         # package\r
-        # \r
+        #\r
         if FromPcd != None:\r
             if FromPcd.Type not in [None, '']:\r
                 ToPcd.Type = FromPcd.Type\r
@@ -963,9 +964,9 @@ class PlatformAutoGen(AutoGen):
     ## Apply PCD setting defined platform to a module\r
     #\r
     #   @param  Module  The module from which the PCD setting will be overrided\r
-    # \r
+    #\r
     #   @retval PCD_list    The list PCDs with settings from platform\r
-    # \r
+    #\r
     def ApplyPcdSetting(self, Module):\r
         # for each PCD in module\r
         for Name,Guid in Module.Pcds:\r
@@ -1002,13 +1003,13 @@ class PlatformAutoGen(AutoGen):
         return Module.Pcds.values()\r
 \r
     ## Resolve library names to library modules\r
-    # \r
+    #\r
     # (for R8.x modules)\r
-    # \r
+    #\r
     #   @param  Module  The module from which the library names will be resolved\r
-    # \r
+    #\r
     #   @retval library_list    The list of library modules\r
-    # \r
+    #\r
     def ResolveLibraryReference(self, Module):\r
         EdkLogger.verbose("")\r
         EdkLogger.verbose("Library instances of module [%s] [%s]:" % (str(Module), self.Arch))\r
@@ -1035,9 +1036,9 @@ class PlatformAutoGen(AutoGen):
     ## Expand * in build option key\r
     #\r
     #   @param  Options     Options to be expanded\r
-    # \r
+    #\r
     #   @retval options     Options expanded\r
-    # \r
+    #\r
     def _ExpandBuildOption(self, Options):\r
         BuildOptions = {}\r
         for Key in Options:\r
@@ -1061,11 +1062,11 @@ class PlatformAutoGen(AutoGen):
         return BuildOptions\r
 \r
     ## Append build options in platform to a module\r
-    # \r
+    #\r
     #   @param  Module  The module to which the build options will be appened\r
-    # \r
+    #\r
     #   @retval options     The options appended with build options in platform\r
-    # \r
+    #\r
     def ApplyBuildOption(self, Module):\r
         PlatformOptions = self.BuildOption\r
         ModuleOptions = self._ExpandBuildOption(Module.BuildOptions)\r
@@ -1094,12 +1095,12 @@ class PlatformAutoGen(AutoGen):
     Name                = property(_GetName)\r
     Guid                = property(_GetGuid)\r
     Version             = property(_GetVersion)\r
-                       \r
+\r
     OutputDir           = property(_GetOutputDir)\r
     BuildDir            = property(_GetBuildDir)\r
     MakeFileDir         = property(_GetMakeFileDir)\r
     FdfFile             = property(_GetFdfFile)\r
-    \r
+\r
     PcdTokenNumber      = property(_GetPcdTokenNumbers)    # (TokenCName, TokenSpaceGuidCName) : GeneratedTokenNumber\r
     DynamicPcdList      = property(_GetDynamicPcdList)    # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]\r
     NonDynamicPcdList   = property(_GetNonDynamicPcdList)    # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]\r
@@ -1276,7 +1277,7 @@ class ModuleAutoGen(AutoGen):
             self._CustomMakefile = {}\r
             for Type in self.Module.CustomMakefile:\r
                 MakeType = gMakeTypeMap[Type]\r
-                self._CustomMakefile[MakeType] = os.path.join(self.SourceDir, self.Module.CustomMakefile[Type])    \r
+                self._CustomMakefile[MakeType] = os.path.join(self.SourceDir, self.Module.CustomMakefile[Type])\r
         return self._CustomMakefile\r
 \r
     ## Return the directory of the makefile\r
@@ -1479,8 +1480,8 @@ class ModuleAutoGen(AutoGen):
                     for Key in Library.Pcds:\r
                         if Key in self.Module.Pcds:\r
                             continue\r
-                        self.Module.Pcds[Key] = Library.Pcds[Key]\r
-                # apply PCD settings from platform            \r
+                        self.Module.Pcds[Key] = copy.copy(Library.Pcds[Key])\r
+                # apply PCD settings from platform\r
             self._PcdList = self.PlatformInfo.ApplyPcdSetting(self.Module)\r
         return self._PcdList\r
 \r