import org.apache.tools.ant.DirectoryScanner;\r
import org.apache.tools.ant.Project;\r
\r
+/**\r
+ * \r
+ */\r
public class CommandLineUserDefine {\r
\r
String includePathDelimiter = null;\r
- \r
+\r
String outputDelimiter = null;\r
- \r
- public void command(CCTask cctask, UserDefineDef userdefine){\r
+\r
+ public void command(CCTask cctask, UserDefineDef userdefine) {\r
boolean isGccCommand = userdefine.getFamily().equalsIgnoreCase("GCC");\r
File workdir;\r
Project project = cctask.getProject();\r
- if(userdefine.getWorkdir() == null) {\r
+ if (userdefine.getWorkdir() == null) {\r
workdir = new File(".");\r
- }\r
- else {\r
+ } else {\r
workdir = userdefine.getWorkdir();\r
- } \r
- \r
+ }\r
+\r
//\r
// generate cmdline= command + args + includepath + endargs + outfile\r
// \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
- // includpath + \r
- // endargs + \r
- // \r
- \r
+\r
//\r
// get Args.\r
//\r
endargs.addElement(argument[j].getValue());\r
}\r
}\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
- //includePath.addElement( includePathDelimiter + "\"" + incPath[j] + "\"");\r
- }\r
- else {\r
- includePath.addElement( includePathDelimiter + incPath[j]);\r
- }\r
+ includePath.addElement(includePathDelimiter + incPath[j]);\r
}\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
+ for (int i = 0; i < args.size(); i++) {\r
+ String str = (String) args.get(i);\r
StringTokenizer st = new StringTokenizer(str, " \t");\r
- while(st.hasMoreTokens()) {\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
+ for (int i = 0; i < endargs.size(); i++) {\r
+ String str = (String) endargs.get(i);\r
StringTokenizer st = new StringTokenizer(str, " \t");\r
- while(st.hasMoreTokens()) {\r
+ while (st.hasMoreTokens()) {\r
endargsWithoutSpace.addElement(st.nextToken());\r
}\r
}\r
- \r
+\r
int cmdLen = 0;\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 = 1 + argsWithoutSpace.size() + endargsWithoutSpace.size()\r
+ + includePath.size() + 1;\r
+ String[] libSet = userdefine.getLibset();\r
+ if (libSet != null && libSet.length > 0) {\r
cmdLen = cmdLen + libSet.length;\r
if (isGccCommand) {\r
- cmdLen += 2; // we need -( and -) to group libs for GCC\r
+ cmdLen += 2; // we need -( and -) to group libs for GCC\r
}\r
}\r
\r
//\r
- // In gcc the "cr" flag should follow space then add outputfile name, otherwise\r
- // it will pop error. \r
+ // In gcc the "cr" flag should follow space then add outputfile name,\r
+ // 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
+ if (outputDelimiter != null && userdefine.getOutputFile() != null\r
+ && outputDelimiter.trim().length() > 0) {\r
+ if (outputDelimiter.trim().equalsIgnoreCase("-cr")) {\r
cmdLen = cmdLen + 2;\r
- }else {\r
+ } else {\r
cmdLen++;\r
}\r
}\r
- \r
+\r
//\r
- // for every source file\r
- // if file is header file, just skip it (add later)\r
+ // for every source file\r
+ // if file is header file, just skip it (add later)\r
//\r
Vector srcSets = userdefine.getSrcSets();\r
-// System.out.println("##" + userdefine.getSrcSets());\r
- \r
+\r
//\r
- // if have source file append source file in command land.\r
+ // if have source file append source file in command line.\r
//\r
Set allSrcFiles = new LinkedHashSet();\r
for (int i = 0; i < srcSets.size(); i++) {\r
ConditionalFileSet srcSet = (ConditionalFileSet) srcSets\r
- .elementAt(i);\r
+ .elementAt(i);\r
if (srcSet.isActive()) {\r
+ //\r
// Find matching source files\r
+ //\r
DirectoryScanner scanner = srcSet.getDirectoryScanner(project);\r
+ \r
+ //\r
// Check each source file - see if it needs compilation\r
+ //\r
String[] fileNames = scanner.getIncludedFiles();\r
- for (int j = 0; j < fileNames.length; j++){\r
- // execute the command\r
+ for (int j = 0; j < fileNames.length; j++) {\r
allSrcFiles.add(scanner.getBasedir() + "/" + fileNames[j]);\r
if (isGccCommand) {\r
- System.out.println("[" + userdefine.getType() + "] " + fileNames[j]);\r
+ System.out.println("[" + userdefine.getType() + "] "\r
+ + fileNames[j]);\r
}\r
}\r
}\r
}\r
\r
- String[] fileNames = (String[])allSrcFiles.toArray(new String[allSrcFiles.size()]);\r
+ String[] fileNames = (String[]) allSrcFiles\r
+ .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
+\r
Iterator iter = argsWithoutSpace.iterator();\r
while (iter.hasNext()) {\r
- cmd[index++] = project.replaceProperties((String)iter.next());\r
+ cmd[index++] = project.replaceProperties((String) iter.next());\r
}\r
- \r
+\r
iter = endargsWithoutSpace.iterator();\r
while (iter.hasNext()) {\r
- cmd[index++] = project.replaceProperties((String)iter.next());\r
+ cmd[index++] = project.replaceProperties((String) iter.next());\r
}\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
+ if (outputDelimiter != null && userdefine.getOutputFile() != null\r
+ && 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
+ } else {\r
+ cmd[index++] = outputDelimiter + userdefine.getOutputFile();\r
}\r
}\r
- \r
+\r
iter = includePath.iterator();\r
while (iter.hasNext()) {\r
- cmd[index++] = (String)iter.next();\r
+ cmd[index++] = (String) iter.next();\r
}\r
- \r
- if (libSet != null && libSet.length > 0){\r
+\r
+ if (libSet != null && libSet.length > 0) {\r
if (isGccCommand) {\r
cmd[index++] = "-(";\r
}\r
- for (int k = 0; k < libSet.length ; k++){\r
+ for (int k = 0; k < libSet.length; k++) {\r
cmd[index++] = libSet[k];\r
}\r
if (isGccCommand) {\r
cmd[index++] = "-)";\r
}\r
}\r
- for (int j = 0; j < fileNames.length; j++){\r
- // execute the command\r
+ for (int j = 0; j < fileNames.length; j++) {\r
cmd[index++] = fileNames[j];\r
}\r
- \r
+\r
int retval = runCommand(cctask, workdir, cmd);\r
- // if with monitor, add more code\r
+ \r
if (retval != 0) {\r
- throw new BuildException(userdefine.getCmd()\r
- + " failed with return code " + retval,\r
- cctask.getLocation());\r
+ throw new BuildException(userdefine.getCmd()\r
+ + " failed with return code " + retval, cctask\r
+ .getLocation());\r
}\r
}\r
- \r
+\r
protected int runCommand(CCTask task, File workingDir, String[] cmdline)\r
throws BuildException {\r
return CUtil.runCommand(task, workingDir, cmdline, false, null);\r
\r
}\r
-\r
- protected String getInputFileArgument(File outputDir, String filename,\r
- int index) {\r
- //\r
- // if there is an embedded space,\r
- // must enclose in quotes\r
- if (filename.indexOf(' ') >= 0) {\r
- StringBuffer buf = new StringBuffer("\"");\r
- buf.append(filename);\r
- buf.append("\"");\r
- return buf.toString();\r
- }\r
- return filename;\r
- }\r
-\r
}\r
\r
import net.sf.antcontrib.cpptasks.types.CommandLineArgument;\r
\r
+/**\r
+ * Collect Arguments. \r
+ *\r
+ */\r
public class UserDefineArgument extends CommandLineArgument {\r
\r
public UserDefineArgument() {\r
\r
import net.sf.antcontrib.cpptasks.CCTask;\r
\r
+/**\r
+ * Adapter for the User-Defined Compiler\r
+ */\r
public class UserDefineCompiler extends CommandLineUserDefine {\r
\r
- public UserDefineCompiler(CCTask cctask, UserDefineDef userdefineDef) {\r
+ public UserDefineCompiler (CCTask cctask, UserDefineDef userdefineDef) {\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
+\r
+ if (userdefineDef.getIncludePathDelimiter() == null) {\r
+ includePathDelimiter = UserDefineMapping.getIncludePathDelimiter(\r
+ toolchainFamily, cmdType);\r
} else {\r
- includePathDelimiter = userdefineDef.getIncludepathDelimiter();\r
+ includePathDelimiter = userdefineDef.getIncludePathDelimiter();\r
}\r
- \r
+\r
if (userdefineDef.getOutputDelimiter() == null) {\r
- outputDelimiter = mapping.getOutputFileFlag(toolchainFamily, cmdType);\r
+ outputDelimiter = UserDefineMapping.getOutputFileFlag(\r
+ toolchainFamily, cmdType);\r
} else {\r
outputDelimiter = userdefineDef.getOutputDelimiter();\r
}\r
- \r
+\r
}\r
}\r
import net.sf.antcontrib.cpptasks.types.IncludePath;\r
import net.sf.antcontrib.cpptasks.types.LibrarySet;\r
\r
-public class UserDefineDef extends ProcessorDef{\r
- \r
- public UserDefineDef () {}\r
- \r
+/**\r
+ * A userdefinedef definition. userdefine elements may be placed either as\r
+ * children of a cc element or the project element. A userdefine element with an\r
+ * id attribute may be referenced by userdefine elements with refid or extends\r
+ * attributes.\r
+ * \r
+ */\r
+public class UserDefineDef extends ProcessorDef {\r
+\r
+ public UserDefineDef () {\r
+ }\r
+\r
private String type = "CC";\r
- \r
+\r
private String family = "MSFT";\r
- \r
+\r
private String cmd;\r
- \r
- private String includepathDelimiter;\r
- \r
+\r
+ private String includePathDelimiter;\r
+\r
private String outputDelimiter;\r
- \r
+\r
private File workdir;\r
- \r
- private Vector includePaths= new Vector();\r
- \r
+\r
+ private Vector includePaths = new Vector();\r
+\r
private String outputFile;\r
- \r
- private Vector _libset = new Vector();\r
- \r
+\r
+ private Vector allLibraries = new Vector();\r
+\r
public void addLibset(LibrarySet libset) {\r
if (isReference()) {\r
throw noChildrenAllowed();\r
if (libset == null) {\r
throw new NullPointerException("libset");\r
}\r
- \r
- _libset.add(libset);\r
+\r
+ allLibraries.add(libset);\r
}\r
- \r
+\r
public void execute() throws org.apache.tools.ant.BuildException {\r
throw new org.apache.tools.ant.BuildException(\r
"Not an actual task, but looks like one for documentation purposes");\r
}\r
\r
-\r
public void addConfiguredArgument(UserDefineArgument arg) {\r
if (isReference()) {\r
throw noChildrenAllowed();\r
}\r
addConfiguredProcessorArg(arg);\r
}\r
- \r
+\r
/**\r
* Creates an include path.\r
*/\r
public IncludePath createIncludePath() {\r
Project p = getProject();\r
- if (p == null) {\r
- throw new java.lang.IllegalStateException("project must be set");\r
- }\r
if (isReference()) {\r
throw noChildrenAllowed();\r
}\r
includePaths.addElement(path);\r
return path;\r
}\r
- \r
- \r
+\r
/**\r
* Add a <includepath> if specify the file attribute\r
* \r
+ * @param activePath\r
+ * Active Path Vector\r
+ * @param file\r
+ * File with multiple path\r
* @throws BuildException\r
* if the specify file not exist\r
*/\r
fileReader = new FileReader(file);\r
in = new BufferedReader(fileReader);\r
while ((str = in.readLine()) != null) {\r
- if (str.trim() == "") {\r
+ if (str.trim().endsWith("")) {\r
continue;\r
}\r
str = getProject().replaceProperties(str);\r
throw new BuildException(e.getMessage());\r
}\r
}\r
- \r
+\r
/**\r
* Returns the specific include path.\r
+ * \r
+ * @return All active include paths\r
*/\r
public String[] getActiveIncludePaths() {\r
if (isReference()) {\r
}\r
return getActivePaths(includePaths);\r
}\r
- \r
+\r
private String[] getActivePaths(Vector paths) {\r
Project p = getProject();\r
- if (p == null) {\r
- throw new java.lang.IllegalStateException("project not set");\r
- }\r
Vector activePaths = new Vector(paths.size());\r
- for (int i = 0; i < paths.size(); i++) {\r
+ int length = paths.size();\r
+ for (int i = 0; i < length; i++) {\r
ConditionalPath path = (ConditionalPath) paths.elementAt(i);\r
if (path.isActive(p)) {\r
if (path.getFile() == null) {\r
activePaths.copyInto(pathNames);\r
return pathNames;\r
}\r
- \r
- public String getIncludepathDelimiter() {\r
+\r
+ /**\r
+ * Get include path delimiter.\r
+ * \r
+ * @return Include Path Delimiter\r
+ */\r
+ public String getIncludePathDelimiter() {\r
if (isReference()) {\r
return ((UserDefineDef) getCheckedRef(UserDefineDef.class,\r
- "UserDefineDef")).getIncludepathDelimiter();\r
+ "UserDefineDef")).getIncludePathDelimiter();\r
}\r
- return includepathDelimiter;\r
+ return includePathDelimiter;\r
}\r
\r
- public void setIncludepathDelimiter(String includepathDelimiter) {\r
+ /**\r
+ * Set include path delimiter.\r
+ * \r
+ * @param includePathDelimiter\r
+ * include path delimiter\r
+ */\r
+ public void setIncludePathDelimiter(String includePathDelimiter) {\r
if (isReference()) {\r
throw tooManyAttributes();\r
}\r
- this.includepathDelimiter = includepathDelimiter;\r
+ this.includePathDelimiter = includePathDelimiter;\r
}\r
\r
+ /**\r
+ * Get type.\r
+ * \r
+ * @return type\r
+ */\r
public String getType() {\r
if (isReference()) {\r
return ((UserDefineDef) getCheckedRef(UserDefineDef.class,\r
return type;\r
}\r
\r
+ /**\r
+ * Set type.\r
+ * \r
+ * @param type\r
+ * Type\r
+ */\r
public void setType(String type) {\r
if (isReference()) {\r
throw tooManyAttributes();\r
this.workdir = workdir;\r
}\r
\r
- public String[] get_libset() {\r
+ public String[] getLibset() {\r
Set libs = new LinkedHashSet();\r
- Iterator iter = _libset.iterator();\r
+ Iterator iter = allLibraries.iterator();\r
while (iter.hasNext()) {\r
- LibrarySet librarySet = (LibrarySet)iter.next();\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
+ 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
+ } else {\r
+ libs.add(basedir.getPath() + File.separatorChar\r
+ + libFile.getPath());\r
}\r
- else {\r
- libs.add(basedir.getPath() + File.separatorChar + libFile.getPath());\r
- }\r
- }\r
- else {\r
+ } else {\r
libs.add(libStrArray[i]);\r
}\r
}\r
}\r
- return (String[])libs.toArray(new String[libs.size()]);\r
+ return (String[]) libs.toArray(new String[libs.size()]);\r
}\r
\r
public String getOutputDelimiter() {\r
* limitations under the License.\r
*/\r
package net.sf.antcontrib.cpptasks.userdefine;\r
-public class UserDefineMapping {\r
-\r
-\r
- // list of Vendor: Microsoft, Intel, Gcc\r
- public final String[] families = { "MSFT", "INTEL", "GCC"};\r
\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
+ * Relationship between {family, command type} and flags\r
+ * \r
+ */\r
+public class UserDefineMapping {\r
\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
+ * Mapping info: include path delimiter <--> family (vendor) + command type\r
+ */\r
+ public static final String[][] includePathFlag = { { "MSFT_CC", "/I" },\r
+ { "GCC_CC", "-I" }, { "INTEL_CC", "/I" },\r
+ { "WINDDK_CC", "/I" }, { "MSFT_ASM", "/I" },\r
+ { "GCC_ASM", "-I" }, { "WINDDK_CC", "/I" },\r
+ { "MSFT_PP", "/I" }, { "GCC_PP", "-I" },\r
+ { "WINDDK_PP", "/I" } };\r
\r
- public final String[][] outputFileFlag = { { "MSFT_CC", "/Fo" },\r
- { "GCC_CC", "-o" }, { "INTEL_CC", "/Fo" }, { "WINDDK_CC", "/Fo" },\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
+ * Mapping info: output file flag <--> family (vendor) + command type\r
+ */\r
+ public static final String[][] outputFileFlag = { { "MSFT_CC", "/Fo" },\r
+ { "GCC_CC", "-o" }, { "INTEL_CC", "/Fo" },\r
+ { "WINDDK_CC", "/Fo" }, { "MSFT_SLINK", "/OUT:" },\r
+ { "GCC_SLINK", "-cr" }, { "INTEL_SLINK", "/OUT:" },\r
+ { "WINDDK_SLINK", "/OUT:" }, { "MSFT_DLINK", "/OUT:" },\r
+ { "GCC_DLINK", "-o" }, { "INTEL_DLINK", "/OUT:" },\r
+ { "WINDDK_DLINK", "/OUT:" }, { "MSFT_ASM", "/Fo" },\r
+ { "GCC_ASM", "-o" }, { "WINDDK_ASM", "/Fo" },\r
+ { "WINDDK_IPF_ASM", "-o" } };\r
\r
- public String getIncludePathDelimiter(String vendor,\r
- String commandType) {\r
+ /**\r
+ * Get include delimiter with vendow and command type.\r
+ * \r
+ * @param vendor\r
+ * Vendor\r
+ * @param commandType\r
+ * Command Type\r
+ * @return include path delimiter\r
+ */\r
+ public static String getIncludePathDelimiter(String vendor,\r
+ String commandType) {\r
String key = vendor + "_" + commandType;\r
for (int i = 0; i < includePathFlag.length; i++) {\r
if (includePathFlag[i][0].equalsIgnoreCase(key)) {\r
return "/I";\r
}\r
\r
- public String getOutputFileFlag(String vendor, String commandType) {\r
+ /**\r
+ * Get Output Flag with vendor and command type.\r
+ * \r
+ * @param vendor\r
+ * Vendor\r
+ * @param commandType\r
+ * Command Type\r
+ * @return Output File Flag\r
+ */\r
+ public static 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