diff options
Diffstat (limited to 'src')
30 files changed, 232 insertions, 88 deletions
diff --git a/src/net/sf/antcontrib/cpptasks/CCTask.java b/src/net/sf/antcontrib/cpptasks/CCTask.java index beeed89..d5c9f2e 100644 --- a/src/net/sf/antcontrib/cpptasks/CCTask.java +++ b/src/net/sf/antcontrib/cpptasks/CCTask.java @@ -152,6 +152,7 @@ public class CCTask extends Task { } /** The compiler definitions. */ private Vector _compilers = new Vector(); + private CompilerEnum compilerName; /** The output file type. */ // private LinkType _linkType = LinkType.EXECUTABLE; /** The library sets. */ @@ -208,6 +209,10 @@ public class CCTask extends Task { */ private String outputFileProperty; /** + * The prefix to append to the outputFileProperty. + */ + private String outputFilePrefixProperty; + /** * if relentless = true, compilations should attempt to compile as many * files as possible before throwing a BuildException */ @@ -424,11 +429,14 @@ public class CCTask extends Task { FileVisitor objCollector = null; FileVisitor sysLibraryCollector = null; for (int i = 0; i < _linkers.size(); i++) { - LinkerDef currentLinkerDef = (LinkerDef) _linkers.elementAt(i); + LinkerDef currentLinkerDef = (LinkerDef) _linkers.elementAt(i); if (currentLinkerDef.isActive()) { - selectedLinkerDef = currentLinkerDef; - selectedLinker = currentLinkerDef.getProcessor().getLinker( - linkType); + + selectedLinkerDef = currentLinkerDef; + if(null != outputFilePrefixProperty){ + selectedLinkerDef.getLinker().setOutputFilePrefix(outputFilePrefixProperty); + } + selectedLinker = currentLinkerDef.getProcessor().getLinker(linkType); // // skip the linker if it doesn't know how to // produce the specified link type @@ -463,8 +471,12 @@ public class CCTask extends Task { } if (linkerConfig == null) { linkerConfig = linkerDef.createConfiguration(this, linkType, null, targetPlatform, versionInfo); - selectedLinker = (Linker) linkerDef.getProcessor().getLinker( + + selectedLinker = (Linker) linkerDef.getLinker().getLinker( linkType); + if(null != outputFilePrefixProperty){ + selectedLinker.setOutputFilePrefix(outputFilePrefixProperty); + } objCollector = new ObjectFileCollector(selectedLinker, objectFiles); sysLibraryCollector = new SystemLibraryCollector(selectedLinker, sysLibraries); @@ -539,7 +551,14 @@ public class CCTask extends Task { * if someting goes wrong with the build */ public void execute() throws BuildException { - // + + compilerDef.setName(compilerName); + Processor compiler = compilerDef.getProcessor(); + Linker linker = compiler.getLinker(linkType); + linker.setOutputFilePrefix(outputFilePrefixProperty); + linkerDef.setProcessor(linker); + + // // if link type allowed objdir to be defaulted // provide it from outfile if (_objDir == null) { @@ -769,6 +788,7 @@ public class CCTask extends Task { log("Starting link"); LinkerConfiguration linkConfig = (LinkerConfiguration) linkTarget .getConfiguration(); + linkConfig.setOutputFilePrefix(outputFilePrefixProperty); if (failOnError) { linkConfig.link(this, linkTarget); } else { @@ -841,6 +861,9 @@ public class CCTask extends Task { File[] sysObjectFileArray = new File[sysObjectFiles.size()]; sysObjectFiles.copyInto(sysObjectFileArray); String baseName = _outfile.getName(); + + + linkerConfig.setOutputFilePrefix(outputFilePrefixProperty); String[] fullNames = linkerConfig.getOutputFileNames(baseName, versionInfo); File outputFile = new File(_outfile.getParent(), fullNames[0]); return new TargetInfo(linkerConfig, objectFileArray, @@ -1193,10 +1216,8 @@ public class CCTask extends Task { * */ public void setName(CompilerEnum name) { - compilerDef.setName(name); - Processor compiler = compilerDef.getProcessor(); - Linker linker = compiler.getLinker(linkType); - linkerDef.setProcessor(linker); + compilerName = name; + } /** * Do not propagate old environment when new environment variables are @@ -1246,6 +1267,15 @@ public class CCTask extends Task { this.outputFileProperty = outputFileProperty; } /** + * Sets the prefix for the output file. Default is dependent on the linker + * however many linkers prefix the output with lib if the output is a dynamic + * object. Setting this property to an empty string will remove this prefix. + */ + public void setOutputFilePrefix(String outputFilePrefixProperty){ + this.outputFilePrefixProperty = outputFilePrefixProperty; + } + + /** * Sets the output file type. Supported values "executable", "shared", and * "static". */ diff --git a/src/net/sf/antcontrib/cpptasks/LinkerDef.java b/src/net/sf/antcontrib/cpptasks/LinkerDef.java index af1d307..51f3165 100644 --- a/src/net/sf/antcontrib/cpptasks/LinkerDef.java +++ b/src/net/sf/antcontrib/cpptasks/LinkerDef.java @@ -281,6 +281,17 @@ public class LinkerDef extends ProcessorDef { } return linker; } + public Linker getLinker() { + Linker linker = (Linker) super.getProcessor(); + if (linker == null) { + linker = GccLinker.getInstance(); + } + if (getLibtool() && linker instanceof CommandLineLinker) { + CommandLineLinker cmdLineLinker = (CommandLineLinker) linker; + linker = cmdLineLinker.getLibtoolLinker(); + } + return linker; + } public int getStack(LinkerDef[] defaultProviders, int index) { if (isReference()) { return ((LinkerDef) getCheckedRef(LinkerDef.class, "LinkerDef")) diff --git a/src/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java b/src/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java index 65c430f..0efc1f6 100644 --- a/src/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java +++ b/src/net/sf/antcontrib/cpptasks/arm/ADSLibrarian.java @@ -40,7 +40,7 @@ public class ADSLibrarian extends CommandLineLinker { private ADSLibrarian() { super("armar",null, - new String[] { ".o" }, new String[0], ".lib", false, null); + new String[] { ".o" }, new String[0], "", ".lib", false, null); } /* (non-Javadoc) diff --git a/src/net/sf/antcontrib/cpptasks/arm/ADSLinker.java b/src/net/sf/antcontrib/cpptasks/arm/ADSLinker.java index fda52fa..6b42b5c 100644 --- a/src/net/sf/antcontrib/cpptasks/arm/ADSLinker.java +++ b/src/net/sf/antcontrib/cpptasks/arm/ADSLinker.java @@ -40,7 +40,7 @@ public class ADSLinker extends CommandLineLinker { } private ADSLinker(String outputSuffix) { super("armlink", "-vsn", new String[]{".o", ".lib", ".res"}, - new String[]{".map", ".pdb", ".lnk"}, outputSuffix, false, null); + new String[]{".map", ".pdb", ".lnk"}, "", outputSuffix, false, null); } /* * (non-Javadoc) diff --git a/src/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java b/src/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java index 75846a4..bf9ee13 100644 --- a/src/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java +++ b/src/net/sf/antcontrib/cpptasks/borland/BorlandLibrarian.java @@ -39,7 +39,7 @@ public class BorlandLibrarian extends CommandLineLinker { return instance; } private BorlandLibrarian() { - super("tlib", "--version", new String[]{".obj"}, new String[0], ".lib", false, + super("tlib", "--version", new String[]{".obj"}, new String[0], "", ".lib", false, null); } protected void addBase(long base, Vector args) { @@ -60,12 +60,12 @@ public class BorlandLibrarian extends CommandLineLinker { protected void addEntry(String entry, Vector args) { } - protected String getCommandFileSwitch(String cmdFile) {
- //
- // tlib requires quotes around paths containing -
- // ilink32 doesn't like them
- StringBuffer buf = new StringBuffer("@");
- BorlandProcessor.quoteFile(buf, cmdFile);
+ protected String getCommandFileSwitch(String cmdFile) { + // + // tlib requires quotes around paths containing - + // ilink32 doesn't like them + StringBuffer buf = new StringBuffer("@"); + BorlandProcessor.quoteFile(buf, cmdFile); return buf.toString(); } public File[] getLibraryPath() { @@ -182,8 +182,8 @@ public class BorlandLibrarian extends CommandLineLinker { protected String[] prepareResponseFile(File outputFile, String[] args) throws IOException { String[] cmdargs = BorlandProcessor.prepareResponseFile(outputFile, args, " & \n"); - cmdargs[cmdargs.length - 1] = getCommandFileSwitch(cmdargs[cmdargs.length -1]);
- return cmdargs;
+ cmdargs[cmdargs.length - 1] = getCommandFileSwitch(cmdargs[cmdargs.length -1]); + return cmdargs; } /** @@ -203,17 +203,17 @@ public class BorlandLibrarian extends CommandLineLinker { // build a new library super.link(task, outputFile, sourceFiles, config); } -
- /**
- * Encloses problematic file names within quotes.
- * @param buf string buffer
- * @param filename source file name
- * @returns filename potentially enclosed in quotes.
- */
- protected String quoteFilename(StringBuffer buf,String filename) {
- buf.setLength(0);
- BorlandProcessor.quoteFile(buf, filename);
- return buf.toString();
- }
+ + /** + * Encloses problematic file names within quotes. + * @param buf string buffer + * @param filename source file name + * @returns filename potentially enclosed in quotes. + */ + protected String quoteFilename(StringBuffer buf,String filename) { + buf.setLength(0); + BorlandProcessor.quoteFile(buf, filename); + return buf.toString(); + } } diff --git a/src/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java b/src/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java index 315761f..ea1a523 100644 --- a/src/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java +++ b/src/net/sf/antcontrib/cpptasks/borland/BorlandLinker.java @@ -43,7 +43,7 @@ public final class BorlandLinker extends CommandLineLinker { } private BorlandLinker(String outputSuffix) { super("ilink32", "-r", new String[]{".obj", ".lib", ".res"}, - new String[]{".map", ".pdb", ".lnk"}, outputSuffix, false, null); + new String[]{".map", ".pdb", ".lnk"}, "", outputSuffix, false, null); } protected void addBase(long base, Vector args) { if (base >= 0) { diff --git a/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java b/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java index 2488619..9522a4b 100644 --- a/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java +++ b/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLibrarian.java @@ -36,7 +36,7 @@ public class CompaqVisualFortranLibrarian extends CommandLineLinker { return instance; } private CompaqVisualFortranLibrarian() { - super("lib", "/bogus", new String[]{".obj"}, new String[0], ".lib", + super("lib", "/bogus", new String[]{".obj"}, new String[0], "", ".lib", false, null); } protected void addBase(long base, Vector args) { diff --git a/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java b/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java index c8930f9..001d833 100644 --- a/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java +++ b/src/net/sf/antcontrib/cpptasks/compaq/CompaqVisualFortranLinker.java @@ -34,7 +34,7 @@ public final class CompaqVisualFortranLinker extends DevStudioCompatibleLinker { return instance; } private CompaqVisualFortranLinker(String outputSuffix) { - super("DF", "__bogus__.xxx", outputSuffix); + super("DF", "__bogus__.xxx", "", outputSuffix); } protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args) { args.addElement("/NOLOGO"); diff --git a/src/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java b/src/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java index e61bd64..a572930 100644 --- a/src/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java +++ b/src/net/sf/antcontrib/cpptasks/compiler/AbstractCompiler.java @@ -41,6 +41,7 @@ public abstract class AbstractCompiler extends AbstractProcessor Compiler { private static final String[] emptyIncludeArray = new String[0]; private String outputSuffix; + private static String outputFilePrefix; protected AbstractCompiler(String[] sourceExtensions, String[] headerExtensions, String outputSuffix) { super(sourceExtensions, headerExtensions); @@ -205,4 +206,8 @@ public abstract class AbstractCompiler extends AbstractProcessor } return false; } + + public void setOutputFilePrefix(String outputFilePrefix){ + this.outputFilePrefix = outputFilePrefix; + } } diff --git a/src/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java b/src/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java index 9de9491..5b5beaf 100644 --- a/src/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java +++ b/src/net/sf/antcontrib/cpptasks/compiler/AbstractLinker.java @@ -32,8 +32,11 @@ import org.apache.tools.ant.types.Environment; * @author Adam Murdoch */ public abstract class AbstractLinker extends AbstractProcessor - implements - Linker { + implements Linker { + + protected static String outputFilePrefix = null; + + public AbstractLinker(String[] objExtensions, String[] ignoredExtensions) { super(objExtensions, ignoredExtensions); } @@ -64,13 +67,16 @@ public abstract class AbstractLinker extends AbstractProcessor } return bid; } + public Processor changeEnvironment(boolean newEnvironment, Environment env) { return this; } + abstract protected LinkerConfiguration createConfiguration(CCTask task, LinkType linkType, ProcessorDef[] baseConfigs, LinkerDef specificConfig, TargetDef targetPlatform, VersionInfo versionInfo); + public ProcessorConfiguration createConfiguration(CCTask task, LinkType linkType, ProcessorDef[] baseConfigs, ProcessorDef specificConfig, @@ -82,11 +88,17 @@ public abstract class AbstractLinker extends AbstractProcessor return createConfiguration(task, linkType, baseConfigs, (LinkerDef) specificConfig, targetPlatform, versionInfo); } + public String getLibraryKey(File libfile) { return libfile.getName(); } + public abstract String[] getOutputFileNames(String fileName, VersionInfo versionInfo); + public void setOutputFilePrefix(String outputFilePrefix){ + this.outputFilePrefix = outputFilePrefix; + + } /** * Adds source or object files to the bidded fileset to diff --git a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java b/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java index 38492ea..2295a5c 100644 --- a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java +++ b/src/net/sf/antcontrib/cpptasks/compiler/CommandLineCompilerConfiguration.java @@ -47,6 +47,7 @@ public final class CommandLineCompilerConfiguration private/* final */ProcessorParam[] params; private/* final */boolean rebuild; private/* final */File[] sysIncludePath; + private static String outputFilePrefix; public CommandLineCompilerConfiguration(CommandLineCompiler compiler, String identifier, File[] includePath, File[] sysIncludePath, File[] envIncludePath, String includePathIdentifier, String[] args, @@ -223,4 +224,7 @@ public final class CommandLineCompilerConfiguration public String getCommand() { return compiler.getCommand(); } + public void setOutputFilePrefix(String outputFilePrefix){ + this.outputFilePrefix = outputFilePrefix; + } } diff --git a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java b/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java index f9e4761..52b0d67 100644 --- a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java +++ b/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinker.java @@ -54,17 +54,25 @@ public abstract class CommandLineLinker extends AbstractLinker private boolean newEnvironment = false; private String outputSuffix; + protected String outputPrefix; + + public void setOutputPrefix(String outputPrefix){ + this.outputPrefix = outputPrefix; + } + + /** Creates a comand line linker invocation */ public CommandLineLinker(String command, String identifierArg, String[] extensions, - String[] ignoredExtensions, String outputSuffix, + String[] ignoredExtensions, String outputPrefix, String outputSuffix, boolean isLibtool, CommandLineLinker libtoolLinker) { super(extensions, ignoredExtensions); this.command = command; this.identifierArg = identifierArg; + this.outputPrefix = outputPrefix; this.outputSuffix = outputSuffix; this.isLibtool = isLibtool; this.libtoolLinker = libtoolLinker; diff --git a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java b/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java index f0aad67..d67ffd3 100644 --- a/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java +++ b/src/net/sf/antcontrib/cpptasks/compiler/CommandLineLinkerConfiguration.java @@ -87,8 +87,13 @@ public final class CommandLineLinkerConfiguration return map; } public String[] getOutputFileNames(String inputFile, VersionInfo versionInfo) { - return linker.getOutputFileNames(inputFile, versionInfo); + return linker.getOutputFileNames(inputFile, versionInfo); } + + public void setOutputFilePrefix(String outputFilePrefix) { + linker.setOutputFilePrefix(outputFilePrefix); + } + public LinkerParam getParam(String name) { for (int i = 0; i < params.length; i++) { if (name.equals(params[i].getName())) diff --git a/src/net/sf/antcontrib/cpptasks/compiler/Linker.java b/src/net/sf/antcontrib/cpptasks/compiler/Linker.java index 672a0e3..32c29ef 100644 --- a/src/net/sf/antcontrib/cpptasks/compiler/Linker.java +++ b/src/net/sf/antcontrib/cpptasks/compiler/Linker.java @@ -77,4 +77,6 @@ public interface Linker extends Processor { final boolean isDebug, final File objDir, final TargetMatcher matcher) throws IOException; + + public void setOutputFilePrefix(String outputFilePrefix); } diff --git a/src/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java b/src/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java index ff7ac5d..c6fe2dc 100644 --- a/src/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java +++ b/src/net/sf/antcontrib/cpptasks/compiler/LinkerConfiguration.java @@ -28,6 +28,7 @@ import org.apache.tools.ant.BuildException; public interface LinkerConfiguration extends ProcessorConfiguration { public LinkerParam getParam(String name); void link(CCTask task, TargetInfo linkTarget) throws BuildException; + public void setOutputFilePrefix(String outputFilePrefix); Linker getLinker(); boolean isDebug(); } diff --git a/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java b/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java index 985dfcf..f0f7bb8 100644 --- a/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java +++ b/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLibrarian.java @@ -30,7 +30,7 @@ import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum; public abstract class DevStudioCompatibleLibrarian extends CommandLineLinker { public DevStudioCompatibleLibrarian(String command, String identifierArg) { super(command, identifierArg, new String[]{".obj"}, new String[0], - ".lib", false, null); + "", ".lib", false, null); } protected void addBase(long base, Vector args) { } diff --git a/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java b/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java index c21a6f6..07a0aea 100644 --- a/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java +++ b/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioCompatibleLinker.java @@ -35,9 +35,9 @@ import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum; */ public abstract class DevStudioCompatibleLinker extends CommandLineLinker { public DevStudioCompatibleLinker(String command, String identifierArg, - String outputSuffix) { + String outputPrefix, String outputSuffix) { super(command, identifierArg, new String[]{".obj", ".lib", ".res"}, - new String[]{".map", ".pdb", ".lnk", ".dll"}, outputSuffix, + new String[]{".map", ".pdb", ".lnk", ".dll"}, outputPrefix, outputSuffix, false, null); } protected void addBase(long base, Vector args) { diff --git a/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java b/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java index 826074b..be89bfa 100644 --- a/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java +++ b/src/net/sf/antcontrib/cpptasks/devstudio/DevStudioLinker.java @@ -30,7 +30,7 @@ public final class DevStudioLinker extends DevStudioCompatibleLinker { return instance; } private DevStudioLinker(String outputSuffix) { - super("link", "/DLL", outputSuffix); + super("link", "/DLL", "", outputSuffix); } public Linker getLinker(LinkType type) { if (type.isSharedLibrary()) { diff --git a/src/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java b/src/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java index 2e8d4af..45a8100 100644 --- a/src/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java +++ b/src/net/sf/antcontrib/cpptasks/gcc/AbstractArLibrarian.java @@ -33,15 +33,13 @@ import org.apache.tools.ant.BuildException; * @author Curt Arnold */ public abstract class AbstractArLibrarian extends CommandLineLinker { - private/* final */ - String outputPrefix; + protected AbstractArLibrarian(String command, String identificationArg, String[] inputExtensions, String[] ignoredExtensions, String outputPrefix, String outputExtension, boolean isLibtool, AbstractArLibrarian libtoolLibrarian) { - super(command, identificationArg, inputExtensions, ignoredExtensions, - outputExtension, isLibtool, libtoolLibrarian); - this.outputPrefix = outputPrefix; + super(command, identificationArg, inputExtensions, ignoredExtensions, + outputPrefix, outputExtension, isLibtool, libtoolLibrarian); } public void addBase(long base, Vector args) { } diff --git a/src/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java b/src/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java index a210e7e..1465198 100644 --- a/src/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java +++ b/src/net/sf/antcontrib/cpptasks/gcc/AbstractLdLinker.java @@ -33,14 +33,14 @@ import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum; * @author Curt Arnold */ public abstract class AbstractLdLinker extends CommandLineLinker { - private String outputPrefix; + + protected AbstractLdLinker(String command, String identifierArg, String[] extensions, String[] ignoredExtensions, String outputPrefix, String outputSuffix, boolean isLibtool, AbstractLdLinker libtoolLinker) { - super(command, identifierArg, extensions, ignoredExtensions, + super(command, identifierArg, extensions, ignoredExtensions, outputPrefix, outputSuffix, isLibtool, libtoolLinker); - this.outputPrefix = outputPrefix; } public void addBase(long base, Vector args) { if (base >= 0) { @@ -235,12 +235,19 @@ public abstract class AbstractLdLinker extends CommandLineLinker { public int getMaximumCommandLength() { return Integer.MAX_VALUE; } + + public String[] getOutputFileNames(String baseName, VersionInfo versionInfo) { String[] baseNames = super.getOutputFileNames(baseName, versionInfo); - if (outputPrefix.length() > 0) { + String currentOutputPrefix = ""; + if(null != outputFilePrefix) + currentOutputPrefix = outputFilePrefix; + else + currentOutputPrefix = outputPrefix; + if (outputPrefix.length() > 0) { for(int i = 0; i < baseNames.length; i++) { - baseNames[i] = outputPrefix + baseNames[i]; - } + baseNames[i] = currentOutputPrefix + baseNames[i]; + } } return baseNames; } diff --git a/src/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java b/src/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java index 999ccf7..d58d1b3 100644 --- a/src/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java +++ b/src/net/sf/antcontrib/cpptasks/gcc/GccCCompiler.java @@ -234,7 +234,8 @@ public final class GccCCompiler extends GccCompatibleCCompiler { return identifier; } public Linker getLinker(LinkType linkType) { - return GccLinker.getInstance().getLinker(linkType); + GccLinker linker = GccLinker.getInstance(); + return linker.getLinker(linkType); } public int getMaximumCommandLength() { return Integer.MAX_VALUE; diff --git a/src/net/sf/antcontrib/cpptasks/gcc/GccLinker.java b/src/net/sf/antcontrib/cpptasks/gcc/GccLinker.java index c4720c8..6fff653 100644 --- a/src/net/sf/antcontrib/cpptasks/gcc/GccLinker.java +++ b/src/net/sf/antcontrib/cpptasks/gcc/GccLinker.java @@ -28,32 +28,59 @@ import net.sf.antcontrib.cpptasks.compiler.Linker; */ public class GccLinker extends AbstractLdLinker { private static final String[] discardFiles = new String[0]; + private static final String[] objFiles = new String[]{".o", ".a", ".lib", ".dll", ".so", ".sl"}; + private static final String[] libtoolObjFiles = new String[]{".fo", ".a", ".lib", ".dll", ".so", ".sl"}; + private static String[] linkerOptions = new String[]{"-bundle", "-dynamiclib", "-nostartfiles", "-nostdlib", "-prebind", "-s", "-static", "-shared", "-symbolic", "-Xlinker", "--export-all-symbols", "-static-libgcc",}; - private static final GccLinker dllLinker = new GccLinker("gcc", objFiles, - discardFiles, "lib", ".so", false, new GccLinker("gcc", objFiles, - discardFiles, "lib", ".so", true, null)); - private static final GccLinker instance = new GccLinker("gcc", objFiles, - discardFiles, "", "", false, null); - private static final GccLinker machBundleLinker = new GccLinker("gcc", - objFiles, discardFiles, "lib", ".bundle", false, null); - private static final GccLinker machDllLinker = new GccLinker("gcc", - objFiles, discardFiles, "lib", ".dylib", false, null); + + private static GccLinker dllLinker; + private static Object dllLinkerGaurd = new Object(); //used as a gaurd for dllLinker since you can't synchronize on a null + + private static GccLinker instance; + private static Object instanceGaurd = new Object();//used as a gaurd for instance + + private static GccLinker machBundleLinker; + private static Object machBundleLinkerGaurd = new Object(); + + + private static GccLinker machDllLinker; + private static Object machDllLinkerGaurd = new Object(); + public static GccLinker getInstance() { + String currentOutputFilePrefix = outputFilePrefix == null ? "lib" : outputFilePrefix; + synchronized (instanceGaurd) + { + if (null == instance) + instance = new GccLinker("gcc", objFiles, discardFiles, currentOutputFilePrefix, "", false, null); + } return instance; } + + public static GccLinker getInstance(String outputFilePrefix) { + String currentOutputFilePrefix = outputFilePrefix == null ? "lib" : outputFilePrefix; + synchronized (instanceGaurd) + { + if (null == instance) + instance = new GccLinker("gcc", objFiles, discardFiles, currentOutputFilePrefix, "", false, null); + } + return instance; + } + private File[] libDirs; protected GccLinker(String command, String[] extensions, String[] ignoredExtensions, String outputPrefix, String outputSuffix, boolean isLibtool, GccLinker libtoolLinker) { + super(command, "-dumpversion", extensions, ignoredExtensions, outputPrefix, outputSuffix, isLibtool, libtoolLinker); + } protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args) { super.addImpliedArgs(debug, linkType, args); @@ -188,23 +215,60 @@ public class GccLinker extends AbstractLdLinker { return libDirs; } public Linker getLinker(LinkType type) { + String currentOutputFilePrefix = outputFilePrefix == null ? "lib" : outputFilePrefix; if (type.isStaticLibrary()) { return GccLibrarian.getInstance(); } + //The seemingly heavy use of synchronized here is because of the late instanciation of a number of linkers. This, in turn, + //is to allow for setting the prefix if (type.isPluginModule()) { if (isDarwin()) { - return machBundleLinker; + synchronized(machBundleLinkerGaurd)//used as a gaurd for machBundleLinker since you can't synchronize on a null + { + if(null == machBundleLinker){ + machBundleLinker = new GccLinker("gcc", objFiles, discardFiles, currentOutputFilePrefix, ".bundle", false, null); + } + } + return machBundleLinker; + } else { - return dllLinker; + synchronized(dllLinkerGaurd)//used as a gaurd for dllLinker since you can't synchronize on a null + { + if(null == dllLinker){ + dllLinker = new GccLinker("gcc", objFiles, discardFiles, + "lib", ".so", false, + new GccLinker("gcc", objFiles, discardFiles, currentOutputFilePrefix, ".so", true, null)); + } + } + return dllLinker; } } if (type.isSharedLibrary()) { if (isDarwin()) { - return machDllLinker; + synchronized(machDllLinkerGaurd)//used as a gaurd for machDllLinker since you can't synchronize on a null + { + if(null == machDllLinker){ + machDllLinker = new GccLinker("gcc", objFiles, discardFiles, currentOutputFilePrefix, ".dylib", false, null);; + } + } + return machDllLinker; + + + } else { - return dllLinker; + synchronized(dllLinkerGaurd)//used as a gaurd for dllLinker since you can't synchronize on a null + { + if(null == dllLinker){ + dllLinker = new GccLinker("gcc", objFiles, discardFiles, + "lib", ".so", false, + new GccLinker("gcc", objFiles, discardFiles, currentOutputFilePrefix, ".so", true, null)); + } + } + return dllLinker; + } } - return instance; + return getInstance(); } + } diff --git a/src/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java b/src/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java index 66009f0..8700c42 100644 --- a/src/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java +++ b/src/net/sf/antcontrib/cpptasks/intel/IntelWin32Linker.java @@ -32,7 +32,7 @@ public final class IntelWin32Linker extends DevStudioCompatibleLinker { return instance; } private IntelWin32Linker(String outputSuffix) { - super("xilink", "-qv", outputSuffix); + super("xilink", "-qv", "", outputSuffix); } public Linker getLinker(LinkType type) { if (type.isStaticLibrary()) { diff --git a/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLibrarian.java b/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLibrarian.java index 848c395..d0e09fd 100644 --- a/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLibrarian.java +++ b/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLibrarian.java @@ -51,7 +51,7 @@ public final class OpenWatcomLibrarian */ private OpenWatcomLibrarian() { super("wlib", null, new String[] {".obj"} - , new String[0], ".lib", false, + , new String[0], "", ".lib", false, null); } diff --git a/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLinker.java b/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLinker.java index f0bbe3d..6daaebb 100644 --- a/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLinker.java +++ b/src/net/sf/antcontrib/cpptasks/openwatcom/OpenWatcomLinker.java @@ -44,7 +44,7 @@ public abstract class OpenWatcomLinker final String outputSuffix) { super(command, "-r", new String[] {".obj", ".lib", ".res"} , - new String[] {".map", ".pdb", ".lnk"} + new String[] {".map", ".pdb", ".lnk"}, "" , outputSuffix, false, null); } diff --git a/src/net/sf/antcontrib/cpptasks/os390/OS390Linker.java b/src/net/sf/antcontrib/cpptasks/os390/OS390Linker.java index 9c4f845..5c66acf 100644 --- a/src/net/sf/antcontrib/cpptasks/os390/OS390Linker.java +++ b/src/net/sf/antcontrib/cpptasks/os390/OS390Linker.java @@ -48,18 +48,15 @@ public final class OS390Linker extends CommandLineLinker { } private boolean isADatasetLinker; File outputFile; - private String outputPrefix; CCTask task; private OS390Linker() { super("cxx", "/bogus", new String[]{".o", ".a", ".lib", ".xds"}, - new String[]{".dll", ".x"}, ".xds", false, null); - this.outputPrefix = ""; + new String[]{".dll", ".x"}, "", ".xds", false, null); this.isADatasetLinker = true; } private OS390Linker(String outputPrefix, String outputSuffix) { super("cxx", "/bogus", new String[]{".o", ".a", ".lib", ".x"}, - new String[]{".dll"}, outputSuffix, false, null); - this.outputPrefix = outputPrefix; + new String[]{".dll"}, outputPrefix, outputSuffix, false, null); this.isADatasetLinker = false; } protected void addBase(long base, Vector args) { diff --git a/src/net/sf/antcontrib/cpptasks/os400/IccLinker.java b/src/net/sf/antcontrib/cpptasks/os400/IccLinker.java index ea10bcc..62407a8 100644 --- a/src/net/sf/antcontrib/cpptasks/os400/IccLinker.java +++ b/src/net/sf/antcontrib/cpptasks/os400/IccLinker.java @@ -46,18 +46,17 @@ public final class IccLinker extends CommandLineLinker { } private boolean isADatasetLinker; File outputFile; - private String outputPrefix; + CCTask task; private IccLinker() { super("icc", "/bogus", new String[]{".o", ".a", ".lib", ".xds"}, - new String[]{".dll", ".x"}, ".xds", false, null); - this.outputPrefix = ""; + new String[]{".dll", ".x"}, "", ".xds", false, null); + this.isADatasetLinker = true; } private IccLinker(String outputPrefix, String outputSuffix) { super("icc", "/bogus", new String[]{".o", ".a", ".lib", ".x"}, - new String[]{".dll"}, outputSuffix, false, null); - this.outputPrefix = outputPrefix; + new String[]{".dll"}, outputPrefix, outputSuffix, false, null); this.isADatasetLinker = false; } protected void addBase(long base, Vector args) { diff --git a/src/net/sf/antcontrib/cpptasks/sun/C89Linker.java b/src/net/sf/antcontrib/cpptasks/sun/C89Linker.java index 6c41c89..22290fd 100644 --- a/src/net/sf/antcontrib/cpptasks/sun/C89Linker.java +++ b/src/net/sf/antcontrib/cpptasks/sun/C89Linker.java @@ -38,11 +38,11 @@ public final class C89Linker extends CommandLineLinker { public static C89Linker getInstance() { return instance; } - private String outputPrefix; + private C89Linker(String outputPrefix, String outputSuffix) { super("ld", "/bogus", new String[]{".o", ".a", ".lib", ".x"}, - new String[]{}, outputSuffix, false, null); - this.outputPrefix = outputPrefix; + new String[]{}, outputPrefix, outputSuffix, false, null); + } protected void addBase(long base, Vector args) { } diff --git a/src/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java b/src/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java index c48815a..2dc9002 100644 --- a/src/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java +++ b/src/net/sf/antcontrib/cpptasks/ti/ClxxLibrarian.java @@ -39,7 +39,7 @@ public class ClxxLibrarian extends CommandLineLinker { return cl6xInstance; } private ClxxLibrarian(String command) { - super(command, null, new String[]{".o"}, new String[0], ".lib", false, + super(command, null, new String[]{".o"}, new String[0], "", ".lib", false, null); } /* diff --git a/src/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java b/src/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java index bb644a4..b2976a3 100644 --- a/src/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java +++ b/src/net/sf/antcontrib/cpptasks/ti/ClxxLinker.java @@ -52,7 +52,7 @@ public class ClxxLinker extends CommandLineLinker { } private ClxxLinker(String command, String outputSuffix) { super(command, "-h", new String[]{".o", ".lib", ".res"}, new String[]{ - ".map", ".pdb", ".lnk"}, outputSuffix, false, null); + ".map", ".pdb", ".lnk"}, "", outputSuffix, false, null); } /* * (non-Javadoc) |