]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
BaseTools: Move ImageBinDict to GenFdsGlobalVariable.py
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / GenFdsGlobalVariable.py
index 6eb1201cee49ee0f9ab0f72702802092c0ef7c0c..9936498c51582006162193d3e2b92f20c4cb574b 100644 (file)
@@ -27,7 +27,7 @@ from Common import EdkLogger
 from Common.Misc import SaveFileOnChange\r
 \r
 from Common.TargetTxtClassObject import TargetTxtClassObject\r
-from Common.ToolDefClassObject import ToolDefClassObject\r
+from Common.ToolDefClassObject import ToolDefClassObject, ToolDefDict\r
 from AutoGen.BuildEngine import BuildRule\r
 import Common.DataType as DataType\r
 from Common.Misc import PathClass\r
@@ -65,7 +65,7 @@ class GenFdsGlobalVariable:
     FdfFileTimeStamp = 0\r
     FixedLoadAddress = False\r
     PlatformName = ''\r
-    \r
+\r
     BuildRuleFamily = "MSFT"\r
     ToolChainFamily = "MSFT"\r
     __BuildRuleDatabase = None\r
@@ -75,7 +75,7 @@ class GenFdsGlobalVariable:
     CopyList   = []\r
     ModuleFile = ''\r
     EnableGenfdsMultiThread = False\r
-    \r
+\r
     #\r
     # The list whose element are flags to indicate if large FFS or SECTION files exist in FV.\r
     # At the beginning of each generation of FV, false flag is appended to the list,\r
@@ -90,7 +90,10 @@ class GenFdsGlobalVariable:
     LARGE_FILE_SIZE = 0x1000000\r
 \r
     SectionHeader = struct.Struct("3B 1B")\r
-    \r
+\r
+    # FvName, FdName, CapName in FDF, Image file name\r
+    ImageBinDict = {}\r
+\r
     ## LoadBuildRule\r
     #\r
     @staticmethod\r
@@ -117,7 +120,7 @@ class GenFdsGlobalVariable:
                    and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY] \\r
                    and ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]:\r
                     GenFdsGlobalVariable.BuildRuleFamily = ToolDefinition[DataType.TAB_TOD_DEFINES_BUILDRULEFAMILY][GenFdsGlobalVariable.ToolChainTag]\r
-                    \r
+\r
                 if DataType.TAB_TOD_DEFINES_FAMILY in ToolDefinition \\r
                    and GenFdsGlobalVariable.ToolChainTag in ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY] \\r
                    and ToolDefinition[DataType.TAB_TOD_DEFINES_FAMILY][GenFdsGlobalVariable.ToolChainTag]:\r
@@ -229,11 +232,11 @@ class GenFdsGlobalVariable:
             while Index < len(SourceList):\r
                 Source = SourceList[Index]\r
                 Index = Index + 1\r
-    \r
+\r
                 if File.IsBinary and File == Source and Inf.Binaries is not None and File in Inf.Binaries:\r
                     # Skip all files that are not binary libraries\r
                     if not Inf.LibraryClass:\r
-                        continue            \r
+                        continue\r
                     RuleObject = BuildRules[DataType.TAB_DEFAULT_BINARY_FILE]\r
                 elif FileType in BuildRules:\r
                     RuleObject = BuildRules[FileType]\r
@@ -244,15 +247,15 @@ class GenFdsGlobalVariable:
                     if LastTarget:\r
                         TargetList.add(str(LastTarget))\r
                     break\r
-    \r
+\r
                 FileType = RuleObject.SourceFileType\r
-    \r
+\r
                 # stop at STATIC_LIBRARY for library\r
                 if Inf.LibraryClass and FileType == DataType.TAB_STATIC_LIBRARY:\r
                     if LastTarget:\r
                         TargetList.add(str(LastTarget))\r
                     break\r
-    \r
+\r
                 Target = RuleObject.Apply(Source)\r
                 if not Target:\r
                     if LastTarget:\r
@@ -261,11 +264,11 @@ class GenFdsGlobalVariable:
                 elif not Target.Outputs:\r
                     # Only do build for target with outputs\r
                     TargetList.add(str(Target))\r
-    \r
+\r
                 # to avoid cyclic rule\r
                 if FileType in RuleChain:\r
                     break\r
-    \r
+\r
                 RuleChain.append(FileType)\r
                 SourceList.extend(Target.Outputs)\r
                 LastTarget = Target\r
@@ -645,19 +648,19 @@ class GenFdsGlobalVariable:
     @staticmethod\r
     def GenerateOptionRom(Output, EfiInput, BinaryInput, Compress=False, ClassCode=None,\r
                         Revision=None, DeviceId=None, VendorId=None, IsMakefile=False):\r
-        InputList = []   \r
+        InputList = []\r
         Cmd = ["EfiRom"]\r
         if len(EfiInput) > 0:\r
-            \r
+\r
             if Compress:\r
                 Cmd.append("-ec")\r
             else:\r
                 Cmd.append("-e")\r
-                \r
+\r
             for EfiFile in EfiInput:\r
                 Cmd.append(EfiFile)\r
                 InputList.append (EfiFile)\r
-        \r
+\r
         if len(BinaryInput) > 0:\r
             Cmd.append("-b")\r
             for BinFile in BinaryInput:\r
@@ -668,7 +671,7 @@ class GenFdsGlobalVariable:
         if not GenFdsGlobalVariable.NeedsUpdate(Output, InputList) and not IsMakefile:\r
             return\r
         GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, InputList))\r
-                        \r
+\r
         if ClassCode is not None:\r
             Cmd += ("-l", ClassCode)\r
         if Revision is not None:\r
@@ -811,7 +814,7 @@ class GenFdsGlobalVariable:
                         EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not FixedAtBuild type." % PcdPattern)\r
                     if PcdObj.DatumType != DataType.TAB_VOID:\r
                         EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not VOID* datum type." % PcdPattern)\r
-                        \r
+\r
                     PcdValue = PcdObj.DefaultValue\r
                     return PcdValue\r
 \r
@@ -827,7 +830,7 @@ class GenFdsGlobalVariable:
                             EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not FixedAtBuild type." % PcdPattern)\r
                         if PcdObj.DatumType != DataType.TAB_VOID:\r
                             EdkLogger.error("GenFds", GENFDS_ERROR, "%s is not VOID* datum type." % PcdPattern)\r
-                            \r
+\r
                         PcdValue = PcdObj.DefaultValue\r
                         return PcdValue\r
 \r
@@ -843,3 +846,95 @@ class GenFdsGlobalVariable:
     DebugLogger = staticmethod(DebugLogger)\r
     MacroExtend = staticmethod (MacroExtend)\r
     GetPcdValue = staticmethod(GetPcdValue)\r
+\r
+## FindExtendTool()\r
+#\r
+#  Find location of tools to process data\r
+#\r
+#  @param  KeyStringList    Filter for inputs of section generation\r
+#  @param  CurrentArchList  Arch list\r
+#  @param  NameGuid         The Guid name\r
+#\r
+def FindExtendTool(KeyStringList, CurrentArchList, NameGuid):\r
+    ToolDb = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDatabase\r
+    # if user not specify filter, try to deduce it from global data.\r
+    if KeyStringList is None or KeyStringList == []:\r
+        Target = GenFdsGlobalVariable.TargetName\r
+        ToolChain = GenFdsGlobalVariable.ToolChainTag\r
+        if ToolChain not in ToolDb['TOOL_CHAIN_TAG']:\r
+            EdkLogger.error("GenFds", GENFDS_ERROR, "Can not find external tool because tool tag %s is not defined in tools_def.txt!" % ToolChain)\r
+        KeyStringList = [Target + '_' + ToolChain + '_' + CurrentArchList[0]]\r
+        for Arch in CurrentArchList:\r
+            if Target + '_' + ToolChain + '_' + Arch not in KeyStringList:\r
+                KeyStringList.append(Target + '_' + ToolChain + '_' + Arch)\r
+\r
+    if GenFdsGlobalVariable.GuidToolDefinition:\r
+        if NameGuid in GenFdsGlobalVariable.GuidToolDefinition:\r
+            return GenFdsGlobalVariable.GuidToolDefinition[NameGuid]\r
+\r
+    ToolDefinition = ToolDefDict(GenFdsGlobalVariable.ConfDir).ToolsDefTxtDictionary\r
+    ToolPathTmp = None\r
+    ToolOption = None\r
+    ToolPathKey = None\r
+    ToolOptionKey = None\r
+    KeyList = None\r
+    for ToolDef in ToolDefinition.items():\r
+        if NameGuid.lower() == ToolDef[1].lower() :\r
+            KeyList = ToolDef[0].split('_')\r
+            Key = KeyList[0] + \\r
+                  '_' + \\r
+                  KeyList[1] + \\r
+                  '_' + \\r
+                  KeyList[2]\r
+            if Key in KeyStringList and KeyList[4] == DataType.TAB_GUID:\r
+                ToolPathKey   = Key + '_' + KeyList[3] + '_PATH'\r
+                ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'\r
+                ToolPath = ToolDefinition.get(ToolPathKey)\r
+                ToolOption = ToolDefinition.get(ToolOptionKey)\r
+                if ToolPathTmp is None:\r
+                    ToolPathTmp = ToolPath\r
+                else:\r
+                    if ToolPathTmp != ToolPath:\r
+                        EdkLogger.error("GenFds", GENFDS_ERROR, "Don't know which tool to use, %s or %s ?" % (ToolPathTmp, ToolPath))\r
+\r
+    BuildOption = {}\r
+    for Arch in CurrentArchList:\r
+        Platform = GenFdsGlobalVariable.WorkSpace.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
+        # key is (ToolChainFamily, ToolChain, CodeBase)\r
+        for item in Platform.BuildOptions:\r
+            if '_PATH' in item[1] or '_FLAGS' in item[1] or '_GUID' in item[1]:\r
+                if not item[0] or (item[0] and GenFdsGlobalVariable.ToolChainFamily== item[0]):\r
+                    if item[1] not in BuildOption:\r
+                        BuildOption[item[1]] = Platform.BuildOptions[item]\r
+        if BuildOption:\r
+            ToolList = [DataType.TAB_TOD_DEFINES_TARGET, DataType.TAB_TOD_DEFINES_TOOL_CHAIN_TAG, DataType.TAB_TOD_DEFINES_TARGET_ARCH]\r
+            for Index in range(2, -1, -1):\r
+                for Key in list(BuildOption.keys()):\r
+                    List = Key.split('_')\r
+                    if List[Index] == '*':\r
+                        for String in ToolDb[ToolList[Index]]:\r
+                            if String in [Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]:\r
+                                List[Index] = String\r
+                                NewKey = '%s_%s_%s_%s_%s' % tuple(List)\r
+                                if NewKey not in BuildOption:\r
+                                    BuildOption[NewKey] = BuildOption[Key]\r
+                                    continue\r
+                                del BuildOption[Key]\r
+                    elif List[Index] not in ToolDb[ToolList[Index]]:\r
+                        del BuildOption[Key]\r
+    if BuildOption:\r
+        if not KeyList:\r
+            for Op in BuildOption:\r
+                if NameGuid == BuildOption[Op]:\r
+                    KeyList = Op.split('_')\r
+                    Key = KeyList[0] + '_' + KeyList[1] +'_' + KeyList[2]\r
+                    if Key in KeyStringList and KeyList[4] == DataType.TAB_GUID:\r
+                        ToolPathKey   = Key + '_' + KeyList[3] + '_PATH'\r
+                        ToolOptionKey = Key + '_' + KeyList[3] + '_FLAGS'\r
+        if ToolPathKey in BuildOption:\r
+            ToolPathTmp = BuildOption[ToolPathKey]\r
+        if ToolOptionKey in BuildOption:\r
+            ToolOption = BuildOption[ToolOptionKey]\r
+\r
+    GenFdsGlobalVariable.GuidToolDefinition[NameGuid] = (ToolPathTmp, ToolOption)\r
+    return ToolPathTmp, ToolOption\r