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
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
getProject().setProperty(cmd[m] + "_FLAGS", "");\r
}\r
\r
-\r
//\r
// Set CC_EXT\r
//\r
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
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
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
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
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
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 <BuildOptions>/<Options>\r
+ 3. FPD <BuildOptions>/<Options>\r
+ 4. FPD <FrameworkModules>/<ModuleSaBuildOptions>/<Options>\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
}\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
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
//\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
//\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
//\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