-package net.sf.antcontrib.cpptasks.userdefine;\r
-\r
-import java.io.File;\r
-import java.util.Iterator;\r
-import java.util.StringTokenizer;\r
-import java.util.Vector;\r
-\r
-import net.sf.antcontrib.cpptasks.CCTask;\r
-import net.sf.antcontrib.cpptasks.CUtil;\r
-import net.sf.antcontrib.cpptasks.types.CommandLineArgument;\r
-import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;\r
-import net.sf.antcontrib.cpptasks.types.LibrarySet;\r
-\r
-import org.apache.tools.ant.BuildException;\r
-import org.apache.tools.ant.DirectoryScanner;\r
-import org.apache.tools.ant.Project;\r
/*\r
* \r
* Copyright 2001-2004 The Ant-Contrib project\r
* See the License for the specific language governing permissions and\r
* limitations under the License.\r
*/\r
+package net.sf.antcontrib.cpptasks.userdefine;\r
+\r
+import java.io.File;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashSet;\r
+import java.util.Set;\r
+import java.util.StringTokenizer;\r
+import java.util.Vector;\r
+\r
+import net.sf.antcontrib.cpptasks.CCTask;\r
+import net.sf.antcontrib.cpptasks.CUtil;\r
+import net.sf.antcontrib.cpptasks.types.CommandLineArgument;\r
+import net.sf.antcontrib.cpptasks.types.ConditionalFileSet;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+import org.apache.tools.ant.DirectoryScanner;\r
+import org.apache.tools.ant.Project;\r
+\r
public class CommandLineUserDefine {\r
\r
- String command;\r
- \r
- /*\r
- * The follows variable set at child class.\r
- */\r
- String includeFileFlag = null;\r
- String entryPointFlag = null;\r
- String subSystemFlag = null;\r
- String mapFlag = null;\r
- String pdbFlag = null;\r
- String outputFileFlag = null;\r
String includePathDelimiter = null;\r
\r
- /*\r
- * get lib string if Vendor = "gcc", it should respectively aadd "-(" and ")-" \r
- * at library set before and end. This value set at userDefineCompiler class.\r
- */\r
- Vector<String> libSetList = new Vector<String>();\r
- Vector<String> fileList = new Vector<String>();\r
+ String outputDelimiter = null;\r
+ \r
public void command(CCTask cctask, UserDefineDef userdefine){\r
File workdir;\r
- File outdir;\r
Project project = cctask.getProject();\r
if(userdefine.getWorkdir() == null) {\r
workdir = new File(".");\r
workdir = userdefine.getWorkdir();\r
} \r
\r
- /*\r
- * generate cmdline= command + args + includepath + endargs + outfile\r
- */ \r
+ //\r
+ // generate cmdline= command + args + includepath + endargs + outfile\r
+ // \r
Vector args = new Vector();\r
Vector argsWithoutSpace = new Vector();\r
Vector endargs = new Vector();\r
Vector endargsWithoutSpace = new Vector();\r
Vector includePath = new Vector();\r
\r
- /*\r
- * Generate cmdline = command + \r
- * general args + \r
- * outputflag + outputfile\r
- * subsystemFlag + subsystemValue +\r
- * includeFlag + includeFile +\r
- * includeFileincludpath + \r
- * entryPointFlag + entryPointValue +\r
- * mapFlag + mapValue +\r
- * pdbFlag + pdbValue +\r
- * endargs + \r
- * \r
- * \r
- */\r
- /*\r
- * get Args.\r
- */\r
+ //\r
+ // Generate cmdline = command + \r
+ // general args + \r
+ // outputflag + outputfile\r
+ // includpath + \r
+ // endargs + \r
+ // \r
+ \r
+ //\r
+ // get Args.\r
+ //\r
CommandLineArgument[] argument = userdefine.getActiveProcessorArgs();\r
for (int j = 0; j < argument.length; j++) {\r
if (argument[j].getLocation() == 0) {\r
endargs.addElement(argument[j].getValue());\r
}\r
}\r
- /*\r
- * get include path.\r
- */\r
+ \r
+ //\r
+ // get include path.\r
+ //\r
String[] incPath = userdefine.getActiveIncludePaths();\r
for (int j = 0; j < incPath.length; j++) {\r
if(incPath[j].indexOf(' ') >= 0) {\r
includePath.addElement( includePathDelimiter + incPath[j]);\r
}\r
}\r
- /*\r
- * Remove space in args and endargs.\r
- */\r
+ \r
+ //\r
+ // Remove space in args and endargs.\r
+ //\r
for ( int i=0; i < args.size(); i++) {\r
String str = (String)args.get(i);\r
- StringTokenizer st = new StringTokenizer(str);\r
+ StringTokenizer st = new StringTokenizer(str, " \t");\r
while(st.hasMoreTokens()) {\r
argsWithoutSpace.addElement(st.nextToken());\r
}\r
}\r
for ( int i=0; i < endargs.size(); i++) {\r
String str = (String)endargs.get(i);\r
- StringTokenizer st = new StringTokenizer(str);\r
+ StringTokenizer st = new StringTokenizer(str, " \t");\r
while(st.hasMoreTokens()) {\r
endargsWithoutSpace.addElement(st.nextToken());\r
}\r
}\r
\r
int cmdLen = 0;\r
- if(userdefine.getOutdir() == null) {\r
- outdir = new File(".");\r
- /*\r
- * command + args + endargs + includepath + sourcefile\r
- */\r
- cmdLen = 1 + argsWithoutSpace.size() + endargsWithoutSpace.size() + includePath.size() + 1;\r
- }\r
- else {\r
- outdir = userdefine.getOutdir();\r
- /*\r
- * command + args + endargs + includepath + sourcefile + outfile\r
- */\r
- cmdLen = 1 + argsWithoutSpace.size() + endargsWithoutSpace.size() + includePath.size() + 2;\r
- }\r
- if (includeFileFlag != null && includeFileFlag.trim().length() > 0){\r
- cmdLen++;\r
- }\r
- if (entryPointFlag != null && entryPointFlag.trim().length() > 0){\r
- cmdLen++;\r
- }\r
- if (subSystemFlag != null && subSystemFlag.trim().length() > 0){\r
- cmdLen++;\r
- }\r
- if (mapFlag != null && mapFlag.trim().length() > 0){\r
- cmdLen++;\r
- }\r
- if (pdbFlag != null && pdbFlag.trim().length() > 0){\r
- cmdLen++;\r
- }\r
- if (libSetList != null && libSetList.size() > 0){\r
- cmdLen = cmdLen + libSetList.size();\r
- }\r
- if (fileList != null){\r
- cmdLen = cmdLen + fileList.size();\r
+ //\r
+ // command + args + endargs + includepath + sourcefile\r
+ //\r
+ cmdLen = 1 + argsWithoutSpace.size() + endargsWithoutSpace.size() + includePath.size() + 1;\r
+ String[] libSet = userdefine.get_libset();\r
+ if (libSet != null && libSet.length > 0){\r
+ cmdLen = cmdLen + libSet.length;\r
}\r
- /*\r
- * In gcc the "cr" flag should follow space then add outputfile name, otherwise\r
- * it will pop error. \r
- */\r
- if (outputFileFlag != null && outputFileFlag.trim().length() > 0){\r
- if (outputFileFlag.trim().equalsIgnoreCase("-cr")){\r
+\r
+ //\r
+ // In gcc the "cr" flag should follow space then add outputfile name, otherwise\r
+ // it will pop error. \r
+ // TBD\r
+ if (outputDelimiter != null && userdefine.getOutputFile() != null && outputDelimiter.trim().length() > 0){\r
+ if (outputDelimiter.trim().equalsIgnoreCase("-cr")){\r
cmdLen = cmdLen + 2;\r
}else {\r
cmdLen++;\r
}\r
- \r
}\r
- /*\r
- * for every source file\r
- * if file is header file, just skip it (add later)\r
- */\r
+ \r
+ //\r
+ // for every source file\r
+ // if file is header file, just skip it (add later)\r
+ //\r
Vector srcSets = userdefine.getSrcSets();\r
- if (srcSets.size() == 0) {\r
- String[] cmd = new String[cmdLen - 1];\r
- int index = 0;\r
- cmd[index++] = this.command;\r
- \r
- \r
- \r
- Iterator iter = argsWithoutSpace.iterator();\r
- while (iter.hasNext()) {\r
- cmd[index++] = project.replaceProperties((String)iter.next());\r
- //cmd[index++] = (String)iter.next();\r
- }\r
- \r
- iter = endargsWithoutSpace.iterator();\r
- while (iter.hasNext()) {\r
- cmd[index++] = (String)iter.next();\r
- }\r
- \r
- /*\r
- * "OutputFlag + outputFile" as first option follow command.exe.\r
- */\r
- if (outputFileFlag != null && outputFileFlag.trim().length() > 0){\r
- if (outputFileFlag.trim().equalsIgnoreCase("-cr")){\r
- cmd[index++] = outputFileFlag;\r
- cmd[index++] = userdefine.getOutputFile();\r
- }else {\r
- cmd[index++] = outputFileFlag + userdefine.getOutputFile();\r
- }\r
- }\r
- \r
- /*\r
- * Add fileList to cmd \r
- */\r
- if (fileList != null && fileList.size()> 0){\r
- for (int i = 0; i < fileList.size(); i++){\r
- cmd[index++] = fileList.get(i);\r
- }\r
- }\r
- \r
- if (subSystemFlag != null && subSystemFlag.trim().length() > 0){\r
- cmd[index++] = subSystemFlag + userdefine.getSubSystemvalue();\r
- }\r
- if (includeFileFlag != null && includeFileFlag.trim().length() > 0){\r
- cmd[index++] = includeFileFlag + userdefine.getIncludeFile();\r
- }\r
- \r
- iter = includePath.iterator();\r
- while (iter.hasNext()) {\r
- cmd[index++] = (String)iter.next();\r
- }\r
- \r
- if (entryPointFlag != null && entryPointFlag.trim().length() > 0){\r
- //\r
- // If GCC link use __ModuleEntrypoint instead of _ModuleEntryPoint;\r
- //\r
- if (entryPointFlag.equalsIgnoreCase("-e")){\r
- cmd[index++] = entryPointFlag + "_" + userdefine.getEntryPointvalue();\r
- } else {\r
- cmd[index++] = entryPointFlag + userdefine.getEntryPointvalue();\r
- }\r
- \r
- }\r
- if (mapFlag != null && mapFlag.trim().length() > 0){\r
- cmd[index++] = mapFlag + userdefine.getMapvalue();\r
- }\r
- if (pdbFlag != null && pdbFlag.trim().length() > 0){\r
- cmd[index++] = pdbFlag + userdefine.getPdbvalue();\r
- }\r
-\r
- if (userdefine.getOutdir() != null){\r
- // will add code to generate outfile name and flag\r
- cmd[index++] = "/nologo";\r
- }\r
- \r
- if (libSetList != null && libSetList.size() > 0){\r
- for (int i = 0; i < libSetList.size(); i++){\r
- cmd[index++] = libSetList.get(i);\r
- }\r
- }\r
-\r
- // execute the command\r
- int retval = runCommand(cctask, workdir, cmd);\r
- // if with monitor, add more code\r
- if (retval != 0) {\r
- throw new BuildException(this.command\r
- + " failed with return code " + retval,\r
- cctask.getLocation());\r
- }\r
- }\r
+// System.out.println("##" + userdefine.getSrcSets());\r
\r
//\r
// if have source file append source file in command land.\r
//\r
+ Set allSrcFiles = new LinkedHashSet();\r
for (int i = 0; i < srcSets.size(); i++) {\r
ConditionalFileSet srcSet = (ConditionalFileSet) srcSets\r
.elementAt(i);\r
// Check each source file - see if it needs compilation\r
String[] fileNames = scanner.getIncludedFiles();\r
for (int j = 0; j < fileNames.length; j++){\r
- String[] cmd = new String[cmdLen];\r
- int index = 0;\r
- cmd[index++] = this.command;\r
- \r
- \r
- \r
- Iterator iter = argsWithoutSpace.iterator();\r
- while (iter.hasNext()) {\r
- cmd[index++] = (String)iter.next();\r
- }\r
- \r
- iter = endargsWithoutSpace.iterator();\r
- while (iter.hasNext()) {\r
- cmd[index++] = (String)iter.next();\r
- }\r
- \r
- /*\r
- * Add outputFileFlag and output file to cmd\r
- */\r
- if (outputFileFlag != null && outputFileFlag.length()> 0){\r
- if (outputFileFlag.trim().equalsIgnoreCase("-cr")){\r
- cmd[index++] = outputFileFlag;\r
- cmd[index++] = userdefine.getOutputFile();\r
- }else {\r
- cmd[index++] = outputFileFlag + userdefine.getOutputFile();\r
- }\r
- }\r
- \r
- /*\r
- * Add fileList to cmd \r
- */\r
- if (fileList != null && fileList.size()> 0){\r
- for (int s = 0; s < fileList.size(); s++){\r
- cmd[index++] = fileList.get(s);\r
- }\r
- }\r
- if (subSystemFlag != null && subSystemFlag.length()> 0){\r
- cmd[index++] = subSystemFlag + userdefine.getSubSystemvalue();\r
- }\r
- if (includeFileFlag != null && includeFileFlag.length()> 0){\r
- cmd[index++] = includeFileFlag + userdefine.getIncludeFile();\r
- }\r
- \r
- iter = includePath.iterator();\r
- while (iter.hasNext()) {\r
- cmd[index++] = (String)iter.next();\r
- }\r
- if (userdefine.getOutdir() != null){\r
- // will add code to generate outfile name and flag\r
- cmd[index++] = "/nologo";\r
- }\r
- \r
- if (entryPointFlag != null && entryPointFlag.length()> 0){\r
- cmd[index++] = entryPointFlag + userdefine.getEntryPointvalue();\r
- }\r
- if (mapFlag != null && mapFlag.length() > 0){\r
- cmd[index++] = mapFlag + userdefine.getMapvalue();\r
- }\r
- if (pdbFlag != null && pdbFlag.length() > 0){\r
- cmd[index++] = pdbFlag + userdefine.getPdbvalue();\r
- }\r
- \r
- if (libSetList != null && libSetList.size() > 0){\r
- for (int k = 0; k < libSetList.size(); k++){\r
- cmd[index++] = libSetList.get(k);\r
- }\r
- }\r
- \r
// execute the command\r
- cmd[index++] = scanner.getBasedir() + "/" + fileNames[j];\r
- for (int k = 0; k < cmd.length; k++){\r
- }\r
- int retval = runCommand(cctask, workdir, cmd);\r
- // if with monitor, add more code\r
- if (retval != 0) {\r
- throw new BuildException(this.command\r
- + " failed with return code " + retval,\r
- cctask.getLocation());\r
- }\r
+ allSrcFiles.add(scanner.getBasedir() + "/" + fileNames[j]);\r
}\r
}\r
}\r
+\r
+ String[] fileNames = (String[])allSrcFiles.toArray(new String[allSrcFiles.size()]);\r
+ String[] cmd = new String[cmdLen - 1 + fileNames.length];\r
+ int index = 0;\r
+ cmd[index++] = userdefine.getCmd();\r
+ \r
+ Iterator iter = argsWithoutSpace.iterator();\r
+ while (iter.hasNext()) {\r
+ cmd[index++] = project.replaceProperties((String)iter.next());\r
+ }\r
+ \r
+ iter = endargsWithoutSpace.iterator();\r
+ while (iter.hasNext()) {\r
+ cmd[index++] = project.replaceProperties((String)iter.next());\r
+ }\r
+ \r
+ //\r
+ // Add outputFileFlag and output file to cmd\r
+ //\r
+ if (outputDelimiter != null && userdefine.getOutputFile() != null && outputDelimiter.length()> 0){\r
+ if (outputDelimiter.trim().equalsIgnoreCase("-cr")){\r
+ cmd[index++] = outputDelimiter;\r
+ cmd[index++] = userdefine.getOutputFile();\r
+ }else {\r
+ cmd[index++] = outputDelimiter + userdefine.getOutputFile();\r
+ }\r
+ }\r
+ \r
+ iter = includePath.iterator();\r
+ while (iter.hasNext()) {\r
+ cmd[index++] = (String)iter.next();\r
+ }\r
+ \r
+ if (libSet != null && libSet.length > 0){\r
+ for (int k = 0; k < libSet.length ; k++){\r
+ cmd[index++] = libSet[k];\r
+ }\r
+ }\r
+ for (int j = 0; j < fileNames.length; j++){\r
+ // execute the command\r
+ cmd[index++] = fileNames[j];\r
+ }\r
+ \r
+ int retval = runCommand(cctask, workdir, cmd);\r
+ // if with monitor, add more code\r
+ if (retval != 0) {\r
+ throw new BuildException(userdefine.getCmd()\r
+ + " failed with return code " + retval,\r
+ cctask.getLocation());\r
+ }\r
}\r
\r
protected int runCommand(CCTask task, File workingDir, String[] cmdline)\r
throw new org.apache.tools.ant.BuildException(\r
"Not an actual task, but looks like one for documentation purposes");\r
}\r
-\r
}\r
*/\r
package net.sf.antcontrib.cpptasks.userdefine;\r
\r
-import org.apache.tools.ant.Project;\r
-\r
import net.sf.antcontrib.cpptasks.CCTask;\r
-import org.tianocore.build.toolchain.*;\r
\r
public class UserDefineCompiler extends CommandLineUserDefine {\r
\r
public UserDefineCompiler(CCTask cctask, UserDefineDef userdefineDef) {\r
- String arch = null;\r
- String os = null;\r
- String vendor = null;\r
- String commandType = null;\r
- Project project = cctask.getProject();\r
- // get command string\r
- if (cctask.getArch() == null) {\r
- arch = project.getProperty("ARCH");\r
- if (arch == null) {\r
- arch = System.getProperty("os.arch");\r
- }\r
- } else {\r
- arch = cctask.getArch();\r
- }\r
- arch = arch.toUpperCase();\r
- if (cctask.getOs() == null) {\r
- os = project.getProperty("OS");\r
- if (os == null) {\r
- os = System.getProperty("os.name");\r
- }\r
+ String cmdType = userdefineDef.getType();\r
+ String toolchainFamily = userdefineDef.getFamily();\r
+ UserDefineMapping mapping = new UserDefineMapping();\r
+ \r
+ if (userdefineDef.getIncludepathDelimiter() == null) {\r
+ includePathDelimiter = mapping.getIncludePathDelimiter(toolchainFamily, cmdType); \r
} else {\r
- os = cctask.getOs();\r
- }\r
-\r
- commandType = userdefineDef.getType();\r
-\r
- if (commandType != null) {\r
- if (ToolChainFactory.getValue(arch + "_" + commandType + "_VENDOR") != null\r
- && ToolChainFactory.getValue(\r
- arch + "_" + commandType + "_VENDOR").trim()\r
- .length() > 0) {\r
- vendor = ToolChainFactory.getValue(arch + "_" + commandType\r
- + "_VENDOR");\r
- } else if (ToolChainFactory.getValue(arch + "_VENDOR") != null) {\r
- vendor = ToolChainFactory.getValue(arch + "_VENDOR");\r
- }\r
- }\r
-\r
- // look if ARCH_VENDOR_OS_COMMANDTYPE is existed\r
- if (arch != null && vendor != null && os != null && commandType != null) {\r
- command = project.getProperty(arch + "_" + vendor + "_" + os + "_"\r
- + commandType);\r
- }\r
- // look if ARCH_VENDOR_COMMANDTYPE is existed\r
- if (command == null) {\r
- if (arch != null && vendor != null && commandType != null) {\r
- command = project.getProperty(arch + "_" + vendor + "_"\r
- + commandType);\r
- }\r
- }\r
- // look if ARCH_COMMANDTYPE is existed\r
- if (command == null) {\r
- if (arch != null && commandType != null) {\r
- command = project.getProperty(arch + "_" + commandType);\r
- }\r
- }\r
- // look if COMMANDTYPE is existed\r
- if (command == null) {\r
- if (commandType != null) {\r
- command = project.getProperty(commandType);\r
- }\r
- }\r
- // using the default value from VENDOR_OS_COMMANDTYPE or\r
- // VENDOR_COMMANDTYPE\r
- if (command == null) {\r
- if (vendor != null && os != null && commandType != null) {\r
- String str = vendor + "_" + os + "_" + commandType;\r
- command = UserDefineMapping.getDefaultCommand(str);\r
- }\r
- }\r
- // VENDOR_COMMANDTYPE\r
- if (command == null) {\r
- if (vendor != null && commandType != null) {\r
- String str = vendor + "_" + commandType;\r
- command = UserDefineMapping.getDefaultCommand(str);\r
- }\r
- }\r
- // just give the name whatever\r
- if (command == null) {\r
- command = "cl";\r
- }\r
-\r
- // initialize the includePathDelimiter\r
- if (userdefineDef.getIncludepathDelimiter() != null) {\r
includePathDelimiter = userdefineDef.getIncludepathDelimiter();\r
}\r
- // else find VENDOR\r
- else {\r
- if (vendor != null) {\r
- includePathDelimiter = UserDefineMapping\r
- .getIncludePathDelimiter(vendor, commandType);\r
- }\r
- }\r
- if (includePathDelimiter == null) {\r
- includePathDelimiter = "-I";\r
- }\r
- /*\r
- * Set libSet.\r
- */\r
- if (userdefineDef.getLibSet() != null\r
- && userdefineDef.getLibSet().size() > 0) {\r
- String[] libList;\r
- if (vendor.equalsIgnoreCase("GCC")) {\r
- libSetList.add("-(");\r
- for (int i = 0; i < userdefineDef.getLibSet().size(); i++) {\r
- libList = userdefineDef.getLibSet().get(i).getLibs();\r
- for (int j = 0; j < libList.length; j++) {\r
- libSetList.add(libList[j]);\r
- }\r
- }\r
- libSetList.add("-)");\r
- } else {\r
- for (int i = 0; i < userdefineDef.getLibSet().size(); i++) {\r
- libList = userdefineDef.getLibSet().get(i).getLibs();\r
- for (int j = 0; j < libList.length; j++) {\r
- libSetList.add(libList[j]);\r
- }\r
- }\r
- }\r
- }\r
- /*\r
- * set includeFileFlag\r
- */\r
- if (userdefineDef.getIncludeFile() != null) {\r
- if (userdefineDef.getIncludeFileFlag() != null) {\r
- includeFileFlag = userdefineDef.getIncludeFileFlag();\r
- } else {\r
- includeFileFlag = UserDefineMapping.getCompellingIncFileFlag(\r
- vendor, commandType);\r
- }\r
- }\r
- /*\r
- * set entryPointFlag\r
- */\r
- if (userdefineDef.getEntryPointvalue() != null) {\r
- if (userdefineDef.getEntryPointFlag() != null) {\r
- entryPointFlag = userdefineDef.getEntryPointFlag();\r
- } else {\r
- entryPointFlag = UserDefineMapping.getEntryPointFlag(vendor,\r
- commandType);\r
- }\r
- }\r
- /*\r
- * set subSystemFlag\r
- */\r
- if (userdefineDef.getSubSystemvalue() != null) {\r
- if (userdefineDef.getSubSystemFlag() != null) {\r
- subSystemFlag = userdefineDef.getSubSystemFlag();\r
- } else {\r
- subSystemFlag = UserDefineMapping.getSubSystemFlag(vendor,\r
- commandType);\r
- }\r
- }\r
- /*\r
- * set mapFlag\r
- */\r
- if (userdefineDef.getMapvalue() != null) {\r
- if (userdefineDef.getMapFlag() != null) {\r
- mapFlag = userdefineDef.getMapFlag();\r
- } else {\r
- mapFlag = UserDefineMapping.getMapFlag(vendor, commandType);\r
- }\r
- }\r
- /*\r
- * set pdbFlag\r
- */\r
- if (userdefineDef.getPdbvalue() != null) {\r
- if (userdefineDef.getPdbFlag() != null) {\r
- pdbFlag = userdefineDef.getPdbFlag();\r
- } else {\r
- pdbFlag = UserDefineMapping.getPdbFlag(vendor, commandType);\r
- }\r
- }\r
- /*\r
- * set outputFileFlag\r
- */\r
- if (userdefineDef.getOutputFile() != null) {\r
- if (userdefineDef.getOutPutFlag() != null) {\r
- outputFileFlag = userdefineDef.getOutPutFlag();\r
- } else {\r
- outputFileFlag = UserDefineMapping.getOutputFileFlag(vendor,\r
- arch, commandType);\r
- }\r
- }\r
-\r
- /*\r
- * set fileList\r
- */\r
- if (userdefineDef.getFileList() != null) {\r
- fileList = userdefineDef.getFileList();\r
+ \r
+ if (userdefineDef.getOutputDelimiter() == null) {\r
+ outputDelimiter = mapping.getOutputFileFlag(toolchainFamily, cmdType);\r
+ } else {\r
+ outputDelimiter = userdefineDef.getOutputDelimiter();\r
}\r
+ \r
}\r
}\r
import java.io.BufferedReader;\r
import java.io.File;\r
import java.io.FileReader;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashSet;\r
+import java.util.Set;\r
import java.util.Vector;\r
\r
import org.apache.tools.ant.BuildException;\r
import org.apache.tools.ant.Project;\r
-import org.apache.tools.ant.types.FileList;\r
-import org.apache.tools.ant.types.FileSet;\r
-\r
-import sun.nio.cs.ext.TIS_620;\r
\r
import net.sf.antcontrib.cpptasks.ProcessorDef;\r
-import net.sf.antcontrib.cpptasks.types.AslcompilerArgument;\r
import net.sf.antcontrib.cpptasks.types.ConditionalPath;\r
import net.sf.antcontrib.cpptasks.types.IncludePath;\r
import net.sf.antcontrib.cpptasks.types.LibrarySet;\r
public UserDefineDef () {}\r
\r
private String type = "CC";\r
+ \r
+ private String family = "MSFT";\r
+ \r
+ private String cmd;\r
+ \r
private String includepathDelimiter;\r
\r
- private File outdir;\r
+ private String outputDelimiter;\r
+ \r
private File workdir;\r
-\r
- private String inputSuffix;\r
- private String outputSuffix;\r
\r
- private Vector<IncludePath> includePaths= new Vector<IncludePath>();\r
- private Vector<FileList> fileSetList = new Vector<FileList>();\r
+ private Vector includePaths= new Vector();\r
\r
- /**\r
- * New adding for support GCC toolchain.\r
- * Most of those only have one value for example :\r
- * entryPoint, mapFile, pdbFile, define those as element because \r
- * if attribut too much the command line is not good-lookinng.\r
- */\r
+ private String outputFile;\r
+ \r
+ private Vector _libset = new Vector();\r
\r
- private Vector<UserDefineElement> includeFiles = new Vector<UserDefineElement>();\r
- private Vector<UserDefineElement> outPutFiles = new Vector<UserDefineElement>();\r
- private Vector<UserDefineElement> subSystem = new Vector<UserDefineElement>();\r
- private Vector<UserDefineElement> entryPoint = new Vector<UserDefineElement>();\r
- private Vector<UserDefineElement> map = new Vector<UserDefineElement>();\r
- private Vector<UserDefineElement> pdb = new Vector<UserDefineElement>();\r
- private Vector<LibrarySet> libSet = new Vector<LibrarySet>();\r
+ public void addLibset(LibrarySet libset) {\r
+ if (isReference()) {\r
+ throw noChildrenAllowed();\r
+ }\r
+ if (libset == null) {\r
+ throw new NullPointerException("libset");\r
+ }\r
+ \r
+ _libset.add(libset);\r
+ }\r
\r
public void execute() throws org.apache.tools.ant.BuildException {\r
throw new org.apache.tools.ant.BuildException(\r
this.includepathDelimiter = includepathDelimiter;\r
}\r
\r
- public String getInputSuffix() {\r
+ public String getType() {\r
if (isReference()) {\r
return ((UserDefineDef) getCheckedRef(UserDefineDef.class,\r
- "UserDefineDef")).getInputSuffix();\r
+ "UserDefineDef")).getType();\r
}\r
- return inputSuffix;\r
+ return type;\r
}\r
\r
- public void setInputSuffix(String inputSuffix) {\r
+ public void setType(String type) {\r
if (isReference()) {\r
throw tooManyAttributes();\r
}\r
- this.inputSuffix = inputSuffix;\r
+ this.type = type;\r
}\r
\r
- public File getOutdir() {\r
- if (isReference()) {\r
- return ((UserDefineDef) getCheckedRef(UserDefineDef.class,\r
- "UserDefineDef")).getOutdir();\r
- }\r
- return outdir;\r
+ public String getCmd() {\r
+ return cmd;\r
}\r
\r
- public void setOutdir(File outdir) {\r
+ public void setCmd(String cmd) {\r
if (isReference()) {\r
throw tooManyAttributes();\r
}\r
- this.outdir = outdir;\r
+ this.cmd = cmd;\r
}\r
\r
- public String getOutputSuffix() {\r
- if (isReference()) {\r
- return ((UserDefineDef) getCheckedRef(UserDefineDef.class,\r
- "UserDefineDef")).getOutputSuffix();\r
- }\r
- return outputSuffix;\r
+ public String getFamily() {\r
+ return family;\r
}\r
\r
- public void setOutputSuffix(String outputSuffix) {\r
+ public void setFamily(String family) {\r
if (isReference()) {\r
throw tooManyAttributes();\r
}\r
- this.outputSuffix = outputSuffix;\r
+ this.family = family;\r
}\r
\r
- public String getType() {\r
- if (isReference()) {\r
- return ((UserDefineDef) getCheckedRef(UserDefineDef.class,\r
- "UserDefineDef")).getType();\r
- }\r
- return type;\r
+ public String getOutputFile() {\r
+ return outputFile;\r
}\r
\r
- public void setType(String type) {\r
+ public void setOutputFile(String outputFile) {\r
if (isReference()) {\r
throw tooManyAttributes();\r
}\r
- this.type = type;\r
+ this.outputFile = outputFile;\r
}\r
\r
public File getWorkdir() {\r
- if (isReference()) {\r
- return ((UserDefineDef) getCheckedRef(UserDefineDef.class,\r
- "UserDefineDef")).getWorkdir();\r
- }\r
return workdir;\r
}\r
\r
}\r
this.workdir = workdir;\r
}\r
- \r
- /**\r
- * Add an libSet.\r
- */\r
- public LibrarySet createLibset() {\r
- if (isReference()){\r
- throw noChildrenAllowed();\r
- }\r
- LibrarySet lib = new LibrarySet();\r
- libSet.addElement(lib);\r
- return lib; \r
- }\r
- \r
- public String getLibSetString(){\r
- String libString = null;\r
- for (int i = 0; i < libSet.size(); i++){\r
- String[] libList = libSet.get(i).getLibs();\r
- for (int j = 0; j < libList.length; j++){\r
- libString = libString + libList[j] + " ";\r
+\r
+ public String[] get_libset() {\r
+ Set libs = new LinkedHashSet();\r
+ Iterator iter = _libset.iterator();\r
+ while (iter.hasNext()) {\r
+ LibrarySet librarySet = (LibrarySet)iter.next();\r
+ File basedir = librarySet.getDir(getProject());\r
+ String[] libStrArray = librarySet.getLibs();\r
+ for (int i = 0 ; i < libStrArray.length; i ++) {\r
+ if (basedir != null) {\r
+ File libFile = new File(libStrArray[i]);\r
+ if (libFile.isAbsolute()) {\r
+ libs.add(libFile.getPath());\r
+ }\r
+ else {\r
+ libs.add(basedir.getPath() + File.separatorChar + libFile.getPath());\r
+ }\r
+ }\r
+ else {\r
+ libs.add(libStrArray[i]);\r
+ }\r
}\r
}\r
- return libString;\r
+ return (String[])libs.toArray(new String[libs.size()]);\r
}\r
- \r
- public Vector<LibrarySet> getLibSet(){\r
- return this.libSet; \r
- }\r
- \r
- /**\r
- * Add map element\r
- */\r
- public void addMap(UserDefineElement mapElement){\r
- if (isReference()){\r
- throw noChildrenAllowed();\r
- }else{\r
- this.map.addElement(mapElement);\r
- }\r
- }\r
- \r
- public Vector<UserDefineElement> getMap (){\r
- return this.map;\r
- } \r
- \r
- public String getMapvalue (){\r
- if (this.map.size() > 0){\r
- /*\r
- * If user set more than one map use the first one. \r
- */\r
- return this.map.get(0).value;\r
- }\r
- return null;\r
- \r
- }\r
- public String getMapFlag(){\r
- if (this.map.size() > 0){\r
- /*\r
- * If user set more than one map use the first one. \r
- */\r
- return this.map.get(0).flag;\r
- }\r
- return null;\r
- }\r
- /**\r
- * Add pdb element\r
- */\r
- public void addPdb(UserDefineElement pdbElement){\r
- if (isReference()){\r
- throw noChildrenAllowed();\r
- }\r
- this.pdb.addElement(pdbElement);\r
- }\r
- \r
- public Vector<UserDefineElement> getPdb(){\r
- return this.pdb;\r
- }\r
- public String getPdbvalue (){\r
- if (this.pdb.size() > 0){\r
- /*\r
- * If user set more than one pdb use the first one. \r
- * \r
- */\r
- return this.pdb.get(0).value;\r
- }\r
- return null;\r
- \r
- }\r
- public String getPdbFlag(){\r
- if (this.pdb.size() > 0){\r
- /*\r
- * If user set more than one pdb use the first one. \r
- */\r
- return this.pdb.get(0).flag;\r
- }\r
- return null;\r
- }\r
- \r
- /**\r
- * add entryPoint element.\r
- */\r
- public void addEntryPoint(UserDefineElement entryPointElement){\r
- if (isReference()){\r
- throw noChildrenAllowed();\r
- }\r
- this.entryPoint.addElement(entryPointElement);\r
- }\r
- \r
- public Vector<UserDefineElement> getEntryPoint(){\r
- return this.entryPoint;\r
- }\r
- \r
- public String getEntryPointvalue (){\r
- if (this.entryPoint.size() > 0){\r
- /*\r
- * If user set more than one entryPoint use the first one. \r
- */\r
- return this.entryPoint.get(0).value;\r
- }\r
- return null;\r
- \r
- }\r
- public String getEntryPointFlag(){\r
- if (this.entryPoint.size() > 0){\r
- /*\r
- * If user set more than one entry point use the first one. \r
- */\r
- return this.entryPoint.get(0).flag;\r
- }\r
- return null;\r
- }\r
- \r
- /**\r
- * Add subSystem element.\r
- */\r
- public void addSubSystem (UserDefineElement subSystem){\r
- if (isReference()){\r
- throw noChildrenAllowed();\r
- }\r
- this.subSystem.addElement(subSystem);\r
- }\r
- public Vector<UserDefineElement> getSubSystem (){\r
- return this.subSystem;\r
- }\r
- \r
- public String getSubSystemvalue (){\r
- if (this.subSystem.size() > 0){\r
- /*\r
- * If user set more than one subsystem use the first one. \r
- */\r
- return this.subSystem.get(0).value;\r
- }\r
- return null;\r
- \r
- }\r
- public String getSubSystemFlag(){\r
- if (this.subSystem.size() > 0){\r
- /*\r
- * If user set more than one subsystem use the first one. \r
- */\r
- return this.subSystem.get(0).flag;\r
- }\r
- return null;\r
- }\r
- /**\r
- * Add includeFile element\r
- */\r
- public void addIncludeFile (UserDefineElement includeFile){\r
- if (isReference()){\r
- throw noChildrenAllowed();\r
- }\r
- this.includeFiles.addElement(includeFile);\r
- }\r
- public Vector<UserDefineElement> getIncludeFiles(){\r
- return this.includeFiles;\r
- }\r
- \r
- public String getIncludeFile (){\r
- if (this.includeFiles.size() > 0){\r
- /*\r
- * If user set more than one map use the first one. \r
- */\r
- return this.includeFiles.get(0).value;\r
- }\r
- return null;\r
- \r
- }\r
- public String getIncludeFileFlag(){\r
- if (this.includeFiles.size() > 0){\r
- /*\r
- * If user set more than one map use the first one. \r
- */\r
- return this.includeFiles.get(0).flag;\r
- }\r
- return null;\r
- }\r
- \r
- /**\r
- * Add OutputFile element\r
- */\r
- public void addOutputFile (UserDefineElement outPutFile){\r
- if (isReference()){\r
- throw noChildrenAllowed();\r
- }\r
- this.outPutFiles.addElement(outPutFile);\r
- }\r
- \r
- public Vector<UserDefineElement> getOutputFiles(){\r
- return this.outPutFiles;\r
- }\r
- \r
- public String getOutputFile (){\r
- if (this.outPutFiles.size() > 0){\r
- /*\r
- * If user set more than one map use the first one. \r
- */\r
- return this.outPutFiles.get(0).value;\r
- }\r
- return null;\r
- \r
- }\r
- public String getOutPutFlag(){\r
- if (this.outPutFiles.size() > 0){\r
- /*\r
- * If user set more than one map use the first one. \r
- */\r
- return this.outPutFiles.get(0).flag;\r
- }\r
- return null;\r
- }\r
- \r
- /**\r
- * Add fileSet list\r
- */\r
- public void addFileList(FileList fileSet){\r
- this.fileSetList.addElement(fileSet);\r
+\r
+ public String getOutputDelimiter() {\r
+ return outputDelimiter;\r
}\r
- \r
- public Vector<String> getFileList(){\r
- Project p = getProject();\r
- Vector<String> fileListVector = new Vector<String>();\r
- for (int i = 0; i < this.fileSetList.size(); i++){\r
- String[] tempStrList = this.fileSetList.get(i).getFiles(p);\r
- for (int j = 0; j < tempStrList.length; j++){\r
- fileListVector .addElement(tempStrList[j]);\r
- }\r
- }\r
- return fileListVector;\r
+\r
+ public void setOutputDelimiter(String outputDelimiter) {\r
+ this.outputDelimiter = outputDelimiter;\r
}\r
+\r
}\r
*/\r
package net.sf.antcontrib.cpptasks.userdefine;\r
public class UserDefineMapping {\r
- // list of Arch: EBC, ARM, IA32, X64, IPF, PPC, NT32\r
- public final static String[] arch = { "EBC", "ARM", "IA32", "X64", "IPF",\r
- "PPC", "NT32" };\r
\r
- // list of OS: Linux, Windows\r
- public final static String[] os = { "WINDOWS", "LINUX" };\r
\r
- // list of Vendor: Microsoft, Intel, Cygwin, Gcc\r
- public final static String[] vendor = { "MSFT", "INTEL", "GCC", "CYGWIN" };\r
+ // list of Vendor: Microsoft, Intel, Gcc\r
+ public final String[] families = { "MSFT", "INTEL", "GCC"};\r
\r
- // list of Command Type: CC, LIB, LINK, ASL, ASM, ASMLINK\r
- public final static String[] commandType = { "CC", "LIB", "LINK", "ASL",\r
+ // list of Command Type: CC, SLINK, DLINK, ASL, ASM, ASMLINK, PP\r
+ public final String[] commandType = { "CC", "SLINK", "DLINK", "ASL",\r
"ASM", "ASMLINK", "PP" };\r
\r
- //\r
- // flags mapping (Include compellingIncFileFlag,Path Delimiter, Output file\r
- // flag,\r
- // includepathfalge,\r
- // )\r
- // Examples: '/I' for MSFT cl.exe while '-I' for GCC\r
- // '/Fo' for MSFT cl.exe while '-o' for GCC\r
- //\r
- public final static String[][] compellingIncFileFlag = {\r
- { "MSFT_CC", "/FI" }, { "GCC_CC", "-include" },\r
- { "INTEL_CC", "-FI" }, { "WINDDK_CC", "/FI" },\r
- { "MSFT_ASM", "/FI" }, { "GCC_ASM", "-include" },\r
- { "WINDDK_ASM", "/FI" } };\r
-\r
- public final static String[][] includePathFlag = { { "MSFT_CC", "/I" },\r
+ public final String[][] includePathFlag = { { "MSFT_CC", "/I" },\r
{ "GCC_CC", "-I" }, { "INTEL_CC", "/I" }, { "WINDDK_CC", "/I" },\r
{ "MSFT_ASM", "/I" }, { "GCC_ASM", "-I" }, { "WINDDK_CC", "/I" },\r
{ "MSFT_PP", "/I" }, { "GCC_PP", "-I" }, { "WINDDK_PP", "/I" } };\r
\r
- public final static String[][] outputFileFlag = { { "MSFT_CC", "/Fo" },\r
+ public final String[][] outputFileFlag = { { "MSFT_CC", "/Fo" },\r
{ "GCC_CC", "-o" }, { "INTEL_CC", "/Fo" }, { "WINDDK_CC", "/Fo" },\r
- { "MSFT_LIB", "/OUT:" }, { "GCC_LIB", "-cr" },\r
- { "INTEL_LIB", "/OUT:" }, { "WINDDK_LIB", "/OUT:" },\r
- { "MSFT_LINK", "/OUT:" }, { "GCC_LINK", "-o" },\r
- { "INTEL_LINK", "/OUT:" }, { "WINDDK_LINK", "/OUT:" },\r
+ { "MSFT_SLINK", "/OUT:" }, { "GCC_SLINK", "-cr" },\r
+ { "INTEL_SLINK", "/OUT:" }, { "WINDDK_SLINK", "/OUT:" },\r
+ { "MSFT_DLINK", "/OUT:" }, { "GCC_DLINK", "-o" },\r
+ { "INTEL_DLINK", "/OUT:" }, { "WINDDK_DLINK", "/OUT:" },\r
{ "MSFT_ASM", "/Fo" }, { "GCC_ASM", "-o" },\r
{ "WINDDK_ASM", "/Fo" },{"WINDDK_IPF_ASM", "-o"} };\r
\r
- public final static String[][] subSystemFlag = {\r
- { "MSFT_LIB", "/SUBSYSTEM:" }, { "GCC_LIB", "--subsystem=" },\r
- { "WINDDk_LIB", "/SUBSYSTEM:" }, { "INTEL_LIB", "/SUBSYSTEM:" },\r
- { "MSFT_LINK", "/SUBSYSTEM:" }, { "GCC_LINK", "--subsystem=" },\r
- { "INTEL_LINK", "/SUBSYSTEM:" }, { "WINDDK_LINK", "/SUBSYSTEM:" } };\r
-\r
- public final static String[][] outputFileSuffix = {\r
- { "WINDOWS_ASM", ".obj" }, { "WINDOWS_CC", ".obj" },\r
- { "LINUX_ASM", ".o" }, { "LINUX_CC", ".o" } };\r
-\r
- public final static String[][] entryPointFlag = {\r
- { "MSFT_LINK", "/ENTRY:" }, { "GCC_LINK", "-e" },\r
- { "INTEL_LINK", "/ENTRY:" },\r
- { "WINDDK_LINK", "/ENTRY:" } };\r
-\r
- public final static String[][] mapFlag = { { "MSFT_LINK", "/MAP:" },\r
- { "GCC_LINK", "" }, { "INTEL_LINK", "/MAP:" },\r
- { "WINDDK_LINK", "/MAP:" } };\r
-\r
- public final static String[][] pdbFlag = { { "MSFT_LINK", "/PDB:" },\r
- { "GCC_LINK", "" }, { "INTEL_LINK", "" }, { "WINDDK_LINK", "/PDB:"} };\r
-\r
- public static String getIncludePathDelimiter(String vendor,\r
+ public String getIncludePathDelimiter(String vendor,\r
String commandType) {\r
String key = vendor + "_" + commandType;\r
for (int i = 0; i < includePathFlag.length; i++) {\r
return includePathFlag[i][1];\r
}\r
}\r
- return null;\r
+ return "/I";\r
}\r
\r
- public static String getOutputFileFlag(String vendor, String arch, String commandType) {\r
- /*\r
- * First find outputfileFlag by vendor_arch_commandType\r
- */\r
- String key = vendor + "_" + arch + "_" + commandType;\r
- for (int i = 0; i < outputFileFlag.length; i++) {\r
- if (outputFileFlag[i][0].equalsIgnoreCase(key)) {\r
- return outputFileFlag[i][1];\r
- }\r
- }\r
- key = vendor + "_" + commandType;\r
+ public String getOutputFileFlag(String vendor, String commandType) {\r
+ String key = vendor + "_" + commandType;\r
for (int i = 0; i < outputFileFlag.length; i++) {\r
if (outputFileFlag[i][0].equalsIgnoreCase(key)) {\r
return outputFileFlag[i][1];\r
}\r
}\r
- return null;\r
- }\r
-\r
- public static String getCompellingIncFileFlag(String vendor,\r
- String commandType) {\r
- String key = vendor + "_" + commandType;\r
- for (int i = 0; i < compellingIncFileFlag.length; i++) {\r
- if (compellingIncFileFlag[i][0].equalsIgnoreCase(key)) {\r
- return compellingIncFileFlag[i][1];\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- public static String getSubSystemFlag(String vendor, String commandType) {\r
- String key = vendor + "_" + commandType;\r
- for (int i = 0; i < subSystemFlag.length; i++) {\r
- if (subSystemFlag[i][0].equalsIgnoreCase(key)) {\r
- return subSystemFlag[i][1];\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- public static String getEntryPointFlag(String vendor, String commandType) {\r
- String key = vendor + "_" + commandType;\r
- for (int i = 0; i < entryPointFlag.length; i++) {\r
- if (entryPointFlag[i][0].equalsIgnoreCase(key)) {\r
- return entryPointFlag[i][1];\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- public static String getMapFlag(String vendor, String commandType) {\r
- String key = vendor + "_" + commandType;\r
- for (int i = 0; i < mapFlag.length; i++) {\r
- if (mapFlag[i][0].equalsIgnoreCase(key)) {\r
- return mapFlag[i][1];\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- public static String getPdbFlag(String vendor, String commandType) {\r
- String key = vendor + "_" + commandType;\r
- for (int i = 0; i < pdbFlag.length; i++) {\r
- if (pdbFlag[i][0].equalsIgnoreCase(key)) {\r
- return pdbFlag[i][1];\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- //\r
- // Well-known source file suffix and output file suffix relationship\r
- // sourceExtension(Multiple),\r
- // headExtension(Multiple) and outputSuffix(Single)\r
- //\r
-\r
- //\r
- // Default command string such as 'cl' in MSFT while 'gcc' in GCC\r
- //\r
- public final static String[][] defaultCommand = { { "GCC", "gcc" },\r
- { "MSFT_CC", "cl" }, { "MSFT_LIB", "lib" },\r
- { "MSFT_LINK", "link" }, };\r
-\r
- public static String getDefaultCommand(String toolchain) {\r
- for (int i = 0; i < defaultCommand.length; i++) {\r
- if (defaultCommand[i][0].equalsIgnoreCase(toolchain)) {\r
- return defaultCommand[i][1];\r
- }\r
- }\r
- return null;\r
+ return "/Fo";\r
}\r
\r
}
\ No newline at end of file