]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/AutoGen/AutoGen.py
Sync BaseTool trunk (version r2640) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / AutoGen.py
index 71d0d757d825936da1bbd654e6e5eb486c28849c..11cf8b2f18deb0c6f7b27a3357a42e4fb3d50110 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Generate AutoGen.h, AutoGen.c and *.depex files\r
 #\r
-# Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
 # 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
@@ -334,6 +334,7 @@ class WorkspaceAutoGen(AutoGen):
             # Explicitly collect platform's dynamic PCDs\r
             #\r
             Pa.CollectPlatformDynamicPcds()\r
+            Pa.CollectFixedAtBuildPcds()\r
             self.AutoGenObjectList.append(Pa)\r
         \r
         #\r
@@ -785,6 +786,7 @@ class PlatformAutoGen(AutoGen):
         self._PcdTokenNumber = None    # (TokenCName, TokenSpaceGuidCName) : GeneratedTokenNumber\r
         self._DynamicPcdList = None    # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]\r
         self._NonDynamicPcdList = None # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]\r
+        self._NonDynamicPcdDict = {}\r
 \r
         self._ToolDefinitions = None\r
         self._ToolDefFile = None          # toolcode : tool path\r
@@ -851,6 +853,32 @@ class PlatformAutoGen(AutoGen):
                             (self.MetaFile, self.Arch))\r
         self.IsMakeFileCreated = True\r
 \r
+    ## Deal with Shared FixedAtBuild Pcds\r
+    #\r
+    def CollectFixedAtBuildPcds(self):\r
+        for LibAuto in self.LibraryAutoGenList:\r
+            FixedAtBuildPcds = {}  \r
+            ShareFixedAtBuildPcdsSameValue = {} \r
+            for Module in LibAuto._ReferenceModules:                \r
+                for Pcd in Module.FixedAtBuildPcds + LibAuto.FixedAtBuildPcds:\r
+                    key = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))  \r
+                    if key not in FixedAtBuildPcds:\r
+                        ShareFixedAtBuildPcdsSameValue[key] = True\r
+                        FixedAtBuildPcds[key] = Pcd.DefaultValue\r
+                    else:\r
+                        if FixedAtBuildPcds[key] != Pcd.DefaultValue:\r
+                            ShareFixedAtBuildPcdsSameValue[key] = False      \r
+            for Pcd in LibAuto.FixedAtBuildPcds:\r
+                key = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))\r
+                if (Pcd.TokenCName,Pcd.TokenSpaceGuidCName) not in self.NonDynamicPcdDict:\r
+                    continue\r
+                else:\r
+                    DscPcd = self.NonDynamicPcdDict[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName)]\r
+                    if DscPcd.Type != "FixedAtBuild":\r
+                        continue\r
+                if key in ShareFixedAtBuildPcdsSameValue and ShareFixedAtBuildPcdsSameValue[key]:                    \r
+                    LibAuto.ConstPcd[key] = Pcd.DefaultValue\r
+\r
     ## Collect dynamic PCDs\r
     #\r
     #  Gather dynamic PCDs list from each module and their settings from platform\r
@@ -1296,6 +1324,13 @@ class PlatformAutoGen(AutoGen):
             self._PackageList = list(self._PackageList)\r
         return self._PackageList\r
 \r
+    def _GetNonDynamicPcdDict(self):\r
+        if self._NonDynamicPcdDict:\r
+            return self._NonDynamicPcdDict\r
+        for Pcd in self.NonDynamicPcdList:\r
+            self._NonDynamicPcdDict[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName)] = Pcd\r
+        return self._NonDynamicPcdDict\r
+\r
     ## Get list of non-dynamic PCDs\r
     def _GetNonDynamicPcdList(self):\r
         if self._NonDynamicPcdList == None:\r
@@ -1373,6 +1408,8 @@ class PlatformAutoGen(AutoGen):
             for La in Ma.LibraryAutoGenList:\r
                 if La not in self._LibraryAutoGenList:\r
                     self._LibraryAutoGenList.append(La)\r
+                if Ma not in La._ReferenceModules:\r
+                    La._ReferenceModules.append(Ma)\r
 \r
     ## Summarize ModuleAutoGen objects of all modules to be built for this platform\r
     def _GetModuleAutoGenList(self):\r
@@ -1911,6 +1948,7 @@ class PlatformAutoGen(AutoGen):
     PcdTokenNumber      = property(_GetPcdTokenNumbers)    # (TokenCName, TokenSpaceGuidCName) : GeneratedTokenNumber\r
     DynamicPcdList      = property(_GetDynamicPcdList)    # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]\r
     NonDynamicPcdList   = property(_GetNonDynamicPcdList)    # [(TokenCName1, TokenSpaceGuidCName1), (TokenCName2, TokenSpaceGuidCName2), ...]\r
+    NonDynamicPcdDict   = property(_GetNonDynamicPcdDict)\r
     PackageList         = property(_GetPackageList)\r
 \r
     ToolDefinition      = property(_GetToolDefinition)    # toolcode : tool path\r
@@ -2027,12 +2065,35 @@ class ModuleAutoGen(AutoGen):
         self._FinalBuildTargetList    = None\r
         self._FileTypes               = None\r
         self._BuildRules              = None\r
-\r
+        \r
+        ## The Modules referenced to this Library\r
+        #  Only Library has this attribute\r
+        self._ReferenceModules        = []        \r
+        \r
+        ## Store the FixedAtBuild Pcds\r
+        #  \r
+        self._FixedAtBuildPcds         = []\r
+        self.ConstPcd                  = {}\r
         return True\r
 \r
     def __repr__(self):\r
         return "%s [%s]" % (self.MetaFile, self.Arch)\r
 \r
+    # Get FixedAtBuild Pcds of this Module\r
+    def _GetFixedAtBuildPcds(self):\r
+        if self._FixedAtBuildPcds:\r
+            return self._FixedAtBuildPcds\r
+        for Pcd in self.ModulePcdList:\r
+            if self.IsLibrary:\r
+                if not (Pcd.Pending == False and Pcd.Type == "FixedAtBuild"):\r
+                    continue\r
+            elif Pcd.Type != "FixedAtBuild":\r
+                continue\r
+            if Pcd not in self._FixedAtBuildPcds:\r
+                self._FixedAtBuildPcds.append(Pcd)\r
+                \r
+        return self._FixedAtBuildPcds        \r
+\r
     # Macros could be used in build_rule.txt (also Makefile)\r
     def _GetMacros(self):\r
         if self._Macro == None:\r
@@ -3102,6 +3163,8 @@ class ModuleAutoGen(AutoGen):
     BuildOption             = property(_GetModuleBuildOption)\r
     BuildOptionIncPathList  = property(_GetBuildOptionIncPathList)\r
     BuildCommand            = property(_GetBuildCommand)\r
+    \r
+    FixedAtBuildPcds         = property(_GetFixedAtBuildPcds)\r
 \r
 # This acts like the main() function for the script, unless it is 'import'ed into another script.\r
 if __name__ == '__main__':\r