]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/global/GlobalData.java
Update GenBuild to append FLAGS from FPD files to the FLAGS defined in tools_def.txt
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / global / GlobalData.java
index 99cccc364cc3211317f79f2894155cffa89a2d40..ceb19d91db7d78c9400a26f819255e43feec0f1b 100644 (file)
@@ -1,10 +1,10 @@
 /** @file\r
 /** @file\r
-  GlobalData class. \r
-  \r
+  GlobalData class.\r
+\r
   GlobalData provide initializing, instoring, querying and update global data.\r
   It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
   GlobalData provide initializing, instoring, querying and update global data.\r
   It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
-  PCD and so on.   \r
\r
+  PCD and so on.\r
+\r
 Copyright (c) 2006, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 Copyright (c) 2006, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -16,13 +16,27 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 package org.tianocore.build.global;\r
 \r
 **/\r
 package org.tianocore.build.global;\r
 \r
-import org.apache.tools.ant.BuildException;\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.apache.xmlbeans.XmlException;\r
 import org.apache.xmlbeans.XmlObject;\r
 import org.apache.xmlbeans.XmlObject;\r
+\r
+import org.tianocore.common.exception.EdkException;\r
+import org.tianocore.common.logger.EdkLog;\r
+import org.tianocore.pcd.entity.MemoryDatabaseManager;\r
 import org.tianocore.DbPathAndFilename;\r
 import org.tianocore.FrameworkDatabaseDocument;\r
 import org.tianocore.ModuleSurfaceAreaDocument;\r
 import org.tianocore.ModuleSurfaceAreaDocument.ModuleSurfaceArea;\r
 import org.tianocore.DbPathAndFilename;\r
 import org.tianocore.FrameworkDatabaseDocument;\r
 import org.tianocore.ModuleSurfaceAreaDocument;\r
 import org.tianocore.ModuleSurfaceAreaDocument.ModuleSurfaceArea;\r
-import org.tianocore.build.exception.EdkException;\r
 import org.tianocore.build.id.FpdModuleIdentification;\r
 import org.tianocore.build.id.ModuleIdentification;\r
 import org.tianocore.build.id.PackageIdentification;\r
 import org.tianocore.build.id.FpdModuleIdentification;\r
 import org.tianocore.build.id.ModuleIdentification;\r
 import org.tianocore.build.id.PackageIdentification;\r
@@ -33,46 +47,32 @@ import org.tianocore.build.toolchain.ToolChainElement;
 import org.tianocore.build.toolchain.ToolChainInfo;\r
 import org.tianocore.build.toolchain.ToolChainKey;\r
 import org.tianocore.build.toolchain.ToolChainMap;\r
 import org.tianocore.build.toolchain.ToolChainInfo;\r
 import org.tianocore.build.toolchain.ToolChainKey;\r
 import org.tianocore.build.toolchain.ToolChainMap;\r
-//import org.tianocore.build.pcd.entity.MemoryDatabaseManager;\r
-//import org.tianocore.logger.EdkLog;\r
-\r
-import java.io.File;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.logging.Logger;\r
 \r
 /**\r
   GlobalData provide initializing, instoring, querying and update global data.\r
   It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
 \r
 /**\r
   GlobalData provide initializing, instoring, querying and update global data.\r
   It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
-  PCD and so on. \r
-  \r
-  <p>Note that all global information are initialized incrementally. All data will \r
+  PCD and so on.\r
+\r
+  <p>Note that all global information are initialized incrementally. All data will\r
   parse and record only of necessary during build time. </p>\r
   parse and record only of necessary during build time. </p>\r
-  \r
+\r
   @since GenBuild 1.0\r
 **/\r
 public class GlobalData {\r
   @since GenBuild 1.0\r
 **/\r
 public class GlobalData {\r
-\r
-    public static Logger log = Logger.getAnonymousLogger();\r
-    \r
     ///\r
     /// Record current WORKSPACE Directory\r
     ///\r
     private static String workspaceDir = "";\r
     ///\r
     /// Record current WORKSPACE Directory\r
     ///\r
     private static String workspaceDir = "";\r
-    \r
+\r
     ///\r
     /// Be used to ensure Global data will be initialized only once.\r
     ///\r
     private static boolean globalFlag = false;\r
     ///\r
     /// Be used to ensure Global data will be initialized only once.\r
     ///\r
     private static boolean globalFlag = false;\r
-    \r
+\r
     ///\r
     /// Framework Database information: package list and platform list\r
     ///\r
     ///\r
     /// Framework Database information: package list and platform list\r
     ///\r
-    private static Set<PackageIdentification> packageList = new HashSet<PackageIdentification>();  \r
+    private static Set<PackageIdentification> packageList = new HashSet<PackageIdentification>();\r
 \r
     private static Set<PlatformIdentification> platformList = new HashSet<PlatformIdentification>();\r
 \r
 \r
     private static Set<PlatformIdentification> platformList = new HashSet<PlatformIdentification>();\r
 \r
@@ -90,24 +90,26 @@ public class GlobalData {
 \r
     private static Map<FpdModuleIdentification, Map<String, XmlObject>> fpdModuleSA= new HashMap<FpdModuleIdentification, Map<String, XmlObject>>();\r
 \r
 \r
     private static Map<FpdModuleIdentification, Map<String, XmlObject>> fpdModuleSA= new HashMap<FpdModuleIdentification, Map<String, XmlObject>>();\r
 \r
+    private static Map<String, XmlObject> fpdBuildOptionsMap = new HashMap<String, XmlObject>();\r
+    \r
     private static XmlObject fpdBuildOptions;\r
 \r
     private static XmlObject fpdDynamicPcds;\r
     private static XmlObject fpdBuildOptions;\r
 \r
     private static XmlObject fpdDynamicPcds;\r
-    \r
+\r
     ///\r
     /// Parsed modules list\r
     ///\r
     private static Map<FpdModuleIdentification, Map<String, XmlObject>> parsedModules = new HashMap<FpdModuleIdentification, Map<String, XmlObject>>();\r
     ///\r
     /// Parsed modules list\r
     ///\r
     private static Map<FpdModuleIdentification, Map<String, XmlObject>> parsedModules = new HashMap<FpdModuleIdentification, Map<String, XmlObject>>();\r
-    \r
+\r
     ///\r
     /// built modules list with ARCH, TARGET, TOOLCHAIN\r
     ///\r
     private static Set<FpdModuleIdentification> builtModules = new HashSet<FpdModuleIdentification>();\r
     ///\r
     /// built modules list with ARCH, TARGET, TOOLCHAIN\r
     ///\r
     private static Set<FpdModuleIdentification> builtModules = new HashSet<FpdModuleIdentification>();\r
-    \r
+\r
     ///\r
     /// PCD memory database stored all PCD information which collected from FPD,MSA and SPD.\r
     ///\r
     ///\r
     /// PCD memory database stored all PCD information which collected from FPD,MSA and SPD.\r
     ///\r
-//    private static final MemoryDatabaseManager pcdDbManager = new MemoryDatabaseManager();\r
+    private static final MemoryDatabaseManager pcdDbManager = new MemoryDatabaseManager();\r
 \r
     ///\r
     /// build target + tool chain family/tag name + arch + command types + command options\r
 \r
     ///\r
     /// build target + tool chain family/tag name + arch + command types + command options\r
@@ -117,7 +119,7 @@ public class GlobalData {
     /// toolsDef - build tool program information\r
     /// fpdBuildOption - all modules's build options for tool tag or tool chain families\r
     /// moduleSaBuildOption - build options for a specific module\r
     /// toolsDef - build tool program information\r
     /// fpdBuildOption - all modules's build options for tool tag or tool chain families\r
     /// moduleSaBuildOption - build options for a specific module\r
-    /// \r
+    ///\r
     private static ToolChainConfig toolsDef;\r
 \r
     private static ToolChainInfo toolChainInfo;\r
     private static ToolChainConfig toolsDef;\r
 \r
     private static ToolChainInfo toolChainInfo;\r
@@ -130,21 +132,17 @@ public class GlobalData {
     private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
     private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainFamilyOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
 \r
     private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
     private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainFamilyOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
 \r
-//    private static final MemoryDatabasseManager pcdDbManager = new MemoryDatabaseManager();\r
-\r
-    \r
-\r
     /**\r
       Parse framework database (DB) and all SPD files listed in DB to initialize\r
       the environment for next build. This method will only be executed only once\r
     /**\r
       Parse framework database (DB) and all SPD files listed in DB to initialize\r
       the environment for next build. This method will only be executed only once\r
-      in the whole build process.  \r
-    \r
+      in the whole build process.\r
+\r
       @param workspaceDatabaseFile the file name of framework database\r
       @param workspaceDir current workspace directory path\r
       @throws BuildException\r
             Framework Dababase or SPD or MSA file is not valid\r
     **/\r
       @param workspaceDatabaseFile the file name of framework database\r
       @param workspaceDir current workspace directory path\r
       @throws BuildException\r
             Framework Dababase or SPD or MSA file is not valid\r
     **/\r
-    public synchronized static void initInfo(String workspaceDatabaseFile, String workspaceDir, String toolsDefFilename) throws BuildException {\r
+    public synchronized static void initInfo(String workspaceDatabaseFile, String workspaceDir, String toolsDefFilename ) throws EdkException {\r
         //\r
         // ensure this method will be revoked only once\r
         //\r
         //\r
         // ensure this method will be revoked only once\r
         //\r
@@ -152,12 +150,12 @@ public class GlobalData {
             return;\r
         }\r
         globalFlag = true;\r
             return;\r
         }\r
         globalFlag = true;\r
-        \r
-        //\r
+\r
+               //\r
         // Backup workspace directory. It will be used by other method\r
         //\r
         GlobalData.workspaceDir = workspaceDir.replaceAll("(\\\\)", "/");\r
         // Backup workspace directory. It will be used by other method\r
         //\r
         GlobalData.workspaceDir = workspaceDir.replaceAll("(\\\\)", "/");\r
-        \r
+\r
         //\r
         // Parse tools definition file\r
         //\r
         //\r
         // Parse tools definition file\r
         //\r
@@ -165,11 +163,10 @@ public class GlobalData {
         // If ToolChain has been set up before, do nothing.\r
         // CONF dir + tools definition file name\r
         //\r
         // If ToolChain has been set up before, do nothing.\r
         // CONF dir + tools definition file name\r
         //\r
-        String confDir = GlobalData.workspaceDir + File.separatorChar + "Tools" + File.separatorChar + "Conf";\r
-        File toolsDefFile = new File(confDir + File.separatorChar + toolsDefFilename);\r
-        System.out.println("Using file [" + toolsDefFile.getPath() + "] as tools definition file. ");\r
+        File toolsDefFile = new File(workspaceDir + File.separatorChar + toolsDefFilename);\r
+        EdkLog.log("Init", EdkLog.EDK_ALWAYS, "Using tool definition file [" + toolsDefFile.getPath() + "].");\r
         toolsDef = new ToolChainConfig(toolsDefFile);\r
         toolsDef = new ToolChainConfig(toolsDefFile);\r
-        \r
+\r
         //\r
         // Parse Framework Database\r
         //\r
         //\r
         // Parse Framework Database\r
         //\r
@@ -179,8 +176,8 @@ public class GlobalData {
             //\r
             // validate FrameworkDatabaseFile\r
             //\r
             //\r
             // validate FrameworkDatabaseFile\r
             //\r
-            if (! db.validate()) {\r
-                throw new BuildException("Framework Database file [" + dbFile.getPath() + "] is invalid.");\r
+            if (!db.validate()) {\r
+                throw new EdkException("Framework Database file [" + dbFile.getPath() + "] format is invalid!");\r
             }\r
             //\r
             // Get package list\r
             }\r
             //\r
             // Get package list\r
@@ -189,9 +186,18 @@ public class GlobalData {
                 List<DbPathAndFilename> packages = db.getFrameworkDatabase().getPackageList().getFilenameList();\r
                 Iterator<DbPathAndFilename> iter = packages.iterator();\r
                 while (iter.hasNext()) {\r
                 List<DbPathAndFilename> packages = db.getFrameworkDatabase().getPackageList().getFilenameList();\r
                 Iterator<DbPathAndFilename> iter = packages.iterator();\r
                 while (iter.hasNext()) {\r
-                    String fileName = iter.next().getStringValue();\r
+                    String fileName = iter.next().getStringValue().trim();\r
                     Spd spd = new Spd(new File(workspaceDir + File.separatorChar + fileName));\r
                     packageList.add(spd.getPackageId());\r
                     Spd spd = new Spd(new File(workspaceDir + File.separatorChar + fileName));\r
                     packageList.add(spd.getPackageId());\r
+                    //\r
+                    // Report warning if existing two packages with same GUID and Version\r
+                    //\r
+                    if (spdTable.containsKey(spd.getPackageId())) {\r
+                        //\r
+                        // BUGBUG\r
+                        //\r
+                        EdkLog.log("Init", EdkLog.EDK_WARNING, "Warning: Existing two packages with same GUID and Version. They are ... " + spd.getPackageId().getSpdFile().getPath());\r
+                    }\r
                     spdTable.put(spd.getPackageId(), spd);\r
                 }\r
             }\r
                     spdTable.put(spd.getPackageId(), spd);\r
                 }\r
             }\r
@@ -203,41 +209,52 @@ public class GlobalData {
                 List<DbPathAndFilename> platforms = db.getFrameworkDatabase().getPlatformList().getFilenameList();\r
                 Iterator<DbPathAndFilename> iter = platforms.iterator();\r
                 while (iter.hasNext()) {\r
                 List<DbPathAndFilename> platforms = db.getFrameworkDatabase().getPlatformList().getFilenameList();\r
                 Iterator<DbPathAndFilename> iter = platforms.iterator();\r
                 while (iter.hasNext()) {\r
-                    String fileName = iter.next().getStringValue();\r
+                    String fileName = iter.next().getStringValue().trim();\r
                     File fpdFile = new File(workspaceDir + File.separatorChar + fileName);\r
                     File fpdFile = new File(workspaceDir + File.separatorChar + fileName);\r
-                    if ( ! fpdFile.exists() ) {\r
-                        throw new BuildException("Platform file [" + fpdFile.getPath() + "] not exists. ");\r
+                    if ( !fpdFile.exists() ) {\r
+                        throw new EdkException("Platform file [" + fpdFile.getPath() + "] not exists. ");\r
                     }\r
                     XmlObject fpdDoc = XmlObject.Factory.parse(fpdFile);\r
                     //\r
                     // Verify FPD file, if is invalid, throw Exception\r
                     //\r
                     }\r
                     XmlObject fpdDoc = XmlObject.Factory.parse(fpdFile);\r
                     //\r
                     // Verify FPD file, if is invalid, throw Exception\r
                     //\r
-                    if (! fpdDoc.validate()) {\r
-                        throw new BuildException("Framework Platform Surface Area file [" + fpdFile.getPath() + "] is invalid. ");\r
+                    if (!fpdDoc.validate()) {\r
+                        throw new EdkException("Framework Platform Surface Area file [" + fpdFile.getPath() + "] format is invalid!");\r
                     }\r
                     //\r
                     // We can change Map to XmlObject\r
                     //\r
                     }\r
                     //\r
                     // We can change Map to XmlObject\r
                     //\r
-                    //\r
-                    // TBD check SPD or FPD is existed in FS\r
-                    //\r
                     Map<String, XmlObject> fpdDocMap = new HashMap<String, XmlObject>();\r
                     fpdDocMap.put("PlatformSurfaceArea", fpdDoc);\r
                     Map<String, XmlObject> fpdDocMap = new HashMap<String, XmlObject>();\r
                     fpdDocMap.put("PlatformSurfaceArea", fpdDoc);\r
-                    SurfaceAreaQuery.setDoc(fpdDocMap);\r
-                    PlatformIdentification platformId = SurfaceAreaQuery.getFpdHeader();\r
+                    SurfaceAreaQuery saq = new SurfaceAreaQuery(fpdDocMap);\r
+                    PlatformIdentification platformId = saq.getFpdHeader();\r
                     platformId.setFpdFile(fpdFile);\r
                     platformId.setFpdFile(fpdFile);\r
+                    //\r
+                    // Report warning if existing two platfrom with same GUID and Version\r
+                    //\r
+                    if (platformList.contains(platformId)) {\r
+                        //\r
+                        // BUGBUG\r
+                        //\r
+                        EdkLog.log("Init", EdkLog.EDK_WARNING, "Warning: Existing two platforms with same GUID and Version. They are ... " + fpdFile.getPath());\r
+                    }\r
                     platformList.add(platformId);\r
                 }\r
             }\r
                     platformList.add(platformId);\r
                 }\r
             }\r
-        } catch (Exception e) {\r
-            e.printStackTrace();\r
-            throw new BuildException("Parse workspace Database [" + dbFile.getPath() + "] Error.\n" + e.getMessage());\r
+        } catch(IOException ex) {\r
+            EdkException edkException = new EdkException("Parse WORKSPACE Database file [" + dbFile.getPath() + "] Error.\n" + ex.getMessage());\r
+            edkException.setStackTrace(ex.getStackTrace());\r
+            throw edkException;\r
+        } catch(XmlException ex) {\r
+            EdkException edkException = new EdkException("Parse WORKSPACE Database file [" + dbFile.getPath() + "] Error.\n" + ex.getMessage());\r
+            edkException.setStackTrace(ex.getStackTrace());\r
+            throw edkException;\r
         }\r
     }\r
         }\r
     }\r
-    \r
+\r
     /**\r
     /**\r
-      Get the current WORKSPACE Directory. \r
-      \r
+      Get the current WORKSPACE Directory.\r
+\r
       @return current workspace directory\r
     **/\r
     public synchronized static String getWorkspacePath() {\r
       @return current workspace directory\r
     **/\r
     public synchronized static String getWorkspacePath() {\r
@@ -248,10 +265,10 @@ public class GlobalData {
     /**\r
       Get the MSA file name with absolute path\r
      */\r
     /**\r
       Get the MSA file name with absolute path\r
      */\r
-    public synchronized static File getMsaFile(ModuleIdentification moduleId) throws BuildException {\r
+    public synchronized static File getMsaFile(ModuleIdentification moduleId) throws EdkException {\r
         File msaFile = null;\r
         //\r
         File msaFile = null;\r
         //\r
-        // TBD. Do only when package is null. \r
+        // TBD. Do only when package is null.\r
         //\r
         Iterator iter = packageList.iterator();\r
         while (iter.hasNext()) {\r
         //\r
         Iterator iter = packageList.iterator();\r
         while (iter.hasNext()) {\r
@@ -263,52 +280,54 @@ public class GlobalData {
             }\r
         }\r
         if (msaFile == null){\r
             }\r
         }\r
         if (msaFile == null){\r
-            throw new BuildException("Can't find Module [" + moduleId.getName() + "] in all packages. ");\r
-        }\r
-        else {\r
+            throw new EdkException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
+        } else {\r
             return msaFile;\r
         }\r
     }\r
 \r
             return msaFile;\r
         }\r
     }\r
 \r
-    public synchronized static PackageIdentification getPackageForModule(ModuleIdentification moduleId) {\r
+    public synchronized static PackageIdentification getPackageForModule(ModuleIdentification moduleId) throws EdkException {\r
         //\r
         // If package already defined in module\r
         //\r
         if (moduleId.getPackage() != null) {\r
             return moduleId.getPackage();\r
         }\r
         //\r
         // If package already defined in module\r
         //\r
         if (moduleId.getPackage() != null) {\r
             return moduleId.getPackage();\r
         }\r
-        \r
+\r
         PackageIdentification packageId = null;\r
         Iterator iter = packageList.iterator();\r
         while (iter.hasNext()) {\r
             packageId = (PackageIdentification)iter.next();\r
             moduleId.setPackage(packageId);\r
             Spd spd = spdTable.get(packageId);\r
         PackageIdentification packageId = null;\r
         Iterator iter = packageList.iterator();\r
         while (iter.hasNext()) {\r
             packageId = (PackageIdentification)iter.next();\r
             moduleId.setPackage(packageId);\r
             Spd spd = spdTable.get(packageId);\r
-            if (spd.getModuleFile(moduleId) != null ) {\r
-                break ;\r
+            File tempMsaFile = null;\r
+            if ((tempMsaFile = spd.getModuleFile(moduleId)) != null ) {\r
+                if (tempMsaFile.getParent().equalsIgnoreCase(moduleId.getMsaFile().getParent())) {\r
+                    break ;\r
+                }\r
+                tempMsaFile = null;\r
             }\r
         }\r
         if (packageId == null){\r
             }\r
         }\r
         if (packageId == null){\r
-            throw new BuildException("Can't find Module [" + moduleId.getName() + "] in all packages. ");\r
-        }\r
-        else {\r
+            throw new EdkException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
+        } else {\r
             return packageId;\r
         }\r
     }\r
             return packageId;\r
         }\r
     }\r
-    \r
+\r
     /**\r
       Difference between build and parse: ToolChain and Target\r
     **/\r
     public synchronized static boolean isModuleBuilt(FpdModuleIdentification moduleId) {\r
         return builtModules.contains(moduleId);\r
     }\r
     /**\r
       Difference between build and parse: ToolChain and Target\r
     **/\r
     public synchronized static boolean isModuleBuilt(FpdModuleIdentification moduleId) {\r
         return builtModules.contains(moduleId);\r
     }\r
-    \r
+\r
     public synchronized static void registerBuiltModule(FpdModuleIdentification fpdModuleId) {\r
         builtModules.add(fpdModuleId);\r
     }\r
 \r
     public synchronized static void registerBuiltModule(FpdModuleIdentification fpdModuleId) {\r
         builtModules.add(fpdModuleId);\r
     }\r
 \r
-    \r
-    public synchronized static void registerFpdModuleSA(FpdModuleIdentification fpdModuleId, Map<String, XmlObject> doc) {\r
+\r
+    public synchronized static void registerFpdModuleSA(FpdModuleIdentification fpdModuleId, Map<String, XmlObject> doc) throws EdkException{\r
         Map<String, XmlObject> result = new HashMap<String, XmlObject>();\r
         Set keySet = doc.keySet();\r
         Iterator iter = keySet.iterator();\r
         Map<String, XmlObject> result = new HashMap<String, XmlObject>();\r
         Set keySet = doc.keySet();\r
         Iterator iter = keySet.iterator();\r
@@ -319,20 +338,22 @@ public class GlobalData {
         }\r
         fpdModuleSA.put(fpdModuleId, result);\r
     }\r
         }\r
         fpdModuleSA.put(fpdModuleId, result);\r
     }\r
-    \r
+\r
+    public synchronized static boolean hasFpdModuleSA(FpdModuleIdentification fpdModuleId) {\r
+        return fpdModuleSA.containsKey(fpdModuleId);\r
+    }\r
+\r
     /**\r
     /**\r
-      Query overrided module surface area information. If current is Package\r
-      or Platform build, also include the information from FPD file. \r
-      \r
-      <p>Note that surface area parsing is incremental. That means the method will \r
-      only parse the MSA and MBD files if necessary. </p>\r
+      Query module surface area information.\r
+\r
+      <p>Note that surface area parsing is incremental. That means the method will\r
+      only parse the MSA files if necessary. </p>\r
     \r
     \r
-      @param moduleName the base name of the module\r
-      @return the overrided module surface area information\r
-      @throws BuildException\r
-              MSA or MBD is not valid\r
+      @param fpdModuleId Module ID with arch\r
+      @return ModuleSA info and MSA info for fpdModuleId\r
+      @throws BuildException Can't find MSA\r
     **/\r
     **/\r
-    public synchronized static Map<String, XmlObject> getDoc(FpdModuleIdentification fpdModuleId) throws BuildException {\r
+    public synchronized static Map<String, XmlObject> getDoc(FpdModuleIdentification fpdModuleId) throws EdkException{\r
         if (parsedModules.containsKey(fpdModuleId)) {\r
             return parsedModules.get(fpdModuleId);\r
         }\r
         if (parsedModules.containsKey(fpdModuleId)) {\r
             return parsedModules.get(fpdModuleId);\r
         }\r
@@ -341,13 +362,13 @@ public class GlobalData {
         //\r
         // First part: get the MSA files info\r
         //\r
         //\r
         // First part: get the MSA files info\r
         //\r
-        doc = getNativeMsa(moduleId);\r
-        \r
+        doc.putAll(getNativeMsa(moduleId));\r
+\r
         //\r
         // Second part: put build options\r
         //\r
         doc.put("BuildOptions", fpdBuildOptions);\r
         //\r
         // Second part: put build options\r
         //\r
         doc.put("BuildOptions", fpdBuildOptions);\r
-        \r
+\r
         //\r
         // Third part: get Module info from FPD, such as Library instances, PCDs\r
         //\r
         //\r
         // Third part: get Module info from FPD, such as Library instances, PCDs\r
         //\r
@@ -362,22 +383,23 @@ public class GlobalData {
         return doc;\r
     }\r
 \r
         return doc;\r
     }\r
 \r
-    public synchronized static Map<String, XmlObject> getDoc(ModuleIdentification moduleId, String arch) throws BuildException {\r
+    public synchronized static Map<String, XmlObject> getDoc(ModuleIdentification moduleId, String arch) throws EdkException{\r
         FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, arch);\r
         return getDoc(fpdModuleId);\r
     }\r
         FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, arch);\r
         return getDoc(fpdModuleId);\r
     }\r
+    \r
     /**\r
     /**\r
-      Query the native MSA information with module base name. \r
-      \r
-      <p>Note that MSA parsing is incremental. That means the method will \r
+      Query the native MSA information with module base name.\r
+\r
+      <p>Note that MSA parsing is incremental. That means the method will\r
       only to parse the MSA files when never parsed before. </p>\r
       only to parse the MSA files when never parsed before. </p>\r
-      \r
+\r
       @param moduleName the base name of the module\r
       @return the native MSA information\r
       @throws BuildException\r
               MSA file is not valid\r
     **/\r
       @param moduleName the base name of the module\r
       @return the native MSA information\r
       @throws BuildException\r
               MSA file is not valid\r
     **/\r
-    public synchronized static Map<String, XmlObject> getNativeMsa(ModuleIdentification moduleId) throws BuildException {\r
+    public synchronized static Map<String, XmlObject> getNativeMsa(ModuleIdentification moduleId) throws EdkException {\r
         if (nativeMsa.containsKey(moduleId)) {\r
             return nativeMsa.get(moduleId);\r
         }\r
         if (nativeMsa.containsKey(moduleId)) {\r
             return nativeMsa.get(moduleId);\r
         }\r
@@ -386,18 +408,18 @@ public class GlobalData {
         nativeMsa.put(moduleId, msaMap);\r
         return msaMap;\r
     }\r
         nativeMsa.put(moduleId, msaMap);\r
         return msaMap;\r
     }\r
-    \r
-    public synchronized static Map<String, XmlObject> getNativeMsa(File msaFile) throws BuildException {\r
-        if (! msaFile.exists()) {\r
-            throw new BuildException("Surface Area file [" + msaFile.getPath() + "] can't found.");\r
+\r
+    public synchronized static Map<String, XmlObject> getNativeMsa(File msaFile) throws EdkException {\r
+        if (!msaFile.exists()) {\r
+            throw new EdkException("Module Surface Area file [" + msaFile.getPath() + "] can't be found!");\r
         }\r
         try {\r
             ModuleSurfaceAreaDocument doc = (ModuleSurfaceAreaDocument)XmlObject.Factory.parse(msaFile);\r
             //\r
             // Validate File if they accord with XML Schema\r
             //\r
         }\r
         try {\r
             ModuleSurfaceAreaDocument doc = (ModuleSurfaceAreaDocument)XmlObject.Factory.parse(msaFile);\r
             //\r
             // Validate File if they accord with XML Schema\r
             //\r
-            if ( ! doc.validate()){\r
-                throw new BuildException("Module Surface Area file [" + msaFile.getPath() + "] is invalid.");\r
+            if ( !doc.validate()){\r
+                throw new EdkException("Module Surface Area file [" + msaFile.getPath() + "] format is invalid!");\r
             }\r
             //\r
             // parse MSA file\r
             }\r
             //\r
             // parse MSA file\r
@@ -413,21 +435,26 @@ public class GlobalData {
             msaMap.put("PPIs", cloneXmlObject(msa.getPPIs(), true));\r
             msaMap.put("Guids", cloneXmlObject(msa.getGuids(), true));\r
             msaMap.put("Externs", cloneXmlObject(msa.getExterns(), true));\r
             msaMap.put("PPIs", cloneXmlObject(msa.getPPIs(), true));\r
             msaMap.put("Guids", cloneXmlObject(msa.getGuids(), true));\r
             msaMap.put("Externs", cloneXmlObject(msa.getExterns(), true));\r
+            msaMap.put("PcdCoded", cloneXmlObject(msa.getPcdCoded(), true));\r
             return msaMap;\r
             return msaMap;\r
-        }\r
-        catch (Exception ex){\r
-            throw new BuildException(ex.getMessage());\r
+        } catch(IOException ex) {\r
+            EdkException edkException = new EdkException("Parsing MSA file [" + msaFile.getPath() + "] error. \n" + ex.getMessage());\r
+            edkException.setStackTrace(ex.getStackTrace());\r
+            throw edkException;\r
+        } catch(XmlException ex) {\r
+            EdkException edkException = new EdkException("Parsing MSA file [" + msaFile.getPath() + "] error. \n" + ex.getMessage());\r
+            edkException.setStackTrace(ex.getStackTrace());\r
+            throw edkException;\r
         }\r
     }\r
         }\r
     }\r
-    \r
-    public static Map<String, XmlObject> getFpdBuildOptions() {\r
-        Map<String, XmlObject> map = new HashMap<String, XmlObject>();\r
-        map.put("BuildOptions", fpdBuildOptions);\r
-        return map;\r
+\r
+    public static Map<String, XmlObject> getFpdBuildOptionsMap() {\r
+        return fpdBuildOptionsMap;\r
     }\r
     }\r
-    \r
-    public static void setFpdBuildOptions(XmlObject fpdBuildOptions) {\r
+\r
+    public static void setFpdBuildOptions(XmlObject fpdBuildOptions) throws EdkException {\r
         GlobalData.fpdBuildOptions = cloneXmlObject(fpdBuildOptions, true);\r
         GlobalData.fpdBuildOptions = cloneXmlObject(fpdBuildOptions, true);\r
+        fpdBuildOptionsMap.put("BuildOptions", GlobalData.fpdBuildOptions);\r
     }\r
 \r
     public static XmlObject getFpdDynamicPcds() {\r
     }\r
 \r
     public static XmlObject getFpdDynamicPcds() {\r
@@ -438,16 +465,12 @@ public class GlobalData {
         GlobalData.fpdDynamicPcds = fpdDynamicPcds;\r
     }\r
 \r
         GlobalData.fpdDynamicPcds = fpdDynamicPcds;\r
     }\r
 \r
-    //////////////////////////////////////////////\r
-    //////////////////////////////////////////////\r
-    \r
     public static Set<ModuleIdentification> getModules(PackageIdentification packageId){\r
         Spd spd = spdTable.get(packageId);\r
         if (spd == null ) {\r
             Set<ModuleIdentification> dummy = new HashSet<ModuleIdentification>();\r
             return dummy;\r
     public static Set<ModuleIdentification> getModules(PackageIdentification packageId){\r
         Spd spd = spdTable.get(packageId);\r
         if (spd == null ) {\r
             Set<ModuleIdentification> dummy = new HashSet<ModuleIdentification>();\r
             return dummy;\r
-        }\r
-        else {\r
+        } else {\r
             return spd.getModules();\r
         }\r
     }\r
             return spd.getModules();\r
         }\r
     }\r
@@ -456,8 +479,7 @@ public class GlobalData {
      * The header file path is relative to workspace dir\r
      */\r
     public static String[] getLibraryClassHeaderFiles(\r
      * The header file path is relative to workspace dir\r
      */\r
     public static String[] getLibraryClassHeaderFiles(\r
-            PackageIdentification[] packages, String name)\r
-            throws BuildException {\r
+            PackageIdentification[] packages, String name) throws EdkException{\r
         if (packages == null) {\r
             // throw Exception or not????\r
             return new String[0];\r
         if (packages == null) {\r
             // throw Exception or not????\r
             return new String[0];\r
@@ -475,15 +497,15 @@ public class GlobalData {
         //\r
         // If can't find library class declaration in every package\r
         //\r
         //\r
         // If can't find library class declaration in every package\r
         //\r
-        throw new BuildException("Can not find library class [" + name\r
-                + "] declaration in every packages. ");\r
+        throw new EdkException("Can not find library class [" + name\r
+                + "] declaration in any SPD package!");\r
     }\r
 \r
     /**\r
      * The header file path is relative to workspace dir\r
      */\r
     public static String getPackageHeaderFiles(PackageIdentification packages,\r
     }\r
 \r
     /**\r
      * The header file path is relative to workspace dir\r
      */\r
     public static String getPackageHeaderFiles(PackageIdentification packages,\r
-            String moduleType) throws BuildException {\r
+            String moduleType) {\r
         if (packages == null) {\r
             return new String("");\r
         }\r
         if (packages == null) {\r
             return new String("");\r
         }\r
@@ -507,15 +529,15 @@ public class GlobalData {
     /**\r
      * return two values: {cName, GuidValue}\r
      */\r
     /**\r
      * return two values: {cName, GuidValue}\r
      */\r
-    public static String[] getGuid(PackageIdentification[] packages, String name)\r
-            throws BuildException {\r
+    public static String[] getGuid(List<PackageIdentification> packages, String name) {\r
         if (packages == null) {\r
             // throw Exception or not????\r
             return new String[0];\r
         }\r
         String[] result = null;\r
         if (packages == null) {\r
             // throw Exception or not????\r
             return new String[0];\r
         }\r
         String[] result = null;\r
-        for (int i = 0; i < packages.length; i++) {\r
-            Spd spd = spdTable.get(packages[i]);\r
+        Iterator item = packages.iterator();\r
+        while (item.hasNext()){\r
+            Spd spd = spdTable.get(item.next());\r
             //\r
             // If find one package defined the GUID\r
             //\r
             //\r
             // If find one package defined the GUID\r
             //\r
@@ -523,20 +545,22 @@ public class GlobalData {
                 return result;\r
             }\r
         }\r
                 return result;\r
             }\r
         }\r
+\r
         return null;\r
     }\r
 \r
     /**\r
      * return two values: {cName, GuidValue}\r
      */\r
         return null;\r
     }\r
 \r
     /**\r
      * return two values: {cName, GuidValue}\r
      */\r
-    public static String[] getPpiGuid(PackageIdentification[] packages,\r
-            String name) throws BuildException {\r
+    public static String[] getPpiGuid(List<PackageIdentification> packages,\r
+            String name) {\r
         if (packages == null) {\r
             return new String[0];\r
         }\r
         String[] result = null;\r
         if (packages == null) {\r
             return new String[0];\r
         }\r
         String[] result = null;\r
-        for (int i = 0; i < packages.length; i++) {\r
-            Spd spd = spdTable.get(packages[i]);\r
+        Iterator item = packages.iterator();\r
+        while (item.hasNext()){\r
+            Spd spd = spdTable.get(item.next());\r
             //\r
             // If find one package defined the Ppi GUID\r
             //\r
             //\r
             // If find one package defined the Ppi GUID\r
             //\r
@@ -545,49 +569,55 @@ public class GlobalData {
             }\r
         }\r
         return null;\r
             }\r
         }\r
         return null;\r
-\r
     }\r
 \r
     /**\r
      * return two values: {cName, GuidValue}\r
      */\r
     }\r
 \r
     /**\r
      * return two values: {cName, GuidValue}\r
      */\r
-    public static String[] getProtocolGuid(PackageIdentification[] packages,\r
-            String name) throws BuildException {\r
+    public static String[] getProtocolGuid(List<PackageIdentification> packages,\r
+            String name) {\r
         if (packages == null) {\r
             return new String[0];\r
         }\r
         String[] result = null;\r
         if (packages == null) {\r
             return new String[0];\r
         }\r
         String[] result = null;\r
-        for (int i = 0; i < packages.length; i++) {\r
-            Spd spd = spdTable.get(packages[i]);\r
+        Iterator item = packages.iterator();\r
+        while (item.hasNext()){\r
+            Spd spd = spdTable.get(item.next());\r
             //\r
             // If find one package defined the protocol GUID\r
             //\r
             //\r
             // If find one package defined the protocol GUID\r
             //\r
-            if ((result = spd.getProtocol(name)) != null) {\r
+            if ((result = spd.getProtocol(name))!= null){\r
                 return result;\r
             }\r
         }\r
         return null;\r
 \r
     }\r
                 return result;\r
             }\r
         }\r
         return null;\r
 \r
     }\r
-    \r
-    /////////////////////////// Update!! Update!! Update!!\r
-//    public synchronized static MemoryDatabaseManager getPCDMemoryDBManager() {\r
-//        return pcdDbManager;\r
-//    }\r
-    ///////////////////////////\r
-    public synchronized static PlatformIdentification getPlatform(String name) throws BuildException {\r
+\r
+    public synchronized static PlatformIdentification getPlatformByName(String name) throws EdkException {\r
         Iterator iter = platformList.iterator();\r
         while(iter.hasNext()){\r
             PlatformIdentification platformId = (PlatformIdentification)iter.next();\r
             if (platformId.getName().equalsIgnoreCase(name)) {\r
         Iterator iter = platformList.iterator();\r
         while(iter.hasNext()){\r
             PlatformIdentification platformId = (PlatformIdentification)iter.next();\r
             if (platformId.getName().equalsIgnoreCase(name)) {\r
-//                GlobalData.log.info("Platform: " + platformId + platformId.getFpdFile());\r
                 return platformId;\r
             }\r
         }\r
                 return platformId;\r
             }\r
         }\r
-        throw new BuildException("Can't find platform [" + name + "] in current workspace. ");\r
+        throw new EdkException("Can't find platform [" + name + "] in the current WORKSPACE database!");\r
     }\r
     }\r
-    \r
-    public synchronized static PackageIdentification refreshPackageIdentification(PackageIdentification packageId) throws BuildException {\r
+\r
+    public synchronized static PlatformIdentification getPlatform(String filename) throws EdkException {\r
+        File file = new File(workspaceDir + File.separatorChar + filename);\r
+        Iterator iter = platformList.iterator();\r
+        while(iter.hasNext()){\r
+            PlatformIdentification platformId = (PlatformIdentification)iter.next();\r
+            if (platformId.getFpdFile().getPath().equalsIgnoreCase(file.getPath())) {\r
+                return platformId;\r
+            }\r
+        }\r
+        throw new EdkException("Can't find platform file [" + filename + "] in the current WORKSPACE database!");\r
+    }\r
+\r
+    public synchronized static PackageIdentification refreshPackageIdentification(PackageIdentification packageId) throws EdkException {\r
         Iterator iter = packageList.iterator();\r
         while(iter.hasNext()){\r
             PackageIdentification packageItem = (PackageIdentification)iter.next();\r
         Iterator iter = packageList.iterator();\r
         while(iter.hasNext()){\r
             PackageIdentification packageItem = (PackageIdentification)iter.next();\r
@@ -597,18 +627,15 @@ public class GlobalData {
                 return packageId;\r
             }\r
         }\r
                 return packageId;\r
             }\r
         }\r
-        throw new BuildException("Can't find package GUID value " + packageId.getGuid() + " under current workspace. ");\r
+        throw new EdkException("Can't find package GUID value " + packageId.toGuidString() + " in the current workspace!");\r
     }\r
     }\r
-    \r
-    public synchronized static ModuleIdentification refreshModuleIdentification(ModuleIdentification moduleId) throws BuildException {\r
-//        System.out.println("1");\r
-//        System.out.println("##" + moduleId.getGuid());\r
+\r
+    public synchronized static ModuleIdentification refreshModuleIdentification(ModuleIdentification moduleId) throws EdkException {\r
         PackageIdentification packageId = getPackageForModule(moduleId);\r
         PackageIdentification packageId = getPackageForModule(moduleId);\r
-//        System.out.println("" + packageId.getGuid());\r
         moduleId.setPackage(packageId);\r
         Spd spd = spdTable.get(packageId);\r
         if (spd == null) {\r
         moduleId.setPackage(packageId);\r
         Spd spd = spdTable.get(packageId);\r
         if (spd == null) {\r
-            throw new BuildException("Can't find package GUID value " + packageId.getGuid() + " under current workspace. ");\r
+            throw new EdkException("Can't find package GUID value " + packageId.toGuidString() + " in the current workspace!");\r
         }\r
         Set<ModuleIdentification> modules = spd.getModules();\r
         Iterator<ModuleIdentification> iter = modules.iterator();\r
         }\r
         Set<ModuleIdentification> modules = spd.getModules();\r
         Iterator<ModuleIdentification> iter = modules.iterator();\r
@@ -621,14 +648,23 @@ public class GlobalData {
                 return moduleId;\r
             }\r
         }\r
                 return moduleId;\r
             }\r
         }\r
-        throw new BuildException("Can't find module GUID value " + moduleId.getGuid() + " in " + packageId + " under current workspace. ");\r
+        throw new EdkException("Can't find module GUID value " + moduleId.toGuidString() + " in " + packageId + " under the current workspace!");\r
     }\r
     }\r
-    \r
+\r
     public synchronized static Set<PackageIdentification> getPackageList(){\r
         return packageList;\r
     }\r
     public synchronized static Set<PackageIdentification> getPackageList(){\r
         return packageList;\r
     }\r
-    ///// remove!!\r
-    private static XmlObject cloneXmlObject(XmlObject object, boolean deep) throws BuildException {\r
+\r
+    /**\r
+      BUGBUG: It is a walk around method. If do not clone, can't query info with\r
+      XPath correctly. \r
+      \r
+      @param object XmlObject\r
+      @param deep flag for deep clone\r
+      @return XmlObject after clone\r
+      @throws BuildException parse original XmlObject error. \r
+    **/\r
+    private static XmlObject cloneXmlObject(XmlObject object, boolean deep) throws EdkException {\r
         if ( object == null) {\r
             return null;\r
         }\r
         if ( object == null) {\r
             return null;\r
         }\r
@@ -636,16 +672,18 @@ public class GlobalData {
         try {\r
             result = XmlObject.Factory.parse(object.getDomNode()\r
                             .cloneNode(deep));\r
         try {\r
             result = XmlObject.Factory.parse(object.getDomNode()\r
                             .cloneNode(deep));\r
-        } catch (Exception ex) {\r
-            throw new BuildException(ex.getMessage());\r
+        } catch (XmlException ex) {\r
+            EdkException edkException = new EdkException(ex.getMessage());\r
+            edkException.setStackTrace(ex.getStackTrace());\r
+            throw edkException;\r
         }\r
         return result;\r
     }\r
 \r
         }\r
         return result;\r
     }\r
 \r
-    ////// Tool Chain Related, try to refine and put some logic process to ToolChainFactory\r
-\r
-    public static ToolChainInfo getToolChainInfo() {\r
-//        GlobalData.log.info(toolsDef.getConfigInfo() + "" + toolChainEnvInfo + toolChainPlatformInfo);\r
+    ///\r
+    /// Tool Chain Related, try to refine and put some logic process to ToolChainFactory\r
+    ///\r
+    public synchronized static ToolChainInfo getToolChainInfo() {\r
         if (toolChainInfo == null) {\r
             toolChainInfo = toolsDef.getConfigInfo().intersection(toolChainEnvInfo);\r
             if (toolChainPlatformInfo != null) {\r
         if (toolChainInfo == null) {\r
             toolChainInfo = toolsDef.getConfigInfo().intersection(toolChainEnvInfo);\r
             if (toolChainPlatformInfo != null) {\r
@@ -653,13 +691,12 @@ public class GlobalData {
             }\r
             toolChainInfo.addCommands(toolsDef.getConfigInfo().getCommands());\r
             toolChainInfo.normalize();\r
             }\r
             toolChainInfo.addCommands(toolsDef.getConfigInfo().getCommands());\r
             toolChainInfo.normalize();\r
-            GlobalData.log.info(toolChainInfo + "");\r
+            EdkLog.log("Init", EdkLog.EDK_ALWAYS, "Current build tool chain information summary: ");\r
+            EdkLog.log("Init", EdkLog.EDK_ALWAYS, toolChainInfo + "");\r
         }\r
         return toolChainInfo;\r
     }\r
 \r
         }\r
         return toolChainInfo;\r
     }\r
 \r
-\r
-\r
     public static void setPlatformToolChainFamilyOption(ToolChainMap map) {\r
         platformToolChainFamilyOption = map;\r
     }\r
     public static void setPlatformToolChainFamilyOption(ToolChainMap map) {\r
         platformToolChainFamilyOption = map;\r
     }\r
@@ -678,16 +715,29 @@ public class GlobalData {
         moduleToolChainFamilyOption.put(fpdModuleId, toolChainOption);\r
     }\r
 \r
         moduleToolChainFamilyOption.put(fpdModuleId, toolChainOption);\r
     }\r
 \r
-    public static String getCommandSetting(String[] commandDescription, FpdModuleIdentification fpdModuleId) throws EdkException {\r
+    public static boolean isCommandSet(String target, String toolchain, String arch) {\r
+        String[] commands = getToolChainInfo().getCommands();\r
+\r
+        for (int i = 0; i < commands.length; ++i) {\r
+            String cmdName = toolsDef.getConfig().get(new String[] {target, toolchain, arch, commands[i], ToolChainAttribute.NAME.toString()});\r
+            if (cmdName != null && cmdName.length() != 0) {\r
+                return true;\r
+            }\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    public synchronized static String getCommandSetting(String[] commandDescription, FpdModuleIdentification fpdModuleId) throws EdkException {\r
         ToolChainKey toolChainKey = new ToolChainKey(commandDescription);\r
         ToolChainKey toolChainKey = new ToolChainKey(commandDescription);\r
-        ToolChainMap toolChainConfig = toolsDef.getConfig(); \r
+        ToolChainMap toolChainConfig = toolsDef.getConfig();\r
         String setting = null;\r
 \r
         String setting = null;\r
 \r
+        setting = toolChainConfig.get(toolChainKey);\r
+        if (setting == null) {\r
+          setting = "";\r
+        }\r
         if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolChainAttribute.FLAGS.toString())) {\r
         if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolChainAttribute.FLAGS.toString())) {\r
-            setting = toolChainConfig.get(toolChainKey);\r
-            if (setting == null) {\r
-                setting = "";\r
-            }\r
             return setting;\r
         }\r
 \r
             return setting;\r
         }\r
 \r
@@ -698,7 +748,98 @@ public class GlobalData {
         ToolChainMap option = moduleToolChainOption.get(fpdModuleId);\r
         ToolChainKey toolChainFamilyKey = null;\r
 \r
         ToolChainMap option = moduleToolChainOption.get(fpdModuleId);\r
         ToolChainKey toolChainFamilyKey = null;\r
 \r
-        if ((option == null) || (option != null && (setting = option.get(toolChainKey)) == null)) {\r
+        if (option != null && option.get(toolChainKey) != null)  \r
+        {\r
+          String str = option.get(toolChainKey);\r
+\r
+          Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\r
+          Matcher matcher = myPattern.matcher(str + " ");\r
+          while (matcher.find()) \r
+          {\r
+            setting = setting + " " + str.substring(matcher.start(1), matcher.end(1));\r
+          }\r
+        } \r
+//        else \r
+//        {\r
+          if (toolChainFamilyKey == null) \r
+          {\r
+            toolChainFamilyKey = new ToolChainKey(commandDescription);\r
+            toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value);\r
+            String family = toolChainConfig.get(toolChainFamilyKey);\r
+            toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value);\r
+            toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value);\r
+          }\r
+\r
+          option = moduleToolChainFamilyOption.get(fpdModuleId);\r
+          if (option != null && option.get(toolChainFamilyKey) != null) \r
+          {\r
+            String str = option.get(toolChainFamilyKey);\r
+\r
+            Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\r
+            Matcher matcher = myPattern.matcher(str + " ");\r
+            while (matcher.find()) \r
+            {\r
+              setting = setting + " " + str.substring(matcher.start(1), matcher.end(1));\r
+            }\r
+          }\r
+//        }\r
+\r
+        //\r
+        // get platform options, if any\r
+        //\r
+        // tool tag first\r
+//        if (platformToolChainOption != null && platformToolChainOption.get(toolChainKey) != null) \r
+        if (platformToolChainOption.get(toolChainKey) != null) \r
+        {\r
+          String str = platformToolChainOption.get(toolChainKey);\r
+\r
+          Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\r
+          Matcher matcher = myPattern.matcher(str + " ");\r
+          while (matcher.find()) \r
+          {\r
+            setting = setting + " " + str.substring(matcher.start(1), matcher.end(1));\r
+          }\r
+        } \r
+//        else \r
+//        {\r
+          // then tool chain family\r
+          if (toolChainFamilyKey == null) \r
+          {\r
+            toolChainFamilyKey = new ToolChainKey(commandDescription);\r
+            toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value);\r
+            String family = toolChainConfig.get(toolChainFamilyKey);\r
+            toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value);\r
+            toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value);\r
+          }\r
+\r
+//          if (platformToolChainFamilyOption != null && platformToolChainFamilyOption.get(toolChainFamilyKey) != null) \r
+          if (platformToolChainFamilyOption.get(toolChainFamilyKey) != null) \r
+          {\r
+            String str = platformToolChainFamilyOption.get(toolChainFamilyKey);\r
+\r
+            setting = setting + " " + str;\r
+\r
+//            Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\r
+//            Matcher matcher = myPattern.matcher(str + " ");\r
+//            while (matcher.find()) \r
+//            {\r
+//              setting = setting + " " + str.substring(matcher.start(1), matcher.end(1));\r
+//            }\r
+          }\r
+//        }\r
+\r
+        return setting;\r
+\r
+/*\r
+        //\r
+        // get module specific options, if any\r
+        //\r
+        // tool tag first\r
+        ToolChainMap option = moduleToolChainOption.get(fpdModuleId);\r
+        ToolChainKey toolChainFamilyKey = null;\r
+        \r
+        if ((option == null) || (option != null && (setting = option.get(toolChainKey)) == null)) \r
+        {\r
             //\r
             // then tool chain family\r
             //\r
             //\r
             // then tool chain family\r
             //\r
@@ -709,7 +850,7 @@ public class GlobalData {
             toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value);\r
 \r
             option = moduleToolChainFamilyOption.get(fpdModuleId);\r
             toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value);\r
 \r
             option = moduleToolChainFamilyOption.get(fpdModuleId);\r
-            if (option != null) {                \r
+            if (option != null) {\r
                 setting = option.get(toolChainFamilyKey);\r
             }\r
         }\r
                 setting = option.get(toolChainFamilyKey);\r
             }\r
         }\r
@@ -738,8 +879,9 @@ public class GlobalData {
         }\r
 \r
         return setting;\r
         }\r
 \r
         return setting;\r
+*/\r
     }\r
     }\r
-    \r
+\r
     public static void setToolChainEnvInfo(ToolChainInfo envInfo) {\r
         toolChainEnvInfo = envInfo;\r
     }\r
     public static void setToolChainEnvInfo(ToolChainInfo envInfo) {\r
         toolChainEnvInfo = envInfo;\r
     }\r
@@ -750,52 +892,67 @@ public class GlobalData {
     //\r
     // for PCD\r
     //\r
     //\r
     // for PCD\r
     //\r
-//    public synchronized static MemoryDatabaseManager getPCDMemoryDBManager() {\r
-//        return pcdDbManager;\r
-//    }\r
+    public synchronized static MemoryDatabaseManager getPCDMemoryDBManager() {\r
+        return pcdDbManager;\r
+    }\r
 \r
     //\r
 \r
     //\r
-    // For PCD\r
+    // For PCD get tokenSpaceGUid\r
     //\r
     //\r
-    /**\r
-     * \r
-     * @param guidName\r
-     * @return\r
-     */\r
-//    public synchronized static String[] getGuidInfoGuid(String guidName) {\r
-//        String[] cNameGuid = null;\r
-//        Set set = spdTable.keySet();\r
-//        Iterator iter = set.iterator();\r
-//\r
-//        while (iter.hasNext()) {\r
-//            Spd spd = (Spd) spdTable.get(iter.next());\r
-//            cNameGuid = spd.getGuidNameArray(guidName);\r
-//            if (cNameGuid != null) {\r
-//                break;\r
-//            }\r
-//        }\r
-//        return cNameGuid;\r
-//    }\r
+    public synchronized static String getGuidInfoFromCname(String cName){\r
+        String cNameGuid = null;\r
+        String guid = null;\r
+        Set set = spdTable.keySet();\r
+        Iterator iter = set.iterator();\r
+\r
+        if (iter == null) {\r
+            return null;\r
+        }\r
+\r
+        while (iter.hasNext()){\r
+            Spd spd = (Spd) spdTable.get(iter.next());\r
+            guid = spd.getGuidFromCname(cName);\r
+            if (guid != null){\r
+                cNameGuid = guid;\r
+                break;\r
+            }\r
+        }\r
+        return cNameGuid;\r
+    }\r
 \r
     //\r
     // For PCD\r
     //\r
 \r
     //\r
     // For PCD\r
     //\r
-//    public synchronized static Map<FpdModuleIdentification, XmlObject> getFpdModuleSaXmlObject(\r
-//            String xmlObjectName) {\r
-//        Set<FpdModuleIdentification> fpdModuleSASet = fpdModuleSA.keySet();\r
-//        Iterator item = fpdModuleSASet.iterator();\r
-//\r
-//        Map<FpdModuleIdentification, XmlObject> SAPcdBuildDef = new HashMap<FpdModuleIdentification, XmlObject>();\r
-//        Map<String, XmlObject> SANode = new HashMap<String, XmlObject>();\r
-//        FpdModuleIdentification moduleId;\r
-//        while (item.hasNext()) {\r
-//            moduleId = (FpdModuleIdentification) item.next();\r
-//            SANode = fpdModuleSA.get(item.next());\r
-//            SAPcdBuildDef.put(moduleId,\r
-//                    (PcdBuildDefinitionDocument.PcdBuildDefinition) SANode\r
-//                            .get(xmlObjectName));\r
-//        }\r
-//        return SAPcdBuildDef;\r
-//    }\r
+    public synchronized static Map<FpdModuleIdentification, XmlObject>\r
+                               getFpdModuleSaXmlObject(String xmlObjectName) {\r
+        Set<FpdModuleIdentification> fpdModuleSASet = fpdModuleSA.keySet();\r
+        Iterator item = fpdModuleSASet.iterator();\r
+\r
+\r
+        Map<FpdModuleIdentification, XmlObject> SAPcdBuildDef = new HashMap<FpdModuleIdentification, XmlObject>();\r
+        Map<String, XmlObject> SANode = new HashMap<String, XmlObject>();\r
+        FpdModuleIdentification moduleId;\r
+        while (item.hasNext()) {\r
+\r
+            moduleId = (FpdModuleIdentification) item.next();\r
+            SANode = fpdModuleSA.get(moduleId);\r
+            try{\r
+                if (SANode.get(xmlObjectName)!= null){\r
+                    SAPcdBuildDef.put(moduleId,\r
+                            (XmlObject) SANode.get(xmlObjectName));\r
+\r
+                }\r
+            } catch (Exception e){\r
+                EdkLog.log(EdkLog.EDK_INFO, e.getMessage());\r
+            }\r
+        }\r
+        return SAPcdBuildDef;\r
+    }\r
+\r
+    public synchronized static Map<FpdModuleIdentification,XmlObject> getFpdPcdBuildDefinitions() {\r
+        Map<FpdModuleIdentification,XmlObject> pcdBuildDef = getFpdModuleSaXmlObject ("PcdBuildDefinition");\r
+\r
+        return pcdBuildDef;\r
+    }\r
 }\r
 \r
 }\r
 \r