summaryrefslogtreecommitdiff
path: root/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java
diff options
context:
space:
mode:
authorMark Donszelmann <Mark.Donszelmann@gmail.com>2009-11-05 23:27:33 +0100
committerMark Donszelmann <Mark.Donszelmann@gmail.com>2009-11-05 23:27:33 +0100
commit254c4886d58979eebd0e352f4d16e391736f2a33 (patch)
tree8feca0cc1caa5177dd52a7b9b2dfd63502c941fd /src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java
parentef6f25ba42792d2d811fd6826c0dd528ad77b1e9 (diff)
downloadcpptasks-parallel-254c4886d58979eebd0e352f4d16e391736f2a33.tar.gz
cpptasks-parallel-254c4886d58979eebd0e352f4d16e391736f2a33.tar.bz2
cpptasks-parallel-254c4886d58979eebd0e352f4d16e391736f2a33.tar.xz
cpptasks-parallel-254c4886d58979eebd0e352f4d16e391736f2a33.zip
Reorganized source directories in line with cpptasks-1.0b5, for easier tracking
Diffstat (limited to 'src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java')
-rw-r--r--src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java437
1 files changed, 0 insertions, 437 deletions
diff --git a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java b/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java
deleted file mode 100644
index a8b7691..0000000
--- a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompiler.java
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- *
- * Copyright 2002-2004 The Ant-Contrib project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package net.sf.antcontrib.cpptasks.compiler;
-import java.io.File;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Vector;
-import net.sf.antcontrib.cpptasks.CCTask;
-import net.sf.antcontrib.cpptasks.CUtil;
-import net.sf.antcontrib.cpptasks.CompilerDef;
-import net.sf.antcontrib.cpptasks.ProcessorDef;
-import net.sf.antcontrib.cpptasks.ProcessorParam;
-import net.sf.antcontrib.cpptasks.types.CommandLineArgument;
-import net.sf.antcontrib.cpptasks.types.UndefineArgument;
-import net.sf.antcontrib.cpptasks.TargetDef;
-import net.sf.antcontrib.cpptasks.VersionInfo;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.types.Environment;
-import net.sf.antcontrib.cpptasks.OptimizationEnum;;
-/**
- * An abstract Compiler implementation which uses an external program to
- * perform the compile.
- *
- * @author Adam Murdoch
- */
-public abstract class CommandLineCompiler extends AbstractCompiler {
- private String command;
- private final Environment env;
- private String identifier;
- private String identifierArg;
- private boolean libtool;
- private CommandLineCompiler libtoolCompiler;
- private final boolean newEnvironment;
- protected CommandLineCompiler(String command, String identifierArg,
- String[] sourceExtensions, String[] headerExtensions,
- String outputSuffix, boolean libtool,
- CommandLineCompiler libtoolCompiler, boolean newEnvironment,
- Environment env) {
- super(sourceExtensions, headerExtensions, outputSuffix);
- this.command = command;
- if (libtool && libtoolCompiler != null) {
- throw new java.lang.IllegalArgumentException(
- "libtoolCompiler should be null when libtool is true");
- }
- this.libtool = libtool;
- this.libtoolCompiler = libtoolCompiler;
- this.identifierArg = identifierArg;
- this.newEnvironment = newEnvironment;
- this.env = env;
- }
- abstract protected void addImpliedArgs(Vector args, boolean debug,
- boolean multithreaded, boolean exceptions, LinkType linkType,
- Boolean rtti, OptimizationEnum optimization);
- /**
- * Adds command-line arguments for include directories.
- *
- * If relativeArgs is not null will add corresponding relative paths
- * include switches to that vector (for use in building a configuration
- * identifier that is consistent between machines).
- *
- * @param baseDirPaths
- * A vector containing the parts of the working directory,
- * produced by CUtil.DecomposeFile.
- * @param includeDirs
- * Array of include directory paths
- * @param args
- * Vector of command line arguments used to execute the task
- * @param relativeArgs
- * Vector of command line arguments used to build the
- * configuration identifier
- */
- protected void addIncludes(String baseDirPath, File[] includeDirs,
- Vector args, Vector relativeArgs, StringBuffer includePathId) {
- for (int i = 0; i < includeDirs.length; i++) {
- args.addElement(getIncludeDirSwitch(includeDirs[i]
- .getAbsolutePath()));
- if (relativeArgs != null) {
- String relative = CUtil.getRelativePath(baseDirPath,
- includeDirs[i]);
- relativeArgs.addElement(getIncludeDirSwitch(relative));
- if (includePathId != null) {
- if (includePathId.length() == 0) {
- includePathId.append("/I");
- } else {
- includePathId.append(" /I");
- }
- includePathId.append(relative);
- }
- }
- }
- }
- abstract protected void addWarningSwitch(Vector args, int warnings);
- protected void buildDefineArguments(CompilerDef[] defs, Vector args) {
- //
- // assume that we aren't inheriting defines from containing <cc>
- //
- UndefineArgument[] merged = defs[0].getActiveDefines();
- for (int i = 1; i < defs.length; i++) {
- //
- // if we are inheriting, merge the specific defines with the
- // containing defines
- merged = UndefineArgument.merge(defs[i].getActiveDefines(), merged);
- }
- StringBuffer buf = new StringBuffer(30);
- for (int i = 0; i < merged.length; i++) {
- buf.setLength(0);
- UndefineArgument current = merged[i];
- if (current.isDefine()) {
- getDefineSwitch(buf, current.getName(), current.getValue());
- } else {
- getUndefineSwitch(buf, current.getName());
- }
- args.addElement(buf.toString());
- }
- }
- /**
- * Compiles a source file.
- *
- * @author Curt Arnold
- */
- public void compile(CCTask task, File outputDir, String[] sourceFiles,
- String[] args, String[] endArgs, boolean relentless,
- CommandLineCompilerConfiguration config, ProgressMonitor monitor)
- throws BuildException {
- BuildException exc = null;
- //
- // determine length of executable name and args
- //
- String command = getCommand();
- int baseLength = command.length() + args.length + endArgs.length;
- if (libtool) {
- baseLength += 8;
- }
- for (int i = 0; i < args.length; i++) {
- baseLength += args[i].length();
- }
- for (int i = 0; i < endArgs.length; i++) {
- baseLength += endArgs[i].length();
- }
- if (baseLength > getMaximumCommandLength()) {
- throw new BuildException(
- "Command line is over maximum length without specifying source file");
- }
- //
- // typically either 1 or Integer.MAX_VALUE
- //
- int maxInputFilesPerCommand = getMaximumInputFilesPerCommand();
- int argumentCountPerInputFile = getArgumentCountPerInputFile();
- for (int sourceIndex = 0; sourceIndex < sourceFiles.length;) {
- int cmdLength = baseLength;
- int firstFileNextExec;
- for (firstFileNextExec = sourceIndex; firstFileNextExec < sourceFiles.length
- && (firstFileNextExec - sourceIndex) < maxInputFilesPerCommand; firstFileNextExec++) {
- cmdLength += getTotalArgumentLengthForInputFile(outputDir,
- sourceFiles[firstFileNextExec]);
- if (cmdLength >= getMaximumCommandLength())
- break;
- }
- if (firstFileNextExec == sourceIndex) {
- throw new BuildException(
- "Extremely long file name, can't fit on command line");
- }
- int argCount = args.length + 1 + endArgs.length
- + (firstFileNextExec - sourceIndex)
- * argumentCountPerInputFile;
- if (libtool) {
- argCount++;
- }
- String[] commandline = new String[argCount];
- int index = 0;
- if (libtool) {
- commandline[index++] = "libtool";
- }
- commandline[index++] = command;
- for (int j = 0; j < args.length; j++) {
- commandline[index++] = args[j];
- }
- for (int j = sourceIndex; j < firstFileNextExec; j++) {
- for (int k = 0; k < argumentCountPerInputFile; k++) {
- commandline[index++] = getInputFileArgument(outputDir,
- sourceFiles[j], k);
- }
- }
- for (int j = 0; j < endArgs.length; j++) {
- commandline[index++] = endArgs[j];
- }
- int retval = runCommand(task, outputDir, commandline);
- if (monitor != null) {
- String[] fileNames = new String[firstFileNextExec - sourceIndex];
- for (int j = 0; j < fileNames.length; j++) {
- fileNames[j] = sourceFiles[sourceIndex + j];
- }
- monitor.progress(fileNames);
- }
- //
- // if the process returned a failure code and
- // we aren't holding an exception from an earlier
- // interation
- if (retval != 0 && exc == null) {
- //
- // construct the exception
- //
- exc = new BuildException(this.getCommand()
- + " failed with return code " + retval, task
- .getLocation());
- //
- // and throw it now unless we are relentless
- //
- if (!relentless) {
- throw exc;
- }
- }
- sourceIndex = firstFileNextExec;
- }
- //
- // if the compiler returned a failure value earlier
- // then throw an exception
- if (exc != null) {
- throw exc;
- }
- }
- protected CompilerConfiguration createConfiguration(final CCTask task,
- final LinkType linkType,
- final ProcessorDef[] baseDefs,
- final CompilerDef specificDef,
- final TargetDef targetPlatform,
- final VersionInfo versionInfo) {
- Vector args = new Vector();
- CompilerDef[] defaultProviders = new CompilerDef[baseDefs.length + 1];
- for (int i = 0; i < baseDefs.length; i++) {
- defaultProviders[i + 1] = (CompilerDef) baseDefs[i];
- }
- defaultProviders[0] = specificDef;
- Vector cmdArgs = new Vector();
- //
- // add command line arguments inherited from <cc> element
- // any "extends" and finally the specific CompilerDef
- CommandLineArgument[] commandArgs;
- for (int i = defaultProviders.length - 1; i >= 0; i--) {
- commandArgs = defaultProviders[i].getActiveProcessorArgs();
- for (int j = 0; j < commandArgs.length; j++) {
- if (commandArgs[j].getLocation() == 0) {
- args.addElement(commandArgs[j].getValue());
- } else {
- cmdArgs.addElement(commandArgs[j]);
- }
- }
- }
- Vector params = new Vector();
- //
- // add command line arguments inherited from <cc> element
- // any "extends" and finally the specific CompilerDef
- ProcessorParam[] paramArray;
- for (int i = defaultProviders.length - 1; i >= 0; i--) {
- paramArray = defaultProviders[i].getActiveProcessorParams();
- for (int j = 0; j < paramArray.length; j++) {
- params.add(paramArray[j]);
- }
- }
- paramArray = (ProcessorParam[]) (params
- .toArray(new ProcessorParam[params.size()]));
- boolean multithreaded = specificDef.getMultithreaded(defaultProviders,
- 1);
- boolean debug = specificDef.getDebug(baseDefs, 0);
- boolean exceptions = specificDef.getExceptions(defaultProviders, 1);
- Boolean rtti = specificDef.getRtti(defaultProviders, 1);
- OptimizationEnum optimization = specificDef.getOptimization(defaultProviders, 1);
- this.addImpliedArgs(args, debug, multithreaded, exceptions, linkType, rtti, optimization);
- //
- // add all appropriate defines and undefines
- //
- buildDefineArguments(defaultProviders, args);
- //
- // Want to have distinct set of arguments with relative
- // path names for includes that are used to build
- // the configuration identifier
- //
- Vector relativeArgs = (Vector) args.clone();
- //
- // add all active include and sysincludes
- //
- StringBuffer includePathIdentifier = new StringBuffer();
- File baseDir = specificDef.getProject().getBaseDir();
- String baseDirPath;
- try {
- baseDirPath = baseDir.getCanonicalPath();
- } catch (IOException ex) {
- baseDirPath = baseDir.toString();
- }
- Vector includePath = new Vector();
- Vector sysIncludePath = new Vector();
- for (int i = defaultProviders.length - 1; i >= 0; i--) {
- String[] incPath = defaultProviders[i].getActiveIncludePaths();
- for (int j = 0; j < incPath.length; j++) {
- includePath.addElement(incPath[j]);
- }
- incPath = defaultProviders[i].getActiveSysIncludePaths();
- for (int j = 0; j < incPath.length; j++) {
- sysIncludePath.addElement(incPath[j]);
- }
- }
- File[] incPath = new File[includePath.size()];
- for (int i = 0; i < includePath.size(); i++) {
- incPath[i] = new File((String) includePath.elementAt(i));
- }
- File[] sysIncPath = new File[sysIncludePath.size()];
- for (int i = 0; i < sysIncludePath.size(); i++) {
- sysIncPath[i] = new File((String) sysIncludePath.elementAt(i));
- }
- addIncludes(baseDirPath, incPath, args, relativeArgs,
- includePathIdentifier);
- addIncludes(baseDirPath, sysIncPath, args, null, null);
- StringBuffer buf = new StringBuffer(getIdentifier());
- for (int i = 0; i < relativeArgs.size(); i++) {
- buf.append(relativeArgs.elementAt(i));
- buf.append(' ');
- }
- buf.setLength(buf.length() - 1);
- String configId = buf.toString();
- int warnings = specificDef.getWarnings(defaultProviders, 0);
- addWarningSwitch(args, warnings);
- Enumeration argEnum = cmdArgs.elements();
- int endCount = 0;
- while (argEnum.hasMoreElements()) {
- CommandLineArgument arg = (CommandLineArgument) argEnum
- .nextElement();
- switch (arg.getLocation()) {
- case 1 :
- args.addElement(arg.getValue());
- break;
- case 2 :
- endCount++;
- break;
- }
- }
- String[] endArgs = new String[endCount];
- argEnum = cmdArgs.elements();
- int index = 0;
- while (argEnum.hasMoreElements()) {
- CommandLineArgument arg = (CommandLineArgument) argEnum
- .nextElement();
- if (arg.getLocation() == 2) {
- endArgs[index++] = arg.getValue();
- }
- }
- String[] argArray = new String[args.size()];
- args.copyInto(argArray);
- boolean rebuild = specificDef.getRebuild(baseDefs, 0);
- File[] envIncludePath = getEnvironmentIncludePath();
- return new CommandLineCompilerConfiguration(this, configId, incPath,
- sysIncPath, envIncludePath, includePathIdentifier.toString(),
- argArray, paramArray, rebuild, endArgs);
- }
- protected int getArgumentCountPerInputFile() {
- return 1;
- }
- protected final String getCommand() {
- return command;
- }
- abstract protected void getDefineSwitch(StringBuffer buffer, String define,
- String value);
- protected abstract File[] getEnvironmentIncludePath();
- public String getIdentifier() {
- if (identifier == null) {
- if (identifierArg == null) {
- identifier = getIdentifier(new String[]{command}, command);
- } else {
- identifier = getIdentifier(
- new String[]{command, identifierArg}, command);
- }
- }
- return identifier;
- }
- abstract protected String getIncludeDirSwitch(String source);
- protected String getInputFileArgument(File outputDir, String filename,
- int index) {
- //
- // if there is an embedded space,
- // must enclose in quotes
- if (filename.indexOf(' ') >= 0) {
- StringBuffer buf = new StringBuffer("\"");
- buf.append(filename);
- buf.append("\"");
- return buf.toString();
- }
- return filename;
- }
- protected final boolean getLibtool() {
- return libtool;
- }
- /**
- * Obtains the same compiler, but with libtool set
- *
- * Default behavior is to ignore libtool
- */
- public final CommandLineCompiler getLibtoolCompiler() {
- if (libtoolCompiler != null) {
- return libtoolCompiler;
- }
- return this;
- }
- abstract public int getMaximumCommandLength();
- protected int getMaximumInputFilesPerCommand() {
- return Integer.MAX_VALUE;
- }
- protected int getTotalArgumentLengthForInputFile(File outputDir,
- String inputFile) {
- return inputFile.length() + 1;
- }
- abstract protected void getUndefineSwitch(StringBuffer buffer, String define);
- /**
- * This method is exposed so test classes can overload and test the
- * arguments without actually spawning the compiler
- */
- protected int runCommand(CCTask task, File workingDir, String[] cmdline)
- throws BuildException {
- return CUtil.runCommand(task, workingDir, cmdline, newEnvironment, env);
- }
- protected final void setCommand(String command) {
- this.command = command;
- }
-}