]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/GenBuild/org/tianocore/build/global/GlobalData.java
Fixed the build error.
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / global / GlobalData.java
index ceb19d91db7d78c9400a26f819255e43feec0f1b..96558876e4b0f08a765353381db20db58c31f8ce 100644 (file)
@@ -18,21 +18,19 @@ package org.tianocore.build.global;
 \r
 import java.io.File;\r
 import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.Iterator;\r
+import java.util.LinkedHashSet;\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
-\r
-import org.tianocore.common.exception.EdkException;\r
-import org.tianocore.common.logger.EdkLog;\r
-import org.tianocore.pcd.entity.MemoryDatabaseManager;\r
+import org.apache.xmlbeans.XmlOptions;\r
 import org.tianocore.DbPathAndFilename;\r
 import org.tianocore.FrameworkDatabaseDocument;\r
 import org.tianocore.ModuleSurfaceAreaDocument;\r
@@ -41,12 +39,15 @@ import org.tianocore.build.id.FpdModuleIdentification;
 import org.tianocore.build.id.ModuleIdentification;\r
 import org.tianocore.build.id.PackageIdentification;\r
 import org.tianocore.build.id.PlatformIdentification;\r
-import org.tianocore.build.toolchain.ToolChainAttribute;\r
 import org.tianocore.build.toolchain.ToolChainConfig;\r
 import org.tianocore.build.toolchain.ToolChainElement;\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.common.definitions.ToolDefinitions;\r
+import org.tianocore.common.exception.EdkException;\r
+import org.tianocore.common.logger.EdkLog;\r
+import org.tianocore.pcd.entity.MemoryDatabaseManager;\r
 \r
 /**\r
   GlobalData provide initializing, instoring, querying and update global data.\r
@@ -132,6 +133,9 @@ 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<ModuleIdentification, ToolChainMap> msaBuildOption = new HashMap<ModuleIdentification, ToolChainMap>();\r
+    private static Map<ModuleIdentification, ToolChainMap> msaFamilyBuildOption = new HashMap<ModuleIdentification, ToolChainMap>();\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
@@ -171,14 +175,9 @@ public class GlobalData {
         // Parse Framework Database\r
         //\r
         File dbFile = new File(workspaceDir + File.separatorChar + workspaceDatabaseFile);\r
+        FrameworkDatabaseDocument db = null;\r
         try {\r
-            FrameworkDatabaseDocument db = (FrameworkDatabaseDocument) XmlObject.Factory.parse(dbFile);\r
-            //\r
-            // validate FrameworkDatabaseFile\r
-            //\r
-            if (!db.validate()) {\r
-                throw new EdkException("Framework Database file [" + dbFile.getPath() + "] format is invalid!");\r
-            }\r
+            db = (FrameworkDatabaseDocument)parseXmlFile(dbFile);\r
             //\r
             // Get package list\r
             //\r
@@ -201,7 +200,18 @@ public class GlobalData {
                     spdTable.put(spd.getPackageId(), spd);\r
                 }\r
             }\r
+        } catch(IOException ex) {\r
+            EdkException edkException = new EdkException("Parse of WORKSPACE Database file [" + dbFile.getPath() + "] failed!\n" + ex.getMessage());\r
+            edkException.setStackTrace(ex.getStackTrace());\r
+            throw edkException;\r
+        } catch(XmlException ex) {\r
+            EdkException edkException = new EdkException("Parse of WORKSPACE Database file [" + dbFile.getPath() + "] failed!\n" + ex.getMessage());\r
+            edkException.setStackTrace(ex.getStackTrace());\r
+            throw edkException;\r
+        }\r
 \r
+        File fpdFile = null;\r
+        try {\r
             //\r
             // Get platform list\r
             //\r
@@ -210,17 +220,11 @@ public class GlobalData {
                 Iterator<DbPathAndFilename> iter = platforms.iterator();\r
                 while (iter.hasNext()) {\r
                     String fileName = iter.next().getStringValue().trim();\r
-                    File fpdFile = new File(workspaceDir + File.separatorChar + fileName);\r
+                    fpdFile = new File(workspaceDir + File.separatorChar + fileName);\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
-                    if (!fpdDoc.validate()) {\r
-                        throw new EdkException("Framework Platform Surface Area file [" + fpdFile.getPath() + "] format is invalid!");\r
-                    }\r
+                    XmlObject fpdDoc = parseXmlFile(fpdFile);\r
                     //\r
                     // We can change Map to XmlObject\r
                     //\r
@@ -242,11 +246,11 @@ public class GlobalData {
                 }\r
             }\r
         } catch(IOException ex) {\r
-            EdkException edkException = new EdkException("Parse WORKSPACE Database file [" + dbFile.getPath() + "] Error.\n" + ex.getMessage());\r
+            EdkException edkException = new EdkException("Parse of platform definition file [" + fpdFile.getPath() + "] failed!\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 edkException = new EdkException("Parse of platform definition file [" + fpdFile.getPath() + "] failed!\n" + ex.getMessage());\r
             edkException.setStackTrace(ex.getStackTrace());\r
             throw edkException;\r
         }\r
@@ -414,13 +418,7 @@ public class GlobalData {
             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
-            if ( !doc.validate()){\r
-                throw new EdkException("Module Surface Area file [" + msaFile.getPath() + "] format is invalid!");\r
-            }\r
+            ModuleSurfaceAreaDocument doc = (ModuleSurfaceAreaDocument)parseXmlFile(msaFile);\r
             //\r
             // parse MSA file\r
             //\r
@@ -436,13 +434,14 @@ public class GlobalData {
             msaMap.put("Guids", cloneXmlObject(msa.getGuids(), true));\r
             msaMap.put("Externs", cloneXmlObject(msa.getExterns(), true));\r
             msaMap.put("PcdCoded", cloneXmlObject(msa.getPcdCoded(), true));\r
+            msaMap.put("ModuleBuildOptions", cloneXmlObject(msa.getModuleBuildOptions(), true));\r
             return msaMap;\r
         } catch(IOException ex) {\r
-            EdkException edkException = new EdkException("Parsing MSA file [" + msaFile.getPath() + "] error. \n" + ex.getMessage());\r
+            EdkException edkException = new EdkException("Parse of MSA file [" + msaFile.getPath() + "] failed!\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 edkException = new EdkException("Parse of MSA file [" + msaFile.getPath() + "] failed!\n" + ex.getMessage());\r
             edkException.setStackTrace(ex.getStackTrace());\r
             throw edkException;\r
         }\r
@@ -691,6 +690,7 @@ public class GlobalData {
             }\r
             toolChainInfo.addCommands(toolsDef.getConfigInfo().getCommands());\r
             toolChainInfo.normalize();\r
+\r
             EdkLog.log("Init", EdkLog.EDK_ALWAYS, "Current build tool chain information summary: ");\r
             EdkLog.log("Init", EdkLog.EDK_ALWAYS, toolChainInfo + "");\r
         }\r
@@ -714,12 +714,22 @@ public class GlobalData {
         ToolChainMap toolChainOption) {\r
         moduleToolChainFamilyOption.put(fpdModuleId, toolChainOption);\r
     }\r
-\r
-    public static boolean isCommandSet(String target, String toolchain, String arch) {\r
+    \r
+    public static void addMsaBuildOption(ModuleIdentification moduleId,\r
+        ToolChainMap toolChainOption) {\r
+        msaBuildOption.put(moduleId, toolChainOption);\r
+    }\r
+    \r
+    public static void addMsaFamilyBuildOption(ModuleIdentification moduleId,\r
+        ToolChainMap toolChainOption) {\r
+        msaFamilyBuildOption.put(moduleId, toolChainOption);\r
+    }\r
+    \r
+    public static boolean isCommandSet(String target, String toolchain, String arch) throws EdkException {\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
+            String cmdName = toolsDef.getConfig().get(new String[] {target, toolchain, arch, commands[i], ToolDefinitions.TOOLS_DEF_ATTRIBUTE_NAME});\r
             if (cmdName != null && cmdName.length() != 0) {\r
                 return true;\r
             }\r
@@ -728,158 +738,106 @@ public class GlobalData {
         return false;\r
     }\r
 \r
+    /**\r
+      Except FLAGS, all attribute are from TOOLS_DEF file. \r
+      \r
+      For FLAGS, information from four places, they are: \r
+      <pre>\r
+        1. tools_def.txt\r
+        2. MSA &lt;BuildOptions&gt;/&lt;Options&gt;\r
+        3. FPD &lt;BuildOptions&gt;/&lt;Options&gt;\r
+        4. FPD &lt;FrameworkModules&gt;/&lt;ModuleSaBuildOptions&gt;/&lt;Options&gt;\r
+      </pre>\r
+      \r
+      @param commandDescription Key: TARGET, TAGNAME, ARCH, COMMANDTYPE, ATTRIBUTE\r
+      @param fpdModuleId Module Identification with Arch\r
+      @return The corresponding String\r
+      @throws EdkException If build option definition error\r
+    **/\r
     public synchronized static String getCommandSetting(String[] commandDescription, FpdModuleIdentification fpdModuleId) throws EdkException {\r
         ToolChainKey toolChainKey = new ToolChainKey(commandDescription);\r
         ToolChainMap toolChainConfig = toolsDef.getConfig();\r
         String setting = null;\r
 \r
+        //\r
+        // Default in tools_def.txt\r
+        // \r
         setting = toolChainConfig.get(toolChainKey);\r
         if (setting == null) {\r
-          setting = "";\r
+            setting = "";\r
         }\r
-        if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolChainAttribute.FLAGS.toString())) {\r
+        if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FLAGS)) {\r
             return setting;\r
         }\r
 \r
+        Set<String> flagSet = new LinkedHashSet<String>();\r
+        flagSet.add(setting);\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.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
+        // Tool's option can be in .fpd and/or .msa file\r
+        //\r
+        String optionString;\r
+        ToolChainMap option = null;\r
+        ToolChainKey toolChainFamilyKey = new ToolChainKey(commandDescription);\r
 \r
-        return setting;\r
+        toolChainFamilyKey.setKey(ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FAMILY, ToolChainElement.ATTRIBUTE.value);\r
+        String family = toolChainConfig.get(toolChainFamilyKey);\r
+        toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value);\r
+        toolChainFamilyKey.setKey(ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FLAGS, ToolChainElement.ATTRIBUTE.value);\r
 \r
-/*\r
         //\r
-        // get module specific options, if any\r
+        // MSA's tool chain family option\r
         //\r
-        // tool tag first\r
-        ToolChainMap option = moduleToolChainOption.get(fpdModuleId);\r
-        ToolChainKey toolChainFamilyKey = null;\r
+        option = msaFamilyBuildOption.get(fpdModuleId.getModule());\r
+        if (option != null && (optionString = option.get(toolChainFamilyKey)) != null) {\r
+            flagSet.add(optionString);\r
+        }\r
         \r
-        if ((option == null) || (option != null && (setting = option.get(toolChainKey)) == null)) \r
-        {\r
-            //\r
-            // then tool chain family\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
-            option = moduleToolChainFamilyOption.get(fpdModuleId);\r
-            if (option != null) {\r
-                setting = option.get(toolChainFamilyKey);\r
-            }\r
+        //\r
+        // MSA's tool chain option\r
+        //\r
+        option = msaBuildOption.get(fpdModuleId.getModule());\r
+        if (option != null && (optionString = option.get(toolChainKey)) != null) {\r
+            flagSet.add(optionString);\r
         }\r
-\r
+        \r
         //\r
-        // get platform options, if any\r
+        // Platform's tool chain family option\r
         //\r
-        if (setting == null) {\r
-            // tool tag first\r
-            if (platformToolChainOption == null || (setting = platformToolChainOption.get(toolChainKey)) == null) {\r
-                // then tool chain family\r
-                if (toolChainFamilyKey == null) {\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
+        optionString = platformToolChainFamilyOption.get(toolChainFamilyKey);\r
+        if (optionString != null) {\r
+            flagSet.add(optionString);\r
+        }\r
 \r
-                setting = platformToolChainFamilyOption.get(toolChainFamilyKey);\r
-            }\r
+        //\r
+        // Platform's tool chain tag option\r
+        //\r
+        optionString = platformToolChainOption.get(toolChainKey);\r
+        if (optionString != null) {\r
+            flagSet.add(optionString);\r
         }\r
 \r
-        if (setting == null) {\r
-            setting = "";\r
+        //\r
+        // Module's tool chain family option\r
+        //\r
+        option = moduleToolChainFamilyOption.get(fpdModuleId);\r
+        if (option != null && (optionString = option.get(toolChainFamilyKey)) != null) {\r
+            flagSet.add(optionString);\r
         }\r
 \r
+        //\r
+        // Module's tool chain tag option\r
+        //\r
+        option = moduleToolChainOption.get(fpdModuleId);\r
+        if (option != null && (optionString = option.get(toolChainKey)) != null) {\r
+            flagSet.add(optionString);\r
+        }\r
+        \r
+        setting = "";\r
+        for(Iterator<String> iter = flagSet.iterator(); iter.hasNext();) {\r
+            setting += iter.next() +" ";\r
+        }\r
         return setting;\r
-*/\r
     }\r
 \r
     public static void setToolChainEnvInfo(ToolChainInfo envInfo) {\r
@@ -954,5 +912,29 @@ public class GlobalData {
 \r
         return pcdBuildDef;\r
     }\r
+\r
+    public static XmlObject parseXmlFile(File xmlFile) throws IOException, XmlException {\r
+        Collection errors = new ArrayList();            \r
+        XmlOptions opt = new XmlOptions();\r
+\r
+        opt.setLoadLineNumbers();\r
+        opt.setLoadMessageDigest();\r
+        opt.setErrorListener(errors);\r
+\r
+        XmlObject doc = XmlObject.Factory.parse(xmlFile, opt);\r
+        //\r
+        // Validate File if they accord with XML Schema\r
+        //\r
+        if (!doc.validate(opt)){\r
+            StringBuilder errorMessage = new StringBuilder(1024);\r
+            for (Iterator it = errors.iterator(); it.hasNext(); ) {\r
+                errorMessage.append(it.next());\r
+                errorMessage.append("\n");\r
+            }\r
+            throw new XmlException(errorMessage.toString());\r
+        }\r
+\r
+        return doc;\r
+    }\r
 }\r
 \r