]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
Revert BaseTools: PYTHON3 migration
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / GenFdsGlobalVariable.py
index 6745a89514b768e246bd165e3860ff2ec635acb9..14578a92a9b19c6fdc6655fa42034f87723f8811 100644 (file)
@@ -15,6 +15,7 @@
 ##\r
 # Import Modules\r
 #\r
+from __future__ import print_function\r
 import Common.LongFilePathOs as os\r
 import sys\r
 import subprocess\r
@@ -26,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
@@ -64,9 +65,9 @@ class GenFdsGlobalVariable:
     FdfFileTimeStamp = 0\r
     FixedLoadAddress = False\r
     PlatformName = ''\r
-    \r
-    BuildRuleFamily = "MSFT"\r
-    ToolChainFamily = "MSFT"\r
+\r
+    BuildRuleFamily = DataType.TAB_COMPILER_MSFT\r
+    ToolChainFamily = DataType.TAB_COMPILER_MSFT\r
     __BuildRuleDatabase = None\r
     GuidToolDefinition = {}\r
     FfsCmdDict = {}\r
@@ -74,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
@@ -89,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
@@ -102,7 +106,7 @@ class GenFdsGlobalVariable:
             TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
             if DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF in TargetTxt.TargetTxtDictionary:\r
                 BuildRuleFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF]\r
-            if BuildRuleFile in [None, '']:\r
+            if not BuildRuleFile:\r
                 BuildRuleFile = 'Conf/build_rule.txt'\r
             GenFdsGlobalVariable.__BuildRuleDatabase = BuildRule(BuildRuleFile)\r
             ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
@@ -116,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
@@ -228,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
@@ -243,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
@@ -260,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
@@ -288,7 +292,7 @@ class GenFdsGlobalVariable:
 #        GenFdsGlobalVariable.OutputDirDict = OutputDir\r
         GenFdsGlobalVariable.FdfParser = FdfParser\r
         GenFdsGlobalVariable.WorkSpace = WorkSpace\r
-        GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDirDict[ArchList[0]], 'FV')\r
+        GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDirDict[ArchList[0]], DataType.TAB_FV_DIRECTORY)\r
         if not os.path.exists(GenFdsGlobalVariable.FvDir) :\r
             os.makedirs(GenFdsGlobalVariable.FvDir)\r
         GenFdsGlobalVariable.FfsDir = os.path.join(GenFdsGlobalVariable.FvDir, 'Ffs')\r
@@ -340,7 +344,7 @@ class GenFdsGlobalVariable:
         for Arch in ArchList:\r
             GenFdsGlobalVariable.OutputDirDict[Arch] = os.path.normpath(\r
                 os.path.join(GlobalData.gWorkspace,\r
-                             WorkSpace.Db.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch,GlobalData.gGlobalDefines['TARGET'],\r
+                             WorkSpace.Db.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, GlobalData.gGlobalDefines['TARGET'],\r
                              GlobalData.gGlobalDefines['TOOLCHAIN']].OutputDirectory,\r
                              GlobalData.gGlobalDefines['TARGET'] +'_' + GlobalData.gGlobalDefines['TOOLCHAIN']))\r
             GenFdsGlobalVariable.OutputDirFromDscDict[Arch] = os.path.normpath(\r
@@ -349,7 +353,7 @@ class GenFdsGlobalVariable:
             GenFdsGlobalVariable.PlatformName = WorkSpace.Db.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch,\r
                                                                       GlobalData.gGlobalDefines['TARGET'],\r
                                                                       GlobalData.gGlobalDefines['TOOLCHAIN']].PlatformName\r
-        GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDirDict[ArchList[0]], 'FV')\r
+        GenFdsGlobalVariable.FvDir = os.path.join(GenFdsGlobalVariable.OutputDirDict[ArchList[0]], DataType.TAB_FV_DIRECTORY)\r
         if not os.path.exists(GenFdsGlobalVariable.FvDir):\r
             os.makedirs(GenFdsGlobalVariable.FvDir)\r
         GenFdsGlobalVariable.FfsDir = os.path.join(GenFdsGlobalVariable.FvDir, 'Ffs')\r
@@ -439,36 +443,33 @@ class GenFdsGlobalVariable:
 \r
     @staticmethod\r
     def GenerateSection(Output, Input, Type=None, CompressionType=None, Guid=None,\r
-                        GuidHdrLen=None, GuidAttr=[], Ui=None, Ver=None, InputAlign=None, BuildNumber=None, DummyFile=None, IsMakefile=False):\r
+                        GuidHdrLen=None, GuidAttr=[], Ui=None, Ver=None, InputAlign=[], BuildNumber=None, DummyFile=None, IsMakefile=False):\r
         Cmd = ["GenSec"]\r
-        if Type not in [None, '']:\r
-            Cmd += ["-s", Type]\r
-        if CompressionType not in [None, '']:\r
-            Cmd += ["-c", CompressionType]\r
+        if Type:\r
+            Cmd += ("-s", Type)\r
+        if CompressionType:\r
+            Cmd += ("-c", CompressionType)\r
         if Guid is not None:\r
-            Cmd += ["-g", Guid]\r
+            Cmd += ("-g", Guid)\r
         if DummyFile is not None:\r
-            Cmd += ["--dummy", DummyFile]\r
-        if GuidHdrLen not in [None, '']:\r
-            Cmd += ["-l", GuidHdrLen]\r
-        if len(GuidAttr) != 0:\r
-            #Add each guided attribute\r
-            for Attr in GuidAttr:\r
-                Cmd += ["-r", Attr]\r
-        if InputAlign is not None:\r
-            #Section Align is only for dummy section without section type\r
-            for SecAlign in InputAlign:\r
-                Cmd += ["--sectionalign", SecAlign]\r
+            Cmd += ("--dummy", DummyFile)\r
+        if GuidHdrLen:\r
+            Cmd += ("-l", GuidHdrLen)\r
+        #Add each guided attribute\r
+        for Attr in GuidAttr:\r
+            Cmd += ("-r", Attr)\r
+        #Section Align is only for dummy section without section type\r
+        for SecAlign in InputAlign:\r
+            Cmd += ("--sectionalign", SecAlign)\r
 \r
         CommandFile = Output + '.txt'\r
-        if Ui not in [None, '']:\r
-            #Cmd += ["-n", '"' + Ui + '"']\r
+        if Ui:\r
             if IsMakefile:\r
                 if Ui == "$(MODULE_NAME)":\r
-                    Cmd += ['-n', Ui]\r
+                    Cmd += ('-n', Ui)\r
                 else:\r
-                    Cmd += ["-n", '"' + Ui + '"']\r
-                Cmd += ["-o", Output]\r
+                    Cmd += ("-n", '"' + Ui + '"')\r
+                Cmd += ("-o", Output)\r
                 if ' '.join(Cmd).strip() not in GenFdsGlobalVariable.SecCmdList:\r
                     GenFdsGlobalVariable.SecCmdList.append(' '.join(Cmd).strip())\r
             else:\r
@@ -480,11 +481,11 @@ class GenFdsGlobalVariable:
                 GenFdsGlobalVariable.SectionHeader.pack_into(SectionData, 0, Len & 0xff, (Len >> 8) & 0xff, (Len >> 16) & 0xff, 0x15)\r
                 SaveFileOnChange(Output, SectionData.tostring())\r
 \r
-        elif Ver not in [None, '']:\r
-            Cmd += ["-n", Ver]\r
+        elif Ver:\r
+            Cmd += ("-n", Ver)\r
             if BuildNumber:\r
-                Cmd += ["-j", BuildNumber]\r
-            Cmd += ["-o", Output]\r
+                Cmd += ("-j", BuildNumber)\r
+            Cmd += ("-o", Output)\r
 \r
             SaveFileOnChange(CommandFile, ' '.join(Cmd), False)\r
             if IsMakefile:\r
@@ -495,7 +496,7 @@ class GenFdsGlobalVariable:
                     return\r
                 GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate section")\r
         else:\r
-            Cmd += ["-o", Output]\r
+            Cmd += ("-o", Output)\r
             Cmd += Input\r
 \r
             SaveFileOnChange(CommandFile, ' '.join(Cmd), False)\r
@@ -511,14 +512,15 @@ class GenFdsGlobalVariable:
 \r
     @staticmethod\r
     def GetAlignment (AlignString):\r
-        if AlignString is None:\r
+        if not AlignString:\r
             return 0\r
-        if AlignString in ("1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K"):\r
+        if AlignString.endswith('K'):\r
             return int (AlignString.rstrip('K')) * 1024\r
-        elif AlignString in ("1M", "2M", "4M", "8M", "16M"):\r
+        if AlignString.endswith('M'):\r
             return int (AlignString.rstrip('M')) * 1024 * 1024\r
-        else:\r
-            return int (AlignString)\r
+        if AlignString.endswith('G'):\r
+            return int (AlignString.rstrip('G')) * 1024 * 1024 * 1024\r
+        return int (AlignString)\r
 \r
     @staticmethod\r
     def GenerateFfs(Output, Input, Type, Guid, Fixed=False, CheckSum=False, Align=None,\r
@@ -526,22 +528,22 @@ class GenFdsGlobalVariable:
         Cmd = ["GenFfs", "-t", Type, "-g", Guid]\r
         mFfsValidAlign = ["0", "8", "16", "128", "512", "1K", "4K", "32K", "64K", "128K", "256K", "512K", "1M", "2M", "4M", "8M", "16M"]\r
         if Fixed == True:\r
-            Cmd += ["-x"]\r
+            Cmd.append("-x")\r
         if CheckSum:\r
-            Cmd += ["-s"]\r
-        if Align not in [None, '']:\r
+            Cmd.append("-s")\r
+        if Align:\r
             if Align not in mFfsValidAlign:\r
                 Align = GenFdsGlobalVariable.GetAlignment (Align)\r
                 for index in range(0, len(mFfsValidAlign) - 1):\r
                     if ((Align > GenFdsGlobalVariable.GetAlignment(mFfsValidAlign[index])) and (Align <= GenFdsGlobalVariable.GetAlignment(mFfsValidAlign[index + 1]))):\r
                         break\r
                 Align = mFfsValidAlign[index + 1]\r
-            Cmd += ["-a", Align]\r
+            Cmd += ("-a", Align)\r
 \r
-        Cmd += ["-o", Output]\r
+        Cmd += ("-o", Output)\r
         for I in range(0, len(Input)):\r
             Cmd += ("-i", Input[I])\r
-            if SectionAlign not in [None, '', []] and SectionAlign[I] not in [None, '']:\r
+            if SectionAlign and SectionAlign[I]:\r
                 Cmd += ("-n", SectionAlign[I])\r
 \r
         CommandFile = Output + '.txt'\r
@@ -549,7 +551,7 @@ class GenFdsGlobalVariable:
 \r
         GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input))\r
         if MakefilePath:\r
-            if (tuple(Cmd),tuple(GenFdsGlobalVariable.SecCmdList),tuple(GenFdsGlobalVariable.CopyList)) not in GenFdsGlobalVariable.FfsCmdDict:\r
+            if (tuple(Cmd), tuple(GenFdsGlobalVariable.SecCmdList), tuple(GenFdsGlobalVariable.CopyList)) not in GenFdsGlobalVariable.FfsCmdDict:\r
                 GenFdsGlobalVariable.FfsCmdDict[tuple(Cmd), tuple(GenFdsGlobalVariable.SecCmdList), tuple(GenFdsGlobalVariable.CopyList)] = MakefilePath\r
             GenFdsGlobalVariable.SecCmdList = []\r
             GenFdsGlobalVariable.CopyList = []\r
@@ -566,47 +568,30 @@ class GenFdsGlobalVariable:
         GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input))\r
 \r
         Cmd = ["GenFv"]\r
-        if BaseAddress not in [None, '']:\r
-            Cmd += ["-r", BaseAddress]\r
+        if BaseAddress:\r
+            Cmd += ("-r", BaseAddress)\r
 \r
         if ForceRebase == False:\r
-            Cmd += ["-F", "FALSE"]\r
+            Cmd += ("-F", "FALSE")\r
         elif ForceRebase == True:\r
-            Cmd += ["-F", "TRUE"]\r
+            Cmd += ("-F", "TRUE")\r
 \r
         if Capsule:\r
-            Cmd += ["-c"]\r
+            Cmd.append("-c")\r
         if Dump:\r
-            Cmd += ["-p"]\r
-        if AddressFile not in [None, '']:\r
-            Cmd += ["-a", AddressFile]\r
-        if MapFile not in [None, '']:\r
-            Cmd += ["-m", MapFile]\r
+            Cmd.append("-p")\r
+        if AddressFile:\r
+            Cmd += ("-a", AddressFile)\r
+        if MapFile:\r
+            Cmd += ("-m", MapFile)\r
         if FileSystemGuid:\r
-            Cmd += ["-g", FileSystemGuid]\r
-        Cmd += ["-o", Output]\r
+            Cmd += ("-g", FileSystemGuid)\r
+        Cmd += ("-o", Output)\r
         for I in Input:\r
-            Cmd += ["-i", I]\r
+            Cmd += ("-i", I)\r
 \r
         GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate FV")\r
 \r
-    @staticmethod\r
-    def GenerateVtf(Output, Input, BaseAddress=None, FvSize=None):\r
-        if not GenFdsGlobalVariable.NeedsUpdate(Output, Input):\r
-            return\r
-        GenFdsGlobalVariable.DebugLogger(EdkLogger.DEBUG_5, "%s needs update because of newer %s" % (Output, Input))\r
-\r
-        Cmd = ["GenVtf"]\r
-        if BaseAddress not in [None, ''] and FvSize not in [None, ''] \\r
-            and len(BaseAddress) == len(FvSize):\r
-            for I in range(0, len(BaseAddress)):\r
-                Cmd += ["-r", BaseAddress[I], "-s", FvSize[I]]\r
-        Cmd += ["-o", Output]\r
-        for F in Input:\r
-            Cmd += ["-f", F]\r
-\r
-        GenFdsGlobalVariable.CallExternalTool(Cmd, "Failed to generate VTF")\r
-\r
     @staticmethod\r
     def GenerateFirmwareImage(Output, Input, Type="efi", SubType=None, Zero=False,\r
                               Strip=False, Replace=False, TimeStamp=None, Join=False,\r
@@ -617,26 +602,26 @@ class GenFdsGlobalVariable:
 \r
         Cmd = ["GenFw"]\r
         if Type.lower() == "te":\r
-            Cmd += ["-t"]\r
-        if SubType not in [None, '']:\r
-            Cmd += ["-e", SubType]\r
-        if TimeStamp not in [None, '']:\r
-            Cmd += ["-s", TimeStamp]\r
-        if Align not in [None, '']:\r
-            Cmd += ["-a", Align]\r
-        if Padding not in [None, '']:\r
-            Cmd += ["-p", Padding]\r
+            Cmd.append("-t")\r
+        if SubType:\r
+            Cmd += ("-e", SubType)\r
+        if TimeStamp:\r
+            Cmd += ("-s", TimeStamp)\r
+        if Align:\r
+            Cmd += ("-a", Align)\r
+        if Padding:\r
+            Cmd += ("-p", Padding)\r
         if Zero:\r
-            Cmd += ["-z"]\r
+            Cmd.append("-z")\r
         if Strip:\r
-            Cmd += ["-l"]\r
+            Cmd.append("-l")\r
         if Replace:\r
-            Cmd += ["-r"]\r
+            Cmd.append("-r")\r
         if Join:\r
-            Cmd += ["-j"]\r
+            Cmd.append("-j")\r
         if Convert:\r
-            Cmd += ["-m"]\r
-        Cmd += ["-o", Output]\r
+            Cmd.append("-m")\r
+        Cmd += ("-o", Output)\r
         Cmd += Input\r
         if IsMakefile:\r
             if " ".join(Cmd).strip() not in GenFdsGlobalVariable.SecCmdList:\r
@@ -647,40 +632,40 @@ 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 += ["-ec"]\r
+                Cmd.append("-ec")\r
             else:\r
-                Cmd += ["-e"]\r
-                \r
+                Cmd.append("-e")\r
+\r
             for EfiFile in EfiInput:\r
-                Cmd += [EfiFile]\r
+                Cmd.append(EfiFile)\r
                 InputList.append (EfiFile)\r
-        \r
+\r
         if len(BinaryInput) > 0:\r
-            Cmd += ["-b"]\r
+            Cmd.append("-b")\r
             for BinFile in BinaryInput:\r
-                Cmd += [BinFile]\r
+                Cmd.append(BinFile)\r
                 InputList.append (BinFile)\r
 \r
         # Check List\r
         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
+            Cmd += ("-l", ClassCode)\r
         if Revision is not None:\r
-            Cmd += ["-r", Revision]\r
+            Cmd += ("-r", Revision)\r
         if DeviceId is not None:\r
-            Cmd += ["-i", DeviceId]\r
+            Cmd += ("-i", DeviceId)\r
         if VendorId is not None:\r
-            Cmd += ["-f", VendorId]\r
+            Cmd += ("-f", VendorId)\r
 \r
-        Cmd += ["-o", Output]\r
+        Cmd += ("-o", Output)\r
         if IsMakefile:\r
             if " ".join(Cmd).strip() not in GenFdsGlobalVariable.SecCmdList:\r
                 GenFdsGlobalVariable.SecCmdList.append(" ".join(Cmd).strip())\r
@@ -695,7 +680,7 @@ class GenFdsGlobalVariable:
 \r
         Cmd = [ToolPath, ]\r
         Cmd += Options.split(' ')\r
-        Cmd += ["-o", Output]\r
+        Cmd += ("-o", Output)\r
         Cmd += Input\r
         if IsMakefile:\r
             if " ".join(Cmd).strip() not in GenFdsGlobalVariable.SecCmdList:\r
@@ -724,7 +709,7 @@ class GenFdsGlobalVariable:
 \r
         try:\r
             PopenObject = subprocess.Popen(' '.join(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
-        except Exception, X:\r
+        except Exception as X:\r
             EdkLogger.error("GenFds", COMMAND_FAILURE, ExtraData="%s: %s" % (str(X), cmd[0]))\r
         (out, error) = PopenObject.communicate()\r
 \r
@@ -739,7 +724,7 @@ class GenFdsGlobalVariable:
             GenFdsGlobalVariable.InfLogger (out)\r
             GenFdsGlobalVariable.InfLogger (error)\r
             if PopenObject.returncode != 0:\r
-                print "###", cmd\r
+                print("###", cmd)\r
                 EdkLogger.error("GenFds", COMMAND_FAILURE, errorMess)\r
 \r
     def VerboseLogger (msg):\r
@@ -809,11 +794,11 @@ class GenFdsGlobalVariable:
             for Key in PcdDict:\r
                 PcdObj = PcdDict[Key]\r
                 if (PcdObj.TokenCName == TokenCName) and (PcdObj.TokenSpaceGuidCName == TokenSpace):\r
-                    if PcdObj.Type != 'FixedAtBuild':\r
+                    if PcdObj.Type != DataType.TAB_PCDS_FIXED_AT_BUILD:\r
                         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
@@ -825,11 +810,11 @@ class GenFdsGlobalVariable:
                 for Key in PcdDict:\r
                     PcdObj = PcdDict[Key]\r
                     if (PcdObj.TokenCName == TokenCName) and (PcdObj.TokenSpaceGuidCName == TokenSpace):\r
-                        if PcdObj.Type != 'FixedAtBuild':\r
+                        if PcdObj.Type != DataType.TAB_PCDS_FIXED_AT_BUILD:\r
                             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
@@ -845,3 +830,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