Support MSA build options. Now the build options from four places: 1. tools_def.txt
authorwuyizhong <wuyizhong@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 18 Oct 2006 08:22:09 +0000 (08:22 +0000)
committerwuyizhong <wuyizhong@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 18 Oct 2006 08:22:09 +0000 (08:22 +0000)
2. MSA <ModuleBuildOptions>/<Options> 3. FPD <BuildOptions>/<Options> 4. FPD <FrameworkModules>/<ModuleSaBuildOptions>/<Options>. And we do not support "ABC", "XYZ" such format from now on, please only use the simple format like ABC XYZ.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1790 6f19259b-4bc3-4df7-8a09-765794883524

Tools/Java/Source/GenBuild/org/tianocore/build/GenBuildTask.java
Tools/Java/Source/GenBuild/org/tianocore/build/fpd/FpdParserForThread.java
Tools/Java/Source/GenBuild/org/tianocore/build/fpd/FpdParserTask.java
Tools/Java/Source/GenBuild/org/tianocore/build/global/GenBuildLogger.java
Tools/Java/Source/GenBuild/org/tianocore/build/global/GlobalData.java
Tools/Java/Source/GenBuild/org/tianocore/build/global/SurfaceAreaQuery.java
Tools/Java/Source/GenBuild/org/tianocore/build/toolchain/ToolChainMap.java

index 9a84717..389b8f1 100644 (file)
@@ -23,8 +23,6 @@ import java.util.List;
 import java.util.Map;\r
 import java.util.Set;\r
 import java.util.Vector;\r
-import java.util.regex.Matcher;\r
-import java.util.regex.Pattern;\r
 \r
 import org.apache.tools.ant.BuildException;\r
 import org.apache.tools.ant.BuildListener;\r
@@ -490,10 +488,6 @@ public class GenBuildTask extends Ant {
             String cmdFlags = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if (cmdFlags != null) \r
             {\r
-//              Set<String> addset = new LinkedHashSet<String>();\r
-//              Set<String> subset = new LinkedHashSet<String>();\r
-//              putFlagsToSet(addset, cmdFlags);\r
-//              getProject().setProperty(cmd[m] + "_FLAGS", getProject().replaceProperties(getFlags(addset, subset)));\r
               getProject().setProperty(cmd[m] + "_FLAGS", cmdFlags);\r
             } \r
             else \r
@@ -501,7 +495,6 @@ public class GenBuildTask extends Ant {
               getProject().setProperty(cmd[m] + "_FLAGS", "");\r
             }\r
 \r
-\r
             //\r
             // Set CC_EXT\r
             //\r
@@ -718,54 +711,6 @@ public class GenBuildTask extends Ant {
         ant.execute();\r
     }\r
 \r
-\r
-    /**\r
-      Separate the string and instore in set.\r
-\r
-      <p> String is separated by Java Regulation Expression\r
-      "[^\\\\]?(\".*?[^\\\\]\")[ \t,]+". </p>\r
-\r
-      <p>For example: </p>\r
-\r
-      <pre>\r
-        "/nologo", "/W3", "/WX"\r
-        "/C", "/DSTRING_DEFINES_FILE=\"BdsStrDefs.h\""\r
-      </pre>\r
-\r
-      @param set store the separated string\r
-      @param str string to separate\r
-    **/\r
-    private void putFlagsToSet(Set<String> set, String str) {\r
-        if (str == null || str.length() == 0) {\r
-            return;\r
-        }\r
-\r
-        Pattern myPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\r
-        Matcher matcher = myPattern.matcher(str + " ");\r
-        while (matcher.find()) {\r
-            String item = str.substring(matcher.start(1), matcher.end(1));\r
-            set.add(item);\r
-        }\r
-    }\r
-\r
-    /**\r
-      Generate the final flags string will be used by compile command.\r
-\r
-      @param add the add flags set\r
-      @param sub the sub flags set\r
-      @return final flags after add set substract sub set\r
-    **/\r
-    private String getFlags(Set<String> add, Set<String> sub) {\r
-        String result = "";\r
-        add.removeAll(sub);\r
-        Iterator iter = add.iterator();\r
-        while (iter.hasNext()) {\r
-            String str = (String) iter.next();\r
-            result += str.substring(1, str.length() - 1) + " ";\r
-        }\r
-        return result;\r
-    }\r
-\r
     public void setSingleModuleBuild(boolean isSingleModuleBuild) {\r
         this.isSingleModuleBuild = isSingleModuleBuild;\r
     }\r
index 93510a7..a2f22c1 100644 (file)
@@ -368,6 +368,13 @@ public class FpdParserForThread extends FpdParserTask {
             //\r
             GlobalData.addModuleToolChainOption(fpdModuleId, parseModuleBuildOptions(false));\r
             GlobalData.addModuleToolChainFamilyOption(fpdModuleId, parseModuleBuildOptions(true));\r
+            \r
+            //\r
+            // parse MSA build options\r
+            //\r
+            GlobalData.addMsaBuildOption(moduleId, parseMsaBuildOptions(false));\r
+            GlobalData.addMsaFamilyBuildOption(moduleId, parseMsaBuildOptions(true));\r
+\r
             saq.pop();\r
         }\r
     }\r
index d45abcd..2837979 100644 (file)
@@ -516,6 +516,13 @@ public class FpdParserTask extends Task {
             //\r
             GlobalData.addModuleToolChainOption(fpdModuleId, parseModuleBuildOptions(false));\r
             GlobalData.addModuleToolChainFamilyOption(fpdModuleId, parseModuleBuildOptions(true));\r
+            \r
+            //\r
+            // parse MSA build options\r
+            //\r
+            GlobalData.addMsaBuildOption(moduleId, parseMsaBuildOptions(false));\r
+            GlobalData.addMsaFamilyBuildOption(moduleId, parseMsaBuildOptions(true));\r
+    \r
             saq.pop();\r
         }\r
     }\r
@@ -536,6 +543,14 @@ public class FpdParserTask extends Task {
         return parseOptions(options);\r
     }\r
 \r
+    ToolChainMap parseMsaBuildOptions(boolean toolChainFamilyFlag) throws EdkException {\r
+        String[][] options = saq.getMsaBuildOptions(toolChainFamilyFlag);\r
+        if (options == null || options.length == 0) {\r
+            return new ToolChainMap();\r
+        }\r
+        return parseOptions(options);\r
+    }\r
+    \r
     private ToolChainMap parseOptions(String[][] options) throws EdkException {\r
         ToolChainMap map = new ToolChainMap();\r
         int flagIndex = ToolChainElement.ATTRIBUTE.value;\r
index 18ef849..b1e119a 100644 (file)
@@ -45,11 +45,6 @@ public class GenBuildLogger extends DefaultLogger implements LogMethod {
     \r
     Project project = null;\r
     \r
-    ///\r
-    /// Time of the start of the build \r
-    ///\r
-    private long startTime = System.currentTimeMillis();\r
-    \r
     ///\r
     /// flag to present whether cache all msg or not\r
     /// true means to cache.\r
index 310381b..bf4cd43 100644 (file)
@@ -24,8 +24,6 @@ import java.util.Iterator;
 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
@@ -132,7 +130,10 @@ 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 Pattern flagPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\r
+    private static Map<ModuleIdentification, ToolChainMap> msaBuildOption = new HashMap<ModuleIdentification, ToolChainMap>();\r
+    private static Map<ModuleIdentification, ToolChainMap> msaFamilyBuildOption = new HashMap<ModuleIdentification, ToolChainMap>();\r
+\r
+//    private static Pattern flagPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\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
@@ -437,6 +438,7 @@ 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
@@ -715,7 +717,17 @@ public class GlobalData {
         ToolChainMap toolChainOption) {\r
         moduleToolChainFamilyOption.put(fpdModuleId, toolChainOption);\r
     }\r
-\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) {\r
         String[] commands = getToolChainInfo().getCommands();\r
 \r
@@ -729,6 +741,22 @@ 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
@@ -746,7 +774,7 @@ public class GlobalData {
         }\r
 \r
         //\r
-        // tool's option can be in .fpd and/or .msa file\r
+        // Tool's option can be in .fpd and/or .msa file\r
         //\r
         String optionString;\r
         ToolChainMap option = null;\r
@@ -757,6 +785,22 @@ public class GlobalData {
         toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value);\r
         toolChainFamilyKey.setKey(ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FLAGS, ToolChainElement.ATTRIBUTE.value);\r
 \r
+        //\r
+        // MSA's tool chain family option\r
+        //\r
+        option = msaFamilyBuildOption.get(fpdModuleId.getModule());\r
+        if (option != null && (optionString = option.get(toolChainFamilyKey)) != null) {\r
+            setting += (" " + optionString);\r
+        }\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
+            setting += (" " + optionString);\r
+        }\r
+        \r
         //\r
         // Platform's tool chain family option\r
         //\r
@@ -770,10 +814,7 @@ public class GlobalData {
         //\r
         optionString = platformToolChainOption.get(toolChainKey);\r
         if (optionString != null) {\r
-            Matcher matcher = flagPattern.matcher(optionString + " ");\r
-            while (matcher.find()) {\r
-                setting += (" " + optionString.substring(matcher.start(1), matcher.end(1)));\r
-            }\r
+            setting += (" " + optionString);\r
         }\r
 \r
         //\r
@@ -781,10 +822,7 @@ public class GlobalData {
         //\r
         option = moduleToolChainFamilyOption.get(fpdModuleId);\r
         if (option != null && (optionString = option.get(toolChainFamilyKey)) != null) {\r
-            Matcher matcher = flagPattern.matcher(optionString + " ");\r
-            while (matcher.find()) {\r
-                setting += (" " + optionString.substring(matcher.start(1), matcher.end(1)));\r
-            }\r
+            setting += (" " + optionString);\r
         }\r
 \r
         //\r
@@ -792,10 +830,7 @@ public class GlobalData {
         //\r
         option = moduleToolChainOption.get(fpdModuleId);\r
         if (option != null && (optionString = option.get(toolChainKey)) != null) {\r
-            Matcher matcher = flagPattern.matcher(optionString + " ");\r
-            while (matcher.find()) {\r
-                setting += (" " + optionString.substring(matcher.start(1), matcher.end(1)));\r
-            }\r
+            setting += (" " + optionString);\r
         }\r
 \r
         return setting;\r
index 6afeb30..b927560 100644 (file)
@@ -492,6 +492,22 @@ public class SurfaceAreaQuery {
 \r
         return getOptions("PlatformSurfaceArea", xPath, toolChainFamilyFlag);\r
     }\r
+    \r
+    public String[][] getMsaBuildOptions(boolean toolChainFamilyFlag) {\r
+        String[] xPath;\r
+        \r
+        if (toolChainFamilyFlag == true) {\r
+            xPath = new String[] {\r
+                    "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",\r
+                    "/Options/Option[@ToolChainFamily]", };\r
+        } else {\r
+            xPath = new String[] {\r
+                    "/Options/Option[not(@ToolChainFamily) and not(@TagName)]",\r
+                    "/Options/Option[@TagName]", };\r
+        }\r
+\r
+        return getOptions("ModuleBuildOptions", xPath, toolChainFamilyFlag);\r
+    }\r
 \r
     public ToolChainInfo getFpdToolChainInfo() {\r
         String[] xPath = new String[] { "/PlatformDefinitions" };\r
index f3f0779..18e664c 100644 (file)
@@ -320,5 +320,9 @@ public class ToolChainMap {
     public Set<ToolChainKey> keySet() {\r
         return (Set<ToolChainKey>)map.keySet();\r
     }\r
+    \r
+    public String toString() {\r
+        return map + "";\r
+    }\r
 }\r
 \r