Restructuring for better separation of Tool packages.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1674 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -0,0 +1,106 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
|
||||
|
||||
import org.apache.tools.ant.BuildException;
|
||||
/**
|
||||
* Adapter for the "ar" tool
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
* @author Curt Arnold
|
||||
*/
|
||||
public abstract class AbstractArLibrarian extends CommandLineLinker {
|
||||
private/* final */
|
||||
String outputPrefix;
|
||||
private static String[] defaultflags = new String[]{};
|
||||
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;
|
||||
}
|
||||
public void addBase(long base, Vector args) {
|
||||
}
|
||||
public void addFixed(Boolean fixed, Vector args) {
|
||||
}
|
||||
public void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
|
||||
if(defaultflag != null && defaultflag.booleanValue()){
|
||||
for (int i = 0; i < defaultflags.length; i++) {
|
||||
args.addElement(defaultflags[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
public void addIncremental(boolean incremental, Vector args) {
|
||||
}
|
||||
public void addMap(boolean map, Vector args) {
|
||||
}
|
||||
public void addStack(int stack, Vector args) {
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
|
||||
*/
|
||||
protected void addEntry(String entry, Vector args) {
|
||||
}
|
||||
|
||||
public String getCommandFileSwitch(String commandFile) {
|
||||
return null;
|
||||
}
|
||||
public File[] getLibraryPath() {
|
||||
return new File[0];
|
||||
}
|
||||
public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
|
||||
return new String[0];
|
||||
}
|
||||
public int getMaximumCommandLength() {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
public String getOutputFileName(String baseName) {
|
||||
return outputPrefix + super.getOutputFileName(baseName);
|
||||
}
|
||||
public String[] getOutputFileSwitch(String outputFile) {
|
||||
return GccProcessor.getOutputFileSwitch("rvs", outputFile);
|
||||
}
|
||||
public boolean isCaseSensitive() {
|
||||
return true;
|
||||
}
|
||||
public void link(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
//
|
||||
// if there is an existing library then
|
||||
// we must delete it before executing "ar"
|
||||
if (outputFile.exists()) {
|
||||
if (!outputFile.delete()) {
|
||||
throw new BuildException("Unable to delete "
|
||||
+ outputFile.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
//
|
||||
// delegate to CommandLineLinker
|
||||
//
|
||||
super.link(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
@ -0,0 +1,323 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinker;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.types.LibrarySet;
|
||||
import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
|
||||
|
||||
/**
|
||||
* Abstract adapter for ld-like linkers
|
||||
*
|
||||
* @author Curt Arnold
|
||||
*/
|
||||
public abstract class AbstractLdLinker extends CommandLineLinker {
|
||||
private String outputPrefix;
|
||||
private static String[] defaultflags = new String[]{};
|
||||
protected AbstractLdLinker(String command, String identifierArg,
|
||||
String[] extensions, String[] ignoredExtensions,
|
||||
String outputPrefix, String outputSuffix, boolean isLibtool,
|
||||
AbstractLdLinker libtoolLinker) {
|
||||
super(command, identifierArg, extensions, ignoredExtensions,
|
||||
outputSuffix, isLibtool, libtoolLinker);
|
||||
this.outputPrefix = outputPrefix;
|
||||
}
|
||||
public void addBase(long base, Vector args) {
|
||||
if (base >= 0) {
|
||||
args.addElement("--image-base");
|
||||
args.addElement(Long.toHexString(base));
|
||||
}
|
||||
}
|
||||
public void addFixed(Boolean fixed, Vector args) {
|
||||
}
|
||||
protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
|
||||
if(defaultflag != null && defaultflag.booleanValue()){
|
||||
for (int i = 0; i < defaultflags.length; i++) {
|
||||
args.addElement(defaultflags[i]);
|
||||
}
|
||||
}
|
||||
if (debug) {
|
||||
args.addElement("-g");
|
||||
}
|
||||
if (isDarwin()) {
|
||||
if (linkType.isPluginModule()) {
|
||||
args.addElement("-bundle");
|
||||
} else {
|
||||
if (linkType.isSharedLibrary()) {
|
||||
args.addElement("-prebind");
|
||||
args.addElement("-dynamiclib");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (linkType.isStaticRuntime()) {
|
||||
args.addElement("-static");
|
||||
}
|
||||
if (linkType.isPluginModule()) {
|
||||
args.addElement("-shared");
|
||||
} else {
|
||||
if (linkType.isSharedLibrary()) {
|
||||
args.addElement("-shared");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void addIncremental(boolean incremental, Vector args) {
|
||||
if (incremental) {
|
||||
args.addElement("-i");
|
||||
}
|
||||
}
|
||||
protected int addLibraryPatterns(String[] libnames, StringBuffer buf,
|
||||
String prefix, String extension, String[] patterns, int offset) {
|
||||
for (int i = 0; i < libnames.length; i++) {
|
||||
buf.setLength(0);
|
||||
buf.append(prefix);
|
||||
buf.append(libnames[i]);
|
||||
buf.append(extension);
|
||||
patterns[offset + i] = buf.toString();
|
||||
}
|
||||
return offset + libnames.length;
|
||||
}
|
||||
public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
|
||||
Vector preargs, Vector midargs, Vector endargs) {
|
||||
Vector libnames = new Vector();
|
||||
super.addLibrarySets(task, libsets, preargs, midargs, endargs);
|
||||
LibraryTypeEnum previousLibraryType = null;
|
||||
for (int i = 0; i < libsets.length; i++) {
|
||||
LibrarySet set = libsets[i];
|
||||
File libdir = set.getDir(null);
|
||||
String[] libs = set.getLibs();
|
||||
if (libdir != null) {
|
||||
if (set.getType() != null &&
|
||||
"framework".equals(set.getType().getValue()) &&
|
||||
isDarwin()) {
|
||||
endargs.addElement("-F" + libdir.getAbsolutePath());
|
||||
} else {
|
||||
endargs.addElement("-L" + libdir.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
//
|
||||
// if there has been a change of library type
|
||||
//
|
||||
if (set.getType() != previousLibraryType) {
|
||||
if (set.getType() != null && "static".equals(set.getType().getValue())) {
|
||||
endargs.addElement("-Bstatic");
|
||||
previousLibraryType = set.getType();
|
||||
} else {
|
||||
if (set.getType() == null ||
|
||||
!"framework".equals(set.getType().getValue()) ||
|
||||
!isDarwin()) {
|
||||
endargs.addElement("-Bdynamic");
|
||||
previousLibraryType = set.getType();
|
||||
}
|
||||
}
|
||||
}
|
||||
StringBuffer buf = new StringBuffer("-l");
|
||||
if (set.getType() != null &&
|
||||
"framework".equals(set.getType().getValue()) &&
|
||||
isDarwin()) {
|
||||
buf.setLength(0);
|
||||
buf.append("-framework ");
|
||||
}
|
||||
int initialLength = buf.length();
|
||||
for (int j = 0; j < libs.length; j++) {
|
||||
//
|
||||
// reset the buffer to just "-l"
|
||||
//
|
||||
buf.setLength(initialLength);
|
||||
//
|
||||
// add the library name
|
||||
buf.append(libs[j]);
|
||||
libnames.addElement(libs[j]);
|
||||
//
|
||||
// add the argument to the list
|
||||
endargs.addElement(buf.toString());
|
||||
}
|
||||
}
|
||||
String rc[] = new String[libnames.size()];
|
||||
for (int i = 0; i < libnames.size(); i++) {
|
||||
rc[i] = (String) libnames.elementAt(i);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
public void addMap(boolean map, Vector args) {
|
||||
if (map) {
|
||||
args.addElement("-M");
|
||||
}
|
||||
}
|
||||
public void addStack(int stack, Vector args) {
|
||||
if (stack > 0) {
|
||||
args.addElement("--stack");
|
||||
args.addElement(Integer.toString(stack));
|
||||
}
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see net.sf.antcontrib.cpptasks.compiler.CommandLineLinker#addEntry(int, java.util.Vector)
|
||||
*/
|
||||
protected void addEntry(String entry, Vector args) {
|
||||
if (entry != null) {
|
||||
args.addElement("-e");
|
||||
args.addElement(entry);
|
||||
}
|
||||
}
|
||||
|
||||
public String getCommandFileSwitch(String commandFile) {
|
||||
throw new IllegalStateException("ld does not support command files");
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
protected File[] getEnvironmentIncludePath() {
|
||||
return CUtil.getPathFromEnvironment("LIB", ":");
|
||||
}
|
||||
public String getLibraryKey(File libfile) {
|
||||
String libname = libfile.getName();
|
||||
int lastDot = libname.lastIndexOf('.');
|
||||
if (lastDot >= 0) {
|
||||
return libname.substring(0, lastDot);
|
||||
}
|
||||
return libname;
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
public File[] getLibraryPath() {
|
||||
return new File[0];
|
||||
}
|
||||
public String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
int patternCount = libnames.length;
|
||||
if (libType == null) {
|
||||
patternCount *= 2;
|
||||
}
|
||||
String[] patterns = new String[patternCount];
|
||||
int offset = 0;
|
||||
if (libType == null || "static".equals(libType.getValue())) {
|
||||
offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
|
||||
}
|
||||
if (libType != null && "framework".equals(libType.getValue()) && isDarwin()) {
|
||||
for(int i = 0; i < libnames.length; i++) {
|
||||
buf.setLength(0);
|
||||
buf.append(libnames[i]);
|
||||
buf.append(".framework/");
|
||||
buf.append(libnames[i]);
|
||||
patterns[offset++] = buf.toString();
|
||||
}
|
||||
} else {
|
||||
if (libType == null || !"static".equals(libType.getValue())) {
|
||||
if (isHPUX()) {
|
||||
offset = addLibraryPatterns(libnames, buf, "lib", ".sl", patterns,
|
||||
offset);
|
||||
} else {
|
||||
offset = addLibraryPatterns(libnames, buf, "lib", ".so", patterns,
|
||||
offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
return patterns;
|
||||
}
|
||||
public int getMaximumCommandLength() {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
public String getOutputFileName(String baseName) {
|
||||
return outputPrefix + super.getOutputFileName(baseName);
|
||||
}
|
||||
public String[] getOutputFileSwitch(String outputFile) {
|
||||
return GccProcessor.getOutputFileSwitch("-o", outputFile);
|
||||
}
|
||||
public boolean isCaseSensitive() {
|
||||
return true;
|
||||
}
|
||||
protected boolean isHPUX() {
|
||||
String osname = System.getProperty("os.name").toLowerCase();
|
||||
if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Prepares argument list for exec command. Will return null if command
|
||||
* line would exceed allowable command line buffer.
|
||||
*
|
||||
* @param outputFile
|
||||
* linker output file
|
||||
* @param sourceFiles
|
||||
* linker input files (.obj, .o, .res)
|
||||
* @param args
|
||||
* linker arguments
|
||||
* @return arguments for runTask
|
||||
*/
|
||||
public String[] prepareArguments(CCTask task, String outputDir,
|
||||
String outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) {
|
||||
//
|
||||
// need to suppress sources that correspond to
|
||||
// library set entries since they are already
|
||||
// in the argument list
|
||||
String[] libnames = config.getLibraryNames();
|
||||
if (libnames == null || libnames.length == 0) {
|
||||
return super.prepareArguments(task, outputDir, outputFile,
|
||||
sourceFiles, config);
|
||||
}
|
||||
//
|
||||
//
|
||||
// null out any sources that correspond to library names
|
||||
//
|
||||
String[] localSources = (String[]) sourceFiles.clone();
|
||||
int extra = 0;
|
||||
for (int i = 0; i < libnames.length; i++) {
|
||||
String libname = libnames[i];
|
||||
for (int j = 0; j < localSources.length; j++) {
|
||||
if (localSources[j] != null
|
||||
&& localSources[j].indexOf(libname) > 0
|
||||
&& localSources[j].indexOf("lib") > 0) {
|
||||
String filename = new File(localSources[j]).getName();
|
||||
if (filename.startsWith("lib")
|
||||
&& filename.substring(3).startsWith(libname)) {
|
||||
String extension = filename
|
||||
.substring(libname.length() + 3);
|
||||
if (extension.equals(".a") || extension.equals(".so")
|
||||
|| extension.equals(".sl")) {
|
||||
localSources[j] = null;
|
||||
extra++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (extra == 0) {
|
||||
return super.prepareArguments(task, outputDir, outputFile,
|
||||
sourceFiles, config);
|
||||
}
|
||||
String[] finalSources = new String[localSources.length - extra];
|
||||
int index = 0;
|
||||
for (int i = 0; i < localSources.length; i++) {
|
||||
if (localSources[i] != null) {
|
||||
finalSources[index++] = localSources[i];
|
||||
}
|
||||
}
|
||||
return super.prepareArguments(task, outputDir, outputFile,
|
||||
finalSources, config);
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-2005 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.gcc;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineAssembler;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
|
||||
/**
|
||||
* Adapter for gcc assemble
|
||||
*
|
||||
*/
|
||||
public final class GccAssembler extends CommandLineAssembler {
|
||||
private final static String[] sourceExtensions = new String[] { ".asm" };
|
||||
|
||||
private final static String[] headerExtensions = new String[] { ".h",
|
||||
".inc" };
|
||||
|
||||
private static final GccAssembler instance = new GccAssembler("gas",
|
||||
sourceExtensions, headerExtensions, false);
|
||||
|
||||
/**
|
||||
* Gets gcc adapter
|
||||
*/
|
||||
public static GccAssembler getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private constructor. Use GccAssembler.getInstance() to get singleton
|
||||
* instance of this class.
|
||||
*/
|
||||
private GccAssembler (String command, String[] sourceExtensions,
|
||||
String[] headerExtensions, boolean isLibtool) {
|
||||
super(command, null, sourceExtensions, headerExtensions,
|
||||
isLibtool ? ".fo" : ".o");
|
||||
}
|
||||
|
||||
public void addImpliedArgs(Vector args, boolean debug, Boolean defaultflag) {
|
||||
|
||||
}
|
||||
|
||||
public int getMaximumCommandLength() {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
public Linker getLinker(LinkType linkType) {
|
||||
return GccLinker.getInstance().getLinker(linkType);
|
||||
}
|
||||
|
||||
protected File[] getEnvironmentIncludePath() {
|
||||
return CUtil.getPathFromEnvironment("INCLUDE", ":");
|
||||
}
|
||||
|
||||
protected String getIncludeDirSwitch(String includeDir) {
|
||||
return "-I" + includeDir;
|
||||
}
|
||||
}
|
@ -0,0 +1,243 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Processor;
|
||||
import net.sf.antcontrib.cpptasks.parser.CParser;
|
||||
import net.sf.antcontrib.cpptasks.parser.FortranParser;
|
||||
import net.sf.antcontrib.cpptasks.parser.Parser;
|
||||
|
||||
import org.apache.tools.ant.BuildException;
|
||||
import org.apache.tools.ant.types.Environment;
|
||||
import net.sf.antcontrib.cpptasks.OptimizationEnum;
|
||||
|
||||
/**
|
||||
* Adapter for the GCC C/C++ compiler
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
public final class GccCCompiler extends GccCompatibleCCompiler {
|
||||
private final static String[] sourceExtensions = new String[]{".c", /* C */
|
||||
".cc", /* C++ */
|
||||
".cpp", /* C++ */
|
||||
".cxx", /* C++ */
|
||||
".c++", /* C++ */
|
||||
".i", /* preprocessed C */
|
||||
".ii", /* preprocessed C++ */
|
||||
".f", /* FORTRAN */
|
||||
".for", /* FORTRAN */
|
||||
".m", /* Objective-C */
|
||||
".mm", /* Objected-C++ */
|
||||
".s" /* Assembly */
|
||||
};
|
||||
private final static String[] headerExtensions = new String[]{".h", ".hpp",
|
||||
".inl"};
|
||||
private static final GccCCompiler cppInstance = new GccCCompiler("c++",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("c++", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
private static final GccCCompiler g77Instance = new GccCCompiler("g77",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("g77", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
private static final GccCCompiler gppInstance = new GccCCompiler("g++",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("g++", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
private static final GccCCompiler instance = new GccCCompiler("gcc",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("gcc", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
/**
|
||||
* Gets c++ adapter
|
||||
*/
|
||||
public static GccCCompiler getCppInstance() {
|
||||
return cppInstance;
|
||||
}
|
||||
/**
|
||||
* Gets g77 adapter
|
||||
*/
|
||||
public static GccCCompiler getG77Instance() {
|
||||
return g77Instance;
|
||||
}
|
||||
/**
|
||||
* Gets gpp adapter
|
||||
*/
|
||||
public static GccCCompiler getGppInstance() {
|
||||
return gppInstance;
|
||||
}
|
||||
/**
|
||||
* Gets gcc adapter
|
||||
*/
|
||||
public static GccCCompiler getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private String identifier;
|
||||
private File[] includePath;
|
||||
private boolean isPICMeaningful = true;
|
||||
/**
|
||||
* Private constructor. Use GccCCompiler.getInstance() to get singleton
|
||||
* instance of this class.
|
||||
*/
|
||||
private GccCCompiler(String command, String[] sourceExtensions,
|
||||
String[] headerExtensions, boolean isLibtool,
|
||||
GccCCompiler libtoolCompiler, boolean newEnvironment,
|
||||
Environment env) {
|
||||
super(command, null, sourceExtensions, headerExtensions, isLibtool,
|
||||
libtoolCompiler, newEnvironment, env);
|
||||
isPICMeaningful = System.getProperty("os.name").indexOf("Windows") < 0;
|
||||
}
|
||||
public void addImpliedArgs(final Vector args,
|
||||
final boolean debug,
|
||||
final boolean multithreaded,
|
||||
final boolean exceptions,
|
||||
final LinkType linkType,
|
||||
final Boolean rtti,
|
||||
final OptimizationEnum optimization,
|
||||
final Boolean defaultflag) {
|
||||
super.addImpliedArgs(args, debug, multithreaded,
|
||||
exceptions, linkType, rtti, optimization, defaultflag);
|
||||
if (isPICMeaningful && linkType.isSharedLibrary()) {
|
||||
args.addElement("-fPIC");
|
||||
}
|
||||
}
|
||||
public Processor changeEnvironment(boolean newEnvironment, Environment env) {
|
||||
if (newEnvironment || env != null) {
|
||||
return new GccCCompiler(getCommand(), this.getSourceExtensions(),
|
||||
this.getHeaderExtensions(), this.getLibtool(),
|
||||
(GccCCompiler) this.getLibtoolCompiler(), newEnvironment,
|
||||
env);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Create parser to determine dependencies.
|
||||
*
|
||||
* Will create appropriate parser (C++, FORTRAN) based on file extension.
|
||||
*
|
||||
*/
|
||||
protected Parser createParser(File source) {
|
||||
if (source != null) {
|
||||
String sourceName = source.getName();
|
||||
int lastDot = sourceName.lastIndexOf('.');
|
||||
if (lastDot >= 0 && lastDot + 1 < sourceName.length()) {
|
||||
char afterDot = sourceName.charAt(lastDot + 1);
|
||||
if (afterDot == 'f' || afterDot == 'F') {
|
||||
return new FortranParser();
|
||||
}
|
||||
}
|
||||
}
|
||||
return new CParser();
|
||||
}
|
||||
public File[] getEnvironmentIncludePath() {
|
||||
if (includePath == null) {
|
||||
//
|
||||
// construct default include path from machine id and version id
|
||||
//
|
||||
String[] defaultInclude = new String[1];
|
||||
StringBuffer buf = new StringBuffer("/lib/");
|
||||
buf.append(GccProcessor.getMachine());
|
||||
buf.append('/');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
buf.append("/include");
|
||||
defaultInclude[0] = buf.toString();
|
||||
//
|
||||
// read specs file and look for -istart and -idirafter
|
||||
//
|
||||
String[] specs = GccProcessor.getSpecs();
|
||||
String[][] optionValues = GccProcessor.parseSpecs(specs, "*cpp:",
|
||||
new String[]{"-isystem ", "-idirafter "});
|
||||
//
|
||||
// if no entries were found, then use a default path
|
||||
//
|
||||
if (optionValues[0].length == 0 && optionValues[1].length == 0) {
|
||||
optionValues[0] = new String[]{"/usr/local/include",
|
||||
"/usr/include", "/usr/include/win32api"};
|
||||
}
|
||||
//
|
||||
// remove mingw entries.
|
||||
// For MinGW compiles this will mean the
|
||||
// location of the sys includes will be
|
||||
// wrong in dependencies.xml
|
||||
// but that should have no significant effect
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
for (int j = 0; j < optionValues[i].length; j++) {
|
||||
if (optionValues[i][j].indexOf("mingw") > 0) {
|
||||
optionValues[i][j] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// if cygwin then
|
||||
// we have to prepend location of gcc32
|
||||
// and .. to start of absolute filenames to
|
||||
// have something that will exist in the
|
||||
// windows filesystem
|
||||
if (GccProcessor.isCygwin()) {
|
||||
GccProcessor.convertCygwinFilenames(optionValues[0]);
|
||||
GccProcessor.convertCygwinFilenames(optionValues[1]);
|
||||
GccProcessor.convertCygwinFilenames(defaultInclude);
|
||||
}
|
||||
int count = CUtil.checkDirectoryArray(optionValues[0]);
|
||||
count += CUtil.checkDirectoryArray(optionValues[1]);
|
||||
count += CUtil.checkDirectoryArray(defaultInclude);
|
||||
includePath = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
for (int j = 0; j < optionValues[i].length; j++) {
|
||||
if (optionValues[i][j] != null) {
|
||||
includePath[index++] = new File(optionValues[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < defaultInclude.length; i++) {
|
||||
if (defaultInclude[i] != null) {
|
||||
includePath[index++] = new File(defaultInclude[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (File[]) includePath.clone();
|
||||
}
|
||||
public String getIdentifier() throws BuildException {
|
||||
if (identifier == null) {
|
||||
StringBuffer buf;
|
||||
if (getLibtool()) {
|
||||
buf = new StringBuffer("libtool ");
|
||||
} else {
|
||||
buf = new StringBuffer(' ');
|
||||
}
|
||||
buf.append(getCommand());
|
||||
buf.append(' ');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
buf.append(' ');
|
||||
buf.append(GccProcessor.getMachine());
|
||||
identifier = buf.toString();
|
||||
}
|
||||
return identifier;
|
||||
}
|
||||
public Linker getLinker(LinkType linkType) {
|
||||
return GccLinker.getInstance().getLinker(linkType);
|
||||
}
|
||||
public int getMaximumCommandLength() {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
}
|
@ -0,0 +1,152 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineCCompiler;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import org.apache.tools.ant.types.Environment;
|
||||
import net.sf.antcontrib.cpptasks.OptimizationEnum;
|
||||
|
||||
/**
|
||||
* Abstract base class for compilers that attempt to be command line compatible
|
||||
* with GCC
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
* @author Curt Arnold
|
||||
*/
|
||||
public abstract class GccCompatibleCCompiler extends CommandLineCCompiler {
|
||||
private final static String[] headerExtensions = new String[]{".h", ".hpp",
|
||||
".inl"};
|
||||
private final static String[] sourceExtensions = new String[]{".c", ".cc",
|
||||
".cpp", ".cxx", ".c++", ".i", ".f", ".for"};
|
||||
private final static String[] defaultflags = new String[]{"-c"};
|
||||
/**
|
||||
* Private constructor. Use GccCCompiler.getInstance() to get singleton
|
||||
* instance of this class.
|
||||
*/
|
||||
protected GccCompatibleCCompiler(String command, String identifierArg,
|
||||
boolean libtool, GccCompatibleCCompiler libtoolCompiler,
|
||||
boolean newEnvironment, Environment env) {
|
||||
super(command, identifierArg, sourceExtensions, headerExtensions,
|
||||
libtool ? ".fo" : ".o", libtool, libtoolCompiler,
|
||||
newEnvironment, env);
|
||||
}
|
||||
/**
|
||||
* Private constructor. Use GccCCompiler.getInstance() to get singleton
|
||||
* instance of this class.
|
||||
*/
|
||||
protected GccCompatibleCCompiler(String command, String identifierArg,
|
||||
String[] sourceExtensions, String[] headerExtensions,
|
||||
boolean libtool, GccCompatibleCCompiler libtoolCompiler,
|
||||
boolean newEnvironment, Environment env) {
|
||||
super(command, identifierArg, sourceExtensions, headerExtensions,
|
||||
libtool ? ".fo" : ".o", libtool, libtoolCompiler,
|
||||
newEnvironment, env);
|
||||
}
|
||||
public void addImpliedArgs(final Vector args,
|
||||
final boolean debug,
|
||||
final boolean multithreaded,
|
||||
final boolean exceptions,
|
||||
final LinkType linkType,
|
||||
final Boolean rtti,
|
||||
final OptimizationEnum optimization,
|
||||
final Boolean defaultflag) {
|
||||
//
|
||||
// -fPIC is too much trouble
|
||||
// users have to manually add it for
|
||||
// operating systems that make sense
|
||||
//
|
||||
if (defaultflag != null && defaultflag.booleanValue()) {
|
||||
for (int i = 0; i < defaultflags.length; i++) {
|
||||
args.addElement(defaultflags[i]);
|
||||
}
|
||||
}
|
||||
if (debug) {
|
||||
args.addElement("-g");
|
||||
} else {
|
||||
if (optimization != null) {
|
||||
if (optimization.isSize()) {
|
||||
args.addElement("-Os");
|
||||
} else if (optimization.isSpeed()) {
|
||||
if ("full".equals(optimization.getValue())) {
|
||||
args.addElement("-O2");
|
||||
} else {
|
||||
if ("speed".equals(optimization.getValue())) {
|
||||
args.addElement("-O1");
|
||||
} else {
|
||||
args.addElement("-O3");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (getIdentifier().indexOf("mingw") >= 0) {
|
||||
if (linkType.isSubsystemConsole()) {
|
||||
args.addElement("-mconsole");
|
||||
}
|
||||
if (linkType.isSubsystemGUI()) {
|
||||
args.addElement("-mwindows");
|
||||
}
|
||||
}
|
||||
if (rtti != null && !rtti.booleanValue()) {
|
||||
args.addElement("-fno-rtti");
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Adds an include path to the command.
|
||||
*/
|
||||
public void addIncludePath(String path, Vector cmd) {
|
||||
cmd.addElement("-I" + path);
|
||||
}
|
||||
public void addWarningSwitch(Vector args, int level) {
|
||||
switch (level) {
|
||||
case 0 :
|
||||
args.addElement("-w");
|
||||
break;
|
||||
case 5 :
|
||||
args.addElement("-Werror");
|
||||
/* nobreak */
|
||||
case 4 :
|
||||
args.addElement("-W");
|
||||
/* nobreak */
|
||||
case 3 :
|
||||
args.addElement("-Wall");
|
||||
break;
|
||||
}
|
||||
}
|
||||
public void getDefineSwitch(StringBuffer buffer, String define, String value) {
|
||||
buffer.append("-D");
|
||||
buffer.append(define);
|
||||
if (value != null && value.length() > 0) {
|
||||
buffer.append('=');
|
||||
buffer.append(value);
|
||||
}
|
||||
}
|
||||
protected File[] getEnvironmentIncludePath() {
|
||||
return CUtil.getPathFromEnvironment("INCLUDE", ":");
|
||||
}
|
||||
public String getIncludeDirSwitch(String includeDir) {
|
||||
return "-I" + includeDir;
|
||||
}
|
||||
public void getUndefineSwitch(StringBuffer buffer, String define) {
|
||||
buffer.append("-U");
|
||||
buffer.append(define);
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
/**
|
||||
* Adapter for the 'ar' archiver
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
public final class GccLibrarian extends AbstractArLibrarian {
|
||||
private static String[] objFileExtensions = new String[]{".o"};
|
||||
private static GccLibrarian instance = new GccLibrarian("ar",
|
||||
objFileExtensions, false, new GccLibrarian("ar", objFileExtensions,
|
||||
true, null));
|
||||
public static GccLibrarian getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private GccLibrarian(String command, String[] inputExtensions,
|
||||
boolean isLibtool, GccLibrarian libtoolLibrarian) {
|
||||
super(command, "V", inputExtensions, new String[0], "lib", ".a",
|
||||
isLibtool, libtoolLibrarian);
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
return GccLinker.getInstance().getLinker(type);
|
||||
}
|
||||
}
|
@ -0,0 +1,210 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
/**
|
||||
* Adapter for the GCC linker
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
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);
|
||||
public static GccLinker getInstance() {
|
||||
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, Boolean defaultflag) {
|
||||
super.addImpliedArgs(debug, linkType, args, defaultflag);
|
||||
if (getIdentifier().indexOf("mingw") >= 0) {
|
||||
if (linkType.isSubsystemConsole()) {
|
||||
args.addElement("-mconsole");
|
||||
}
|
||||
if (linkType.isSubsystemGUI()) {
|
||||
args.addElement("-mwindows");
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Allows drived linker to decorate linker option. Override by GccLinker to
|
||||
* prepend a "-Wl," to pass option to through gcc to linker.
|
||||
*
|
||||
* @param buf
|
||||
* buffer that may be used and abused in the decoration process,
|
||||
* must not be null.
|
||||
* @param arg
|
||||
* linker argument
|
||||
*/
|
||||
public String decorateLinkerOption(StringBuffer buf, String arg) {
|
||||
String decoratedArg = arg;
|
||||
if (arg.length() > 1 && arg.charAt(0) == '-') {
|
||||
switch (arg.charAt(1)) {
|
||||
//
|
||||
// passed automatically by GCC
|
||||
//
|
||||
case 'g' :
|
||||
case 'f' :
|
||||
case 'F' :
|
||||
/* Darwin */
|
||||
case 'm' :
|
||||
case 'O' :
|
||||
case 'W' :
|
||||
case 'l' :
|
||||
case 'L' :
|
||||
case 'u' :
|
||||
case 'v' :
|
||||
break;
|
||||
default :
|
||||
boolean known = false;
|
||||
for (int i = 0; i < linkerOptions.length; i++) {
|
||||
if (linkerOptions[i].equals(arg)) {
|
||||
known = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!known) {
|
||||
buf.setLength(0);
|
||||
buf.append("-Wl,");
|
||||
buf.append(arg);
|
||||
decoratedArg = buf.toString();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return decoratedArg;
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
public File[] getLibraryPath() {
|
||||
if (libDirs == null) {
|
||||
//
|
||||
// construct gcc lib path from machine and version
|
||||
//
|
||||
StringBuffer buf = new StringBuffer("/lib/gcc-lib/");
|
||||
buf.append(GccProcessor.getMachine());
|
||||
buf.append('/');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
//
|
||||
// build default path from gcc and system /lib and /lib/w32api
|
||||
//
|
||||
String[] impliedLibPath = new String[]{buf.toString(),
|
||||
"/lib/w32api", "/lib"};
|
||||
//
|
||||
// read gcc specs file for other library paths
|
||||
//
|
||||
String[] specs = GccProcessor.getSpecs();
|
||||
String[][] libpaths = GccProcessor.parseSpecs(specs, "*link:",
|
||||
new String[]{"%q"});
|
||||
String[] libpath;
|
||||
if (libpaths[0].length > 0) {
|
||||
libpath = new String[libpaths[0].length + 3];
|
||||
int i = 0;
|
||||
for (; i < libpaths[0].length; i++) {
|
||||
libpath[i] = libpaths[0][i];
|
||||
}
|
||||
libpath[i++] = buf.toString();
|
||||
libpath[i++] = "/lib/w32api";
|
||||
libpath[i++] = "/lib";
|
||||
} else {
|
||||
//
|
||||
// if a failure to find any matches then
|
||||
// use some default values for lib path entries
|
||||
libpath = new String[]{"/usr/local/lib/mingw",
|
||||
"/usr/local/lib", "/usr/lib/w32api", "/usr/lib/mingw",
|
||||
"/usr/lib", buf.toString(), "/lib/w32api", "/lib"};
|
||||
}
|
||||
for (int i = 0; i < libpath.length; i++) {
|
||||
if (libpath[i].indexOf("mingw") >= 0) {
|
||||
libpath[i] = null;
|
||||
}
|
||||
}
|
||||
//
|
||||
// if cygwin then
|
||||
// we have to prepend location of gcc32
|
||||
// and .. to start of absolute filenames to
|
||||
// have something that will exist in the
|
||||
// windows filesystem
|
||||
if (GccProcessor.isCygwin()) {
|
||||
GccProcessor.convertCygwinFilenames(libpath);
|
||||
}
|
||||
//
|
||||
// check that remaining entries are actual directories
|
||||
//
|
||||
int count = CUtil.checkDirectoryArray(libpath);
|
||||
//
|
||||
// populate return array with remaining entries
|
||||
//
|
||||
libDirs = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < libpath.length; i++) {
|
||||
if (libpath[i] != null) {
|
||||
libDirs[index++] = new File(libpath[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return libDirs;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isPluginModule()) {
|
||||
if (isDarwin()) {
|
||||
return machBundleLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
if (isDarwin()) {
|
||||
return machDllLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,299 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
|
||||
/**
|
||||
* A add-in class for Gcc processors
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class GccProcessor {
|
||||
// the results from gcc -dumpmachine
|
||||
private static String machine;
|
||||
private static String[] specs;
|
||||
// the results from gcc -dumpversion
|
||||
private static String version;
|
||||
private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
|
||||
String prefix, String extension, String[] patterns, int offset) {
|
||||
for (int i = 0; i < libnames.length; i++) {
|
||||
buf.setLength(0);
|
||||
buf.append(prefix);
|
||||
buf.append(libnames[i]);
|
||||
buf.append(extension);
|
||||
patterns[offset + i] = buf.toString();
|
||||
}
|
||||
return offset + libnames.length;
|
||||
}
|
||||
/**
|
||||
* Converts absolute Cygwin file or directory names to the corresponding
|
||||
* Win32 name.
|
||||
*
|
||||
* @param names
|
||||
* array of names, some elements may be null, will be changed in
|
||||
* place.
|
||||
*/
|
||||
public static void convertCygwinFilenames(String[] names) {
|
||||
if (names == null) {
|
||||
throw new NullPointerException("names");
|
||||
}
|
||||
File gccDir = CUtil.getExecutableLocation("gcc.exe");
|
||||
if (gccDir != null) {
|
||||
String prefix = gccDir.getAbsolutePath() + "/..";
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
String name = names[i];
|
||||
if (name != null && name.length() > 1 && name.charAt(0) == '/') {
|
||||
buf.setLength(0);
|
||||
buf.append(prefix);
|
||||
buf.append(name);
|
||||
names[i] = buf.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public static String[] getLibraryPatterns(String[] libnames) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
String[] patterns = new String[libnames.length * 2];
|
||||
int offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
|
||||
if (isHPUX()) {
|
||||
offset = addLibraryPatterns(libnames, buf, "lib", ".sl", patterns,
|
||||
offset);
|
||||
} else {
|
||||
offset = addLibraryPatterns(libnames, buf, "lib", ".so", patterns,
|
||||
offset);
|
||||
}
|
||||
return patterns;
|
||||
}
|
||||
public static String getMachine() {
|
||||
if (machine == null) {
|
||||
String[] args = new String[]{"gcc", "-dumpmachine"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
if (cmdout.length == 0) {
|
||||
machine = "nomachine";
|
||||
} else {
|
||||
machine = cmdout[0];
|
||||
}
|
||||
}
|
||||
return machine;
|
||||
}
|
||||
public static String[] getOutputFileSwitch(String letter, String outputFile) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
if (outputFile.indexOf(' ') >= 0) {
|
||||
buf.append('"');
|
||||
buf.append(outputFile.replace('\\', '/'));
|
||||
buf.append('"');
|
||||
} else {
|
||||
buf.append(outputFile.replace('\\', '/'));
|
||||
}
|
||||
String[] retval = new String[]{letter, buf.toString()};
|
||||
return retval;
|
||||
}
|
||||
/**
|
||||
* Returns the contents of the gcc specs file.
|
||||
*
|
||||
* The implementation locates gcc.exe in the executable path and then
|
||||
* builds a relative path name from the results of -dumpmachine and
|
||||
* -dumpversion. Attempts to use gcc -dumpspecs to provide this information
|
||||
* resulted in stalling on the Execute.run
|
||||
*
|
||||
* @returns contents of the specs file
|
||||
*/
|
||||
public static String[] getSpecs() {
|
||||
if (specs == null) {
|
||||
File gccParent = CUtil.getExecutableLocation("gcc.exe");
|
||||
if (gccParent != null) {
|
||||
//
|
||||
// build a relative path like
|
||||
// ../lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
|
||||
//
|
||||
StringBuffer buf = new StringBuffer("../lib/gcc-lib/");
|
||||
buf.append(getMachine());
|
||||
buf.append('/');
|
||||
buf.append(getVersion());
|
||||
buf.append("/specs");
|
||||
//
|
||||
// resolve it relative to the location of gcc.exe
|
||||
//
|
||||
String relativePath = buf.toString();
|
||||
File specsFile = new File(gccParent, relativePath);
|
||||
//
|
||||
// found the specs file
|
||||
//
|
||||
try {
|
||||
//
|
||||
// read the lines in the file
|
||||
//
|
||||
BufferedReader reader = new BufferedReader(new FileReader(
|
||||
specsFile));
|
||||
Vector lines = new Vector(100);
|
||||
String line = reader.readLine();
|
||||
while (line != null) {
|
||||
lines.addElement(line);
|
||||
line = reader.readLine();
|
||||
}
|
||||
specs = new String[lines.size()];
|
||||
lines.copyInto(specs);
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (specs == null) {
|
||||
specs = new String[0];
|
||||
}
|
||||
return specs;
|
||||
}
|
||||
public static String getVersion() {
|
||||
if (version == null) {
|
||||
String[] args = new String[]{"gcc", "-dumpversion"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
if (cmdout.length == 0) {
|
||||
version = "noversion";
|
||||
} else {
|
||||
version = cmdout[0];
|
||||
}
|
||||
}
|
||||
return version;
|
||||
}
|
||||
public static boolean isCaseSensitive() {
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Determines if task is running with cygwin
|
||||
*
|
||||
* @return true if cygwin was detected
|
||||
*/
|
||||
public static boolean isCygwin() {
|
||||
return getMachine().indexOf("cygwin") > 0;
|
||||
}
|
||||
private static boolean isHPUX() {
|
||||
String osname = System.getProperty("os.name").toLowerCase();
|
||||
if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* Parses the results of the specs file for a specific processor and
|
||||
* options
|
||||
*
|
||||
* @param specsContent
|
||||
* Contents of specs file as returned from getSpecs
|
||||
* @param specSectionStart
|
||||
* start of spec section, for example "*cpp:"
|
||||
* @param options
|
||||
* command line switches such as "-istart"
|
||||
*/
|
||||
public static String[][] parseSpecs(String[] specsContent,
|
||||
String specSectionStart, String[] options) {
|
||||
if (specsContent == null) {
|
||||
throw new NullPointerException("specsContent");
|
||||
}
|
||||
if (specSectionStart == null) {
|
||||
throw new NullPointerException("specSectionStart");
|
||||
}
|
||||
if (options == null) {
|
||||
throw new NullPointerException("option");
|
||||
}
|
||||
String[][] optionValues = new String[options.length][];
|
||||
StringBuffer optionValue = new StringBuffer(40);
|
||||
for (int i = 0; i < specsContent.length; i++) {
|
||||
String specLine = specsContent[i];
|
||||
//
|
||||
// if start of section then start paying attention
|
||||
//
|
||||
if (specLine.startsWith(specSectionStart)) {
|
||||
Vector[] optionVectors = new Vector[options.length];
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
optionVectors[j] = new Vector(10);
|
||||
}
|
||||
//
|
||||
// go to next line and examine contents
|
||||
// and repeat until end of file
|
||||
//
|
||||
for (i++; i < specsContent.length; i++) {
|
||||
specLine = specsContent[i];
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
int optionStart = specLine.indexOf(options[j]);
|
||||
while (optionStart >= 0) {
|
||||
optionValue.setLength(0);
|
||||
//
|
||||
// walk rest of line looking for first non
|
||||
// whitespace
|
||||
// and then next space
|
||||
boolean hasNonBlank = false;
|
||||
int k = optionStart + options[j].length();
|
||||
for (; k < specLine.length(); k++) {
|
||||
//
|
||||
// either a blank or a "}" (close of
|
||||
// conditional)
|
||||
// section will end the path
|
||||
//
|
||||
if (specLine.charAt(k) == ' '
|
||||
|| specLine.charAt(k) == '}') {
|
||||
if (hasNonBlank) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
hasNonBlank = true;
|
||||
optionValue.append(specLine.charAt(k));
|
||||
}
|
||||
}
|
||||
//
|
||||
// transition back to whitespace
|
||||
// value is over, add it to vector
|
||||
if (hasNonBlank) {
|
||||
optionVectors[j].addElement(optionValue
|
||||
.toString());
|
||||
}
|
||||
//
|
||||
// find next occurance on line
|
||||
//
|
||||
optionStart = specLine.indexOf(options[j], k);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// copy vectors over to option arrays
|
||||
//
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
optionValues[j] = new String[optionVectors[j].size()];
|
||||
optionVectors[j].copyInto(optionValues[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// fill in any missing option values with
|
||||
// a zero-length string array
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
String[] zeroLenArray = new String[0];
|
||||
if (optionValues[i] == null) {
|
||||
optionValues[i] = zeroLenArray;
|
||||
}
|
||||
}
|
||||
return optionValues;
|
||||
}
|
||||
private GccProcessor() {
|
||||
}
|
||||
}
|
@ -0,0 +1,203 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2003-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.gcc;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.types.LibrarySet;
|
||||
/**
|
||||
* Adapter for the g++ variant of the GCC linker
|
||||
*
|
||||
* @author Stephen M. Webb <stephen.webb@bregmasoft.com>
|
||||
*/
|
||||
public class GppLinker extends AbstractLdLinker {
|
||||
protected static final String[] discardFiles = new String[0];
|
||||
protected static final String[] objFiles = new String[]{".o", ".a", ".lib",
|
||||
".dll", ".so", ".sl"};
|
||||
private static final GppLinker dllLinker = new GppLinker("gcc", objFiles,
|
||||
discardFiles, "lib", ".so", false, new GppLinker("gcc", objFiles,
|
||||
discardFiles, "lib", ".so", true, null));
|
||||
private final static String libPrefix = "libraries: =";
|
||||
protected static final String[] libtoolObjFiles = new String[]{".fo", ".a",
|
||||
".lib", ".dll", ".so", ".sl"};
|
||||
private static String[] linkerOptions = new String[]{"-bundle", "-dylib",
|
||||
"-dynamic", "-dynamiclib", "-nostartfiles", "-nostdlib",
|
||||
"-prebind", "-s", "-static", "-shared", "-symbolic", "-Xlinker"};
|
||||
private static final GppLinker instance = new GppLinker("gcc", objFiles,
|
||||
discardFiles, "", "", false, null);
|
||||
private static final GppLinker machDllLinker = new GppLinker("gcc",
|
||||
objFiles, discardFiles, "lib", ".dylib", false, null);
|
||||
private static final GppLinker machPluginLinker = new GppLinker("gcc",
|
||||
objFiles, discardFiles, "lib", ".bundle", false, null);
|
||||
public static GppLinker getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private File[] libDirs;
|
||||
private String runtimeLibrary;
|
||||
protected GppLinker(String command, String[] extensions,
|
||||
String[] ignoredExtensions, String outputPrefix,
|
||||
String outputSuffix, boolean isLibtool, GppLinker libtoolLinker) {
|
||||
super(command, "-dumpversion", extensions, ignoredExtensions,
|
||||
outputPrefix, outputSuffix, isLibtool, libtoolLinker);
|
||||
}
|
||||
protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
|
||||
super.addImpliedArgs(debug, linkType, args, defaultflag);
|
||||
if (getIdentifier().indexOf("mingw") >= 0) {
|
||||
if (linkType.isSubsystemConsole()) {
|
||||
args.addElement("-mconsole");
|
||||
}
|
||||
if (linkType.isSubsystemGUI()) {
|
||||
args.addElement("-mwindows");
|
||||
}
|
||||
}
|
||||
if (linkType.isStaticRuntime()) {
|
||||
String[] cmdin = new String[]{"g++", "-print-file-name=libstdc++.a"};
|
||||
String[] cmdout = CaptureStreamHandler.run(cmdin);
|
||||
if (cmdout.length > 0) {
|
||||
runtimeLibrary = cmdout[0];
|
||||
} else {
|
||||
runtimeLibrary = null;
|
||||
}
|
||||
} else {
|
||||
runtimeLibrary = "-lstdc++";
|
||||
}
|
||||
}
|
||||
public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
|
||||
Vector preargs, Vector midargs, Vector endargs) {
|
||||
String[] rs = super.addLibrarySets(task, libsets, preargs, midargs,
|
||||
endargs);
|
||||
if (runtimeLibrary != null) {
|
||||
endargs.addElement(runtimeLibrary);
|
||||
}
|
||||
return rs;
|
||||
}
|
||||
/**
|
||||
* Allows drived linker to decorate linker option. Override by GppLinker to
|
||||
* prepend a "-Wl," to pass option to through gcc to linker.
|
||||
*
|
||||
* @param buf
|
||||
* buffer that may be used and abused in the decoration process,
|
||||
* must not be null.
|
||||
* @param arg
|
||||
* linker argument
|
||||
*/
|
||||
public String decorateLinkerOption(StringBuffer buf, String arg) {
|
||||
String decoratedArg = arg;
|
||||
if (arg.length() > 1 && arg.charAt(0) == '-') {
|
||||
switch (arg.charAt(1)) {
|
||||
//
|
||||
// passed automatically by GCC
|
||||
//
|
||||
case 'g' :
|
||||
case 'f' :
|
||||
case 'F' :
|
||||
/* Darwin */
|
||||
case 'm' :
|
||||
case 'O' :
|
||||
case 'W' :
|
||||
case 'l' :
|
||||
case 'L' :
|
||||
case 'u' :
|
||||
break;
|
||||
default :
|
||||
boolean known = false;
|
||||
for (int i = 0; i < linkerOptions.length; i++) {
|
||||
if (linkerOptions[i].equals(arg)) {
|
||||
known = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!known) {
|
||||
buf.setLength(0);
|
||||
buf.append("-Wl,");
|
||||
buf.append(arg);
|
||||
decoratedArg = buf.toString();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return decoratedArg;
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
public File[] getLibraryPath() {
|
||||
if (libDirs == null) {
|
||||
Vector dirs = new Vector();
|
||||
// Ask GCC where it will look for its libraries.
|
||||
String[] args = new String[]{"g++", "-print-search-dirs"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
for (int i = 0; i < cmdout.length; ++i) {
|
||||
int prefixIndex = cmdout[i].indexOf(libPrefix);
|
||||
if (prefixIndex >= 0) {
|
||||
// Special case DOS-type GCCs like MinGW or Cygwin
|
||||
int s = prefixIndex + libPrefix.length();
|
||||
int t = cmdout[i].indexOf(';', s);
|
||||
while (t > 0) {
|
||||
dirs.addElement(cmdout[i].substring(s, t));
|
||||
s = t + 1;
|
||||
t = cmdout[i].indexOf(';', s);
|
||||
}
|
||||
dirs.addElement(cmdout[i].substring(s));
|
||||
++i;
|
||||
for (; i < cmdout.length; ++i) {
|
||||
dirs.addElement(cmdout[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Eliminate all but actual directories.
|
||||
String[] libpath = new String[dirs.size()];
|
||||
dirs.copyInto(libpath);
|
||||
int count = CUtil.checkDirectoryArray(libpath);
|
||||
// Build return array.
|
||||
libDirs = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < libpath.length; ++i) {
|
||||
if (libpath[i] != null) {
|
||||
libDirs[index++] = new File(libpath[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return libDirs;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isPluginModule()) {
|
||||
if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
|
||||
return machPluginLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
|
||||
return machDllLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc;
|
||||
import java.io.File;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
/**
|
||||
* Adapter for the 'ld' linker
|
||||
*
|
||||
* @author Curt Arnold
|
||||
*/
|
||||
public final class LdLinker 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 LdLinker dllLinker = new LdLinker("ld", objFiles,
|
||||
discardFiles, "lib", ".so", false, new LdLinker("ld", objFiles,
|
||||
discardFiles, "lib", ".so", true, null));
|
||||
private static final LdLinker instance = new LdLinker("ld", objFiles,
|
||||
discardFiles, "", "", false, null);
|
||||
private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
|
||||
".lib", ".dll", ".so", ".sl"};
|
||||
public static LdLinker getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private File[] libDirs;
|
||||
private LdLinker(String command, String[] extensions,
|
||||
String[] ignoredExtensions, String outputPrefix,
|
||||
String outputSuffix, boolean isLibtool, LdLinker libtoolLinker) {
|
||||
super(command, "-version", extensions, ignoredExtensions, outputPrefix,
|
||||
outputSuffix, isLibtool, libtoolLinker);
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
return dllLinker;
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,273 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc.cross;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.CompilerParam;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineCompilerConfiguration;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Processor;
|
||||
import net.sf.antcontrib.cpptasks.compiler.ProgressMonitor;
|
||||
import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
|
||||
import net.sf.antcontrib.cpptasks.parser.CParser;
|
||||
import net.sf.antcontrib.cpptasks.parser.FortranParser;
|
||||
import net.sf.antcontrib.cpptasks.parser.Parser;
|
||||
import org.apache.tools.ant.BuildException;
|
||||
import org.apache.tools.ant.types.Environment;
|
||||
import net.sf.antcontrib.cpptasks.OptimizationEnum;
|
||||
|
||||
/**
|
||||
* Adapter for the GCC C/C++ compiler
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
public final class GccCCompiler extends GccCompatibleCCompiler {
|
||||
private final static String[] headerExtensions = new String[]{".h", ".hpp",
|
||||
".inl"};
|
||||
private final static String[] sourceExtensions = new String[]{".c", /* C */
|
||||
".cc", /* C++ */
|
||||
".cpp", /* C++ */
|
||||
".cxx", /* C++ */
|
||||
".c++", /* C++ */
|
||||
".i", /* preprocessed C */
|
||||
".ii", /* preprocessed C++ */
|
||||
".f", /* FORTRAN */
|
||||
".for", /* FORTRAN */
|
||||
".m", /* Objective-C */
|
||||
".mm", /* Objected-C++ */
|
||||
".s" /* Assembly */
|
||||
};
|
||||
private static final GccCCompiler cppInstance = new GccCCompiler("c++",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("c++", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
private static final GccCCompiler g77Instance = new GccCCompiler("g77",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("g77", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
private static final GccCCompiler gppInstance = new GccCCompiler("g++",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("g++", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
private static final GccCCompiler instance = new GccCCompiler("gcc",
|
||||
sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler("gcc", sourceExtensions, headerExtensions, true,
|
||||
null, false, null), false, null);
|
||||
/**
|
||||
* Gets c++ adapter
|
||||
*/
|
||||
public static GccCCompiler getCppInstance() {
|
||||
return cppInstance;
|
||||
}
|
||||
/**
|
||||
* Gets g77 adapter
|
||||
*/
|
||||
public static GccCCompiler getG77Instance() {
|
||||
return g77Instance;
|
||||
}
|
||||
/**
|
||||
* Gets gpp adapter
|
||||
*/
|
||||
public static GccCCompiler getGppInstance() {
|
||||
return gppInstance;
|
||||
}
|
||||
/**
|
||||
* Gets gcc adapter
|
||||
*/
|
||||
public static GccCCompiler getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private String identifier;
|
||||
private File[] includePath;
|
||||
private boolean isPICMeaningful = true;
|
||||
/**
|
||||
* Private constructor. Use GccCCompiler.getInstance() to get singleton
|
||||
* instance of this class.
|
||||
*/
|
||||
private GccCCompiler(String command, String[] sourceExtensions,
|
||||
String[] headerExtensions, boolean isLibtool,
|
||||
GccCCompiler libtoolCompiler, boolean newEnvironment,
|
||||
Environment env) {
|
||||
super(command, null, sourceExtensions, headerExtensions, isLibtool,
|
||||
libtoolCompiler, newEnvironment, env);
|
||||
isPICMeaningful = System.getProperty("os.name").indexOf("Windows") < 0;
|
||||
}
|
||||
public void addImpliedArgs(final Vector args,
|
||||
final boolean debug,
|
||||
final boolean multithreaded,
|
||||
final boolean exceptions,
|
||||
final LinkType linkType,
|
||||
final Boolean rtti,
|
||||
final OptimizationEnum optimization,
|
||||
final Boolean defaultflag) {
|
||||
super.addImpliedArgs(args, debug, multithreaded,
|
||||
exceptions, linkType, rtti, optimization, defaultflag);
|
||||
if (isPICMeaningful && linkType.isSharedLibrary()) {
|
||||
args.addElement("-fPIC");
|
||||
}
|
||||
}
|
||||
public Processor changeEnvironment(boolean newEnvironment, Environment env) {
|
||||
if (newEnvironment || env != null) {
|
||||
return new GccCCompiler(getCommand(), this.getSourceExtensions(),
|
||||
this.getHeaderExtensions(), this.getLibtool(),
|
||||
(GccCCompiler) this.getLibtoolCompiler(), newEnvironment,
|
||||
env);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
protected Object clone() throws CloneNotSupportedException {
|
||||
GccCCompiler clone = (GccCCompiler) super.clone();
|
||||
return clone;
|
||||
}
|
||||
public void compile(CCTask task, File outputDir, String[] sourceFiles,
|
||||
String[] args, String[] endArgs, boolean relentless,
|
||||
CommandLineCompilerConfiguration config, ProgressMonitor monitor)
|
||||
throws BuildException {
|
||||
try {
|
||||
GccCCompiler clone = (GccCCompiler) this.clone();
|
||||
CompilerParam param = config.getParam("target");
|
||||
if (param != null)
|
||||
clone.setCommand(param.getValue() + "-" + this.getCommand());
|
||||
clone.supercompile(task, outputDir, sourceFiles, args, endArgs,
|
||||
relentless, config, monitor);
|
||||
} catch (CloneNotSupportedException e) {
|
||||
supercompile(task, outputDir, sourceFiles, args, endArgs,
|
||||
relentless, config, monitor);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Create parser to determine dependencies.
|
||||
*
|
||||
* Will create appropriate parser (C++, FORTRAN) based on file extension.
|
||||
*
|
||||
*/
|
||||
protected Parser createParser(File source) {
|
||||
if (source != null) {
|
||||
String sourceName = source.getName();
|
||||
int lastDot = sourceName.lastIndexOf('.');
|
||||
if (lastDot >= 0 && lastDot + 1 < sourceName.length()) {
|
||||
char afterDot = sourceName.charAt(lastDot + 1);
|
||||
if (afterDot == 'f' || afterDot == 'F') {
|
||||
return new FortranParser();
|
||||
}
|
||||
}
|
||||
}
|
||||
return new CParser();
|
||||
}
|
||||
public File[] getEnvironmentIncludePath() {
|
||||
if (includePath == null) {
|
||||
//
|
||||
// construct default include path from machine id and version id
|
||||
//
|
||||
String[] defaultInclude = new String[1];
|
||||
StringBuffer buf = new StringBuffer("/lib/");
|
||||
buf.append(GccProcessor.getMachine());
|
||||
buf.append('/');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
buf.append("/include");
|
||||
defaultInclude[0] = buf.toString();
|
||||
//
|
||||
// read specs file and look for -istart and -idirafter
|
||||
//
|
||||
String[] specs = GccProcessor.getSpecs();
|
||||
String[][] optionValues = GccProcessor.parseSpecs(specs, "*cpp:",
|
||||
new String[]{"-isystem ", "-idirafter "});
|
||||
//
|
||||
// if no entries were found, then use a default path
|
||||
//
|
||||
if (optionValues[0].length == 0 && optionValues[1].length == 0) {
|
||||
optionValues[0] = new String[]{"/usr/local/include",
|
||||
"/usr/include", "/usr/include/win32api"};
|
||||
}
|
||||
//
|
||||
// remove mingw entries.
|
||||
// For MinGW compiles this will mean the
|
||||
// location of the sys includes will be
|
||||
// wrong in dependencies.xml
|
||||
// but that should have no significant effect
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
for (int j = 0; j < optionValues[i].length; j++) {
|
||||
if (optionValues[i][j].indexOf("mingw") > 0) {
|
||||
optionValues[i][j] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// if cygwin then
|
||||
// we have to prepend location of gcc32
|
||||
// and .. to start of absolute filenames to
|
||||
// have something that will exist in the
|
||||
// windows filesystem
|
||||
if (GccProcessor.isCygwin()) {
|
||||
GccProcessor.convertCygwinFilenames(optionValues[0]);
|
||||
GccProcessor.convertCygwinFilenames(optionValues[1]);
|
||||
GccProcessor.convertCygwinFilenames(defaultInclude);
|
||||
}
|
||||
int count = CUtil.checkDirectoryArray(optionValues[0]);
|
||||
count += CUtil.checkDirectoryArray(optionValues[1]);
|
||||
count += CUtil.checkDirectoryArray(defaultInclude);
|
||||
includePath = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
for (int j = 0; j < optionValues[i].length; j++) {
|
||||
if (optionValues[i][j] != null) {
|
||||
includePath[index++] = new File(optionValues[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < defaultInclude.length; i++) {
|
||||
if (defaultInclude[i] != null) {
|
||||
includePath[index++] = new File(defaultInclude[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (File[]) includePath.clone();
|
||||
}
|
||||
public String getIdentifier() throws BuildException {
|
||||
if (identifier == null) {
|
||||
StringBuffer buf;
|
||||
if (getLibtool()) {
|
||||
buf = new StringBuffer("libtool ");
|
||||
} else {
|
||||
buf = new StringBuffer(' ');
|
||||
}
|
||||
buf.append(getCommand());
|
||||
buf.append(' ');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
buf.append(' ');
|
||||
buf.append(GccProcessor.getMachine());
|
||||
identifier = buf.toString();
|
||||
}
|
||||
return identifier;
|
||||
}
|
||||
public Linker getLinker(LinkType linkType) {
|
||||
return GccLinker.getInstance().getLinker(linkType);
|
||||
}
|
||||
public int getMaximumCommandLength() {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
private void supercompile(CCTask task, File outputDir,
|
||||
String[] sourceFiles, String[] args, String[] endArgs,
|
||||
boolean relentless, CommandLineCompilerConfiguration config,
|
||||
ProgressMonitor monitor) throws BuildException {
|
||||
super.compile(task, outputDir, sourceFiles, args, endArgs, relentless,
|
||||
config, monitor);
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc.cross;
|
||||
import java.io.File;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.LinkerParam;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractArLibrarian;
|
||||
|
||||
import org.apache.tools.ant.BuildException;
|
||||
/**
|
||||
* Adapter for the 'ar' archiver
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
public final class GccLibrarian extends AbstractArLibrarian {
|
||||
private static String[] objFileExtensions = new String[]{".o"};
|
||||
private static GccLibrarian instance = new GccLibrarian("ar",
|
||||
objFileExtensions, false, new GccLibrarian("ar", objFileExtensions,
|
||||
true, null));
|
||||
public static GccLibrarian getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private GccLibrarian(String command, String[] inputExtensions,
|
||||
boolean isLibtool, GccLibrarian libtoolLibrarian) {
|
||||
super(command, "V", inputExtensions, new String[0], "lib", ".a",
|
||||
isLibtool, libtoolLibrarian);
|
||||
}
|
||||
protected Object clone() throws CloneNotSupportedException {
|
||||
GccLibrarian clone = (GccLibrarian) super.clone();
|
||||
return clone;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
return GccLinker.getInstance().getLinker(type);
|
||||
}
|
||||
public void link(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
try {
|
||||
GccLibrarian clone = (GccLibrarian) this.clone();
|
||||
LinkerParam param = config.getParam("target");
|
||||
if (param != null)
|
||||
clone.setCommand(param.getValue() + "-" + this.getCommand());
|
||||
clone.superlink(task, outputFile, sourceFiles, config);
|
||||
} catch (CloneNotSupportedException e) {
|
||||
superlink(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
||||
private void superlink(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
super.link(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
@ -0,0 +1,234 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc.cross;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.LinkerParam;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
|
||||
import org.apache.tools.ant.BuildException;
|
||||
/**
|
||||
* Adapter for the GCC linker
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
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 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 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 machBundleLinker = new GccLinker("gcc",
|
||||
objFiles, discardFiles, "lib", ".bundle", false, null);
|
||||
private static final GccLinker machDllLinker = new GccLinker("gcc",
|
||||
objFiles, discardFiles, "lib", ".dylib", false, null);
|
||||
public static GccLinker getInstance() {
|
||||
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, Boolean defaultflag) {
|
||||
super.addImpliedArgs(debug, linkType, args, defaultflag);
|
||||
if (getIdentifier().indexOf("mingw") >= 0) {
|
||||
if (linkType.isSubsystemConsole()) {
|
||||
args.addElement("-mconsole");
|
||||
}
|
||||
if (linkType.isSubsystemGUI()) {
|
||||
args.addElement("-mwindows");
|
||||
}
|
||||
}
|
||||
}
|
||||
protected Object clone() throws CloneNotSupportedException {
|
||||
GccLinker clone = (GccLinker) super.clone();
|
||||
return clone;
|
||||
}
|
||||
/**
|
||||
* Allows drived linker to decorate linker option. Override by GccLinker to
|
||||
* prepend a "-Wl," to pass option to through gcc to linker.
|
||||
*
|
||||
* @param buf
|
||||
* buffer that may be used and abused in the decoration process,
|
||||
* must not be null.
|
||||
* @param arg
|
||||
* linker argument
|
||||
*/
|
||||
public String decorateLinkerOption(StringBuffer buf, String arg) {
|
||||
String decoratedArg = arg;
|
||||
if (arg.length() > 1 && arg.charAt(0) == '-') {
|
||||
switch (arg.charAt(1)) {
|
||||
//
|
||||
// passed automatically by GCC
|
||||
//
|
||||
case 'g' :
|
||||
case 'f' :
|
||||
case 'F' :
|
||||
/* Darwin */
|
||||
case 'm' :
|
||||
case 'O' :
|
||||
case 'W' :
|
||||
case 'l' :
|
||||
case 'L' :
|
||||
case 'u' :
|
||||
case 'v' :
|
||||
break;
|
||||
default :
|
||||
boolean known = false;
|
||||
for (int i = 0; i < linkerOptions.length; i++) {
|
||||
if (linkerOptions[i].equals(arg)) {
|
||||
known = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!known) {
|
||||
buf.setLength(0);
|
||||
buf.append("-Wl,");
|
||||
buf.append(arg);
|
||||
decoratedArg = buf.toString();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return decoratedArg;
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
public File[] getLibraryPath() {
|
||||
if (libDirs == null) {
|
||||
//
|
||||
// construct gcc lib path from machine and version
|
||||
//
|
||||
StringBuffer buf = new StringBuffer("/lib/gcc-lib/");
|
||||
buf.append(GccProcessor.getMachine());
|
||||
buf.append('/');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
//
|
||||
// build default path from gcc and system /lib and /lib/w32api
|
||||
//
|
||||
String[] impliedLibPath = new String[]{buf.toString(),
|
||||
"/lib/w32api", "/lib"};
|
||||
//
|
||||
// read gcc specs file for other library paths
|
||||
//
|
||||
String[] specs = GccProcessor.getSpecs();
|
||||
String[][] libpaths = GccProcessor.parseSpecs(specs, "*link:",
|
||||
new String[]{"%q"});
|
||||
String[] libpath;
|
||||
if (libpaths[0].length > 0) {
|
||||
libpath = new String[libpaths[0].length + 3];
|
||||
int i = 0;
|
||||
for (; i < libpaths[0].length; i++) {
|
||||
libpath[i] = libpaths[0][i];
|
||||
}
|
||||
libpath[i++] = buf.toString();
|
||||
libpath[i++] = "/lib/w32api";
|
||||
libpath[i++] = "/lib";
|
||||
} else {
|
||||
//
|
||||
// if a failure to find any matches then
|
||||
// use some default values for lib path entries
|
||||
libpath = new String[]{"/usr/local/lib/mingw",
|
||||
"/usr/local/lib", "/usr/lib/w32api", "/usr/lib/mingw",
|
||||
"/usr/lib", buf.toString(), "/lib/w32api", "/lib"};
|
||||
}
|
||||
for (int i = 0; i < libpath.length; i++) {
|
||||
if (libpath[i].indexOf("mingw") >= 0) {
|
||||
libpath[i] = null;
|
||||
}
|
||||
}
|
||||
//
|
||||
// if cygwin then
|
||||
// we have to prepend location of gcc32
|
||||
// and .. to start of absolute filenames to
|
||||
// have something that will exist in the
|
||||
// windows filesystem
|
||||
if (GccProcessor.isCygwin()) {
|
||||
GccProcessor.convertCygwinFilenames(libpath);
|
||||
}
|
||||
//
|
||||
// check that remaining entries are actual directories
|
||||
//
|
||||
int count = CUtil.checkDirectoryArray(libpath);
|
||||
//
|
||||
// populate return array with remaining entries
|
||||
//
|
||||
libDirs = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < libpath.length; i++) {
|
||||
if (libpath[i] != null) {
|
||||
libDirs[index++] = new File(libpath[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return libDirs;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isPluginModule()) {
|
||||
if (isDarwin()) {
|
||||
return machBundleLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
if (isDarwin()) {
|
||||
return machDllLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
public void link(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
try {
|
||||
GccLinker clone = (GccLinker) this.clone();
|
||||
LinkerParam param = config.getParam("target");
|
||||
if (param != null)
|
||||
clone.setCommand(param.getValue() + "-" + this.getCommand());
|
||||
clone.superlink(task, outputFile, sourceFiles, config);
|
||||
} catch (CloneNotSupportedException e) {
|
||||
superlink(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
||||
private void superlink(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
super.link(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
@ -0,0 +1,288 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc.cross;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
|
||||
|
||||
/**
|
||||
* A add-in class for Gcc processors
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class GccProcessor {
|
||||
// the results from gcc -dumpmachine
|
||||
private static String machine;
|
||||
private static String[] specs;
|
||||
// the results from gcc -dumpversion
|
||||
private static String version;
|
||||
private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
|
||||
String prefix, String extension, String[] patterns, int offset) {
|
||||
for (int i = 0; i < libnames.length; i++) {
|
||||
buf.setLength(0);
|
||||
buf.append(prefix);
|
||||
buf.append(libnames[i]);
|
||||
buf.append(extension);
|
||||
patterns[offset + i] = buf.toString();
|
||||
}
|
||||
return offset + libnames.length;
|
||||
}
|
||||
/**
|
||||
* Converts absolute Cygwin file or directory names to the corresponding
|
||||
* Win32 name.
|
||||
*
|
||||
* @param names
|
||||
* array of names, some elements may be null, will be changed in
|
||||
* place.
|
||||
*/
|
||||
public static void convertCygwinFilenames(String[] names) {
|
||||
if (names == null) {
|
||||
throw new NullPointerException("names");
|
||||
}
|
||||
File gccDir = CUtil.getExecutableLocation("gcc.exe");
|
||||
if (gccDir != null) {
|
||||
String prefix = gccDir.getAbsolutePath() + "/..";
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
String name = names[i];
|
||||
if (name != null && name.length() > 1 && name.charAt(0) == '/') {
|
||||
buf.setLength(0);
|
||||
buf.append(prefix);
|
||||
buf.append(name);
|
||||
names[i] = buf.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String getMachine() {
|
||||
if (machine == null) {
|
||||
String[] args = new String[]{"gcc", "-dumpmachine"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
if (cmdout.length == 0) {
|
||||
machine = "nomachine";
|
||||
} else {
|
||||
machine = cmdout[0];
|
||||
}
|
||||
}
|
||||
return machine;
|
||||
}
|
||||
public static String[] getOutputFileSwitch(String letter, String outputFile) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
if (outputFile.indexOf(' ') >= 0) {
|
||||
buf.append('"');
|
||||
buf.append(outputFile.replace('\\', '/'));
|
||||
buf.append('"');
|
||||
} else {
|
||||
buf.append(outputFile.replace('\\', '/'));
|
||||
}
|
||||
String[] retval = new String[]{letter, buf.toString()};
|
||||
return retval;
|
||||
}
|
||||
/**
|
||||
* Returns the contents of the gcc specs file.
|
||||
*
|
||||
* The implementation locates gcc.exe in the executable path and then
|
||||
* builds a relative path name from the results of -dumpmachine and
|
||||
* -dumpversion. Attempts to use gcc -dumpspecs to provide this information
|
||||
* resulted in stalling on the Execute.run
|
||||
*
|
||||
* @returns contents of the specs file
|
||||
*/
|
||||
public static String[] getSpecs() {
|
||||
if (specs == null) {
|
||||
File gccParent = CUtil.getExecutableLocation("gcc.exe");
|
||||
if (gccParent != null) {
|
||||
//
|
||||
// build a relative path like
|
||||
// ../lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
|
||||
//
|
||||
StringBuffer buf = new StringBuffer("../lib/gcc-lib/");
|
||||
buf.append(getMachine());
|
||||
buf.append('/');
|
||||
buf.append(getVersion());
|
||||
buf.append("/specs");
|
||||
//
|
||||
// resolve it relative to the location of gcc.exe
|
||||
//
|
||||
String relativePath = buf.toString();
|
||||
File specsFile = new File(gccParent, relativePath);
|
||||
//
|
||||
// found the specs file
|
||||
//
|
||||
try {
|
||||
//
|
||||
// read the lines in the file
|
||||
//
|
||||
BufferedReader reader = new BufferedReader(new FileReader(
|
||||
specsFile));
|
||||
Vector lines = new Vector(100);
|
||||
String line = reader.readLine();
|
||||
while (line != null) {
|
||||
lines.addElement(line);
|
||||
line = reader.readLine();
|
||||
}
|
||||
specs = new String[lines.size()];
|
||||
lines.copyInto(specs);
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (specs == null) {
|
||||
specs = new String[0];
|
||||
}
|
||||
return specs;
|
||||
}
|
||||
public static String getVersion() {
|
||||
if (version == null) {
|
||||
String[] args = new String[]{"gcc", "-dumpversion"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
if (cmdout.length == 0) {
|
||||
version = "noversion";
|
||||
} else {
|
||||
version = cmdout[0];
|
||||
}
|
||||
}
|
||||
return version;
|
||||
}
|
||||
public static boolean isCaseSensitive() {
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Determines if task is running with cygwin
|
||||
*
|
||||
* @return true if cygwin was detected
|
||||
*/
|
||||
public static boolean isCygwin() {
|
||||
return getMachine().indexOf("cygwin") > 0;
|
||||
}
|
||||
private static boolean isHPUX() {
|
||||
String osname = System.getProperty("os.name").toLowerCase();
|
||||
if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* Parses the results of the specs file for a specific processor and
|
||||
* options
|
||||
*
|
||||
* @param specsContent
|
||||
* Contents of specs file as returned from getSpecs
|
||||
* @param specSectionStart
|
||||
* start of spec section, for example "*cpp:"
|
||||
* @param options
|
||||
* command line switches such as "-istart"
|
||||
*/
|
||||
public static String[][] parseSpecs(String[] specsContent,
|
||||
String specSectionStart, String[] options) {
|
||||
if (specsContent == null) {
|
||||
throw new NullPointerException("specsContent");
|
||||
}
|
||||
if (specSectionStart == null) {
|
||||
throw new NullPointerException("specSectionStart");
|
||||
}
|
||||
if (options == null) {
|
||||
throw new NullPointerException("option");
|
||||
}
|
||||
String[][] optionValues = new String[options.length][];
|
||||
StringBuffer optionValue = new StringBuffer(40);
|
||||
for (int i = 0; i < specsContent.length; i++) {
|
||||
String specLine = specsContent[i];
|
||||
//
|
||||
// if start of section then start paying attention
|
||||
//
|
||||
if (specLine.startsWith(specSectionStart)) {
|
||||
Vector[] optionVectors = new Vector[options.length];
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
optionVectors[j] = new Vector(10);
|
||||
}
|
||||
//
|
||||
// go to next line and examine contents
|
||||
// and repeat until end of file
|
||||
//
|
||||
for (i++; i < specsContent.length; i++) {
|
||||
specLine = specsContent[i];
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
int optionStart = specLine.indexOf(options[j]);
|
||||
while (optionStart >= 0) {
|
||||
optionValue.setLength(0);
|
||||
//
|
||||
// walk rest of line looking for first non
|
||||
// whitespace
|
||||
// and then next space
|
||||
boolean hasNonBlank = false;
|
||||
int k = optionStart + options[j].length();
|
||||
for (; k < specLine.length(); k++) {
|
||||
//
|
||||
// either a blank or a "}" (close of
|
||||
// conditional)
|
||||
// section will end the path
|
||||
//
|
||||
if (specLine.charAt(k) == ' '
|
||||
|| specLine.charAt(k) == '}') {
|
||||
if (hasNonBlank) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
hasNonBlank = true;
|
||||
optionValue.append(specLine.charAt(k));
|
||||
}
|
||||
}
|
||||
//
|
||||
// transition back to whitespace
|
||||
// value is over, add it to vector
|
||||
if (hasNonBlank) {
|
||||
optionVectors[j].addElement(optionValue
|
||||
.toString());
|
||||
}
|
||||
//
|
||||
// find next occurance on line
|
||||
//
|
||||
optionStart = specLine.indexOf(options[j], k);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// copy vectors over to option arrays
|
||||
//
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
optionValues[j] = new String[optionVectors[j].size()];
|
||||
optionVectors[j].copyInto(optionValues[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// fill in any missing option values with
|
||||
// a zero-length string array
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
String[] zeroLenArray = new String[0];
|
||||
if (optionValues[i] == null) {
|
||||
optionValues[i] = zeroLenArray;
|
||||
}
|
||||
}
|
||||
return optionValues;
|
||||
}
|
||||
private GccProcessor() {
|
||||
}
|
||||
}
|
@ -0,0 +1,228 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2003-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.gcc.cross;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.LinkerParam;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
|
||||
import net.sf.antcontrib.cpptasks.types.LibrarySet;
|
||||
|
||||
import org.apache.tools.ant.BuildException;
|
||||
/**
|
||||
* Adapter for the g++ variant of the GCC linker
|
||||
*
|
||||
* @author Stephen M. Webb <stephen.webb@bregmasoft.com>
|
||||
*/
|
||||
public class GppLinker extends AbstractLdLinker {
|
||||
protected static final String[] discardFiles = new String[0];
|
||||
protected static final String[] objFiles = new String[]{".o", ".a", ".lib",
|
||||
".dll", ".so", ".sl"};
|
||||
private static final GppLinker dllLinker = new GppLinker("gcc", objFiles,
|
||||
discardFiles, "lib", ".so", false, new GppLinker("gcc", objFiles,
|
||||
discardFiles, "lib", ".so", true, null));
|
||||
private final static String libPrefix = "libraries: =";
|
||||
protected static final String[] libtoolObjFiles = new String[]{".fo", ".a",
|
||||
".lib", ".dll", ".so", ".sl"};
|
||||
private static String[] linkerOptions = new String[]{"-bundle", "-dylib",
|
||||
"-dynamic", "-dynamiclib", "-nostartfiles", "-nostdlib",
|
||||
"-prebind", "-s", "-static", "-shared", "-symbolic", "-Xlinker"};
|
||||
private static final GppLinker instance = new GppLinker("gcc", objFiles,
|
||||
discardFiles, "", "", false, null);
|
||||
private static final GppLinker machDllLinker = new GppLinker("gcc",
|
||||
objFiles, discardFiles, "lib", ".dylib", false, null);
|
||||
private static final GppLinker machPluginLinker = new GppLinker("gcc",
|
||||
objFiles, discardFiles, "lib", ".bundle", false, null);
|
||||
public static GppLinker getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private File[] libDirs;
|
||||
private String runtimeLibrary;
|
||||
protected GppLinker(String command, String[] extensions,
|
||||
String[] ignoredExtensions, String outputPrefix,
|
||||
String outputSuffix, boolean isLibtool, GppLinker libtoolLinker) {
|
||||
super(command, "-dumpversion", extensions, ignoredExtensions,
|
||||
outputPrefix, outputSuffix, isLibtool, libtoolLinker);
|
||||
}
|
||||
protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
|
||||
super.addImpliedArgs(debug, linkType, args, defaultflag);
|
||||
if (getIdentifier().indexOf("mingw") >= 0) {
|
||||
if (linkType.isSubsystemConsole()) {
|
||||
args.addElement("-mconsole");
|
||||
}
|
||||
if (linkType.isSubsystemGUI()) {
|
||||
args.addElement("-mwindows");
|
||||
}
|
||||
}
|
||||
if (linkType.isStaticRuntime()) {
|
||||
String[] cmdin = new String[]{"g++", "-print-file-name=libstdc++.a"};
|
||||
String[] cmdout = CaptureStreamHandler.run(cmdin);
|
||||
if (cmdout.length > 0) {
|
||||
runtimeLibrary = cmdout[0];
|
||||
} else {
|
||||
runtimeLibrary = null;
|
||||
}
|
||||
} else {
|
||||
runtimeLibrary = "-lstdc++";
|
||||
}
|
||||
}
|
||||
public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
|
||||
Vector preargs, Vector midargs, Vector endargs) {
|
||||
String[] rs = super.addLibrarySets(task, libsets, preargs, midargs,
|
||||
endargs);
|
||||
if (runtimeLibrary != null) {
|
||||
endargs.addElement(runtimeLibrary);
|
||||
}
|
||||
return rs;
|
||||
}
|
||||
protected Object clone() throws CloneNotSupportedException {
|
||||
GppLinker clone = (GppLinker) super.clone();
|
||||
return clone;
|
||||
}
|
||||
/**
|
||||
* Allows drived linker to decorate linker option. Override by GppLinker to
|
||||
* prepend a "-Wl," to pass option to through gcc to linker.
|
||||
*
|
||||
* @param buf
|
||||
* buffer that may be used and abused in the decoration process,
|
||||
* must not be null.
|
||||
* @param arg
|
||||
* linker argument
|
||||
*/
|
||||
public String decorateLinkerOption(StringBuffer buf, String arg) {
|
||||
String decoratedArg = arg;
|
||||
if (arg.length() > 1 && arg.charAt(0) == '-') {
|
||||
switch (arg.charAt(1)) {
|
||||
//
|
||||
// passed automatically by GCC
|
||||
//
|
||||
case 'g' :
|
||||
case 'f' :
|
||||
case 'F' :
|
||||
/* Darwin */
|
||||
case 'm' :
|
||||
case 'O' :
|
||||
case 'W' :
|
||||
case 'l' :
|
||||
case 'L' :
|
||||
case 'u' :
|
||||
break;
|
||||
default :
|
||||
boolean known = false;
|
||||
for (int i = 0; i < linkerOptions.length; i++) {
|
||||
if (linkerOptions[i].equals(arg)) {
|
||||
known = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!known) {
|
||||
buf.setLength(0);
|
||||
buf.append("-Wl,");
|
||||
buf.append(arg);
|
||||
decoratedArg = buf.toString();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return decoratedArg;
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
public File[] getLibraryPath() {
|
||||
if (libDirs == null) {
|
||||
Vector dirs = new Vector();
|
||||
// Ask GCC where it will look for its libraries.
|
||||
String[] args = new String[]{"g++", "-print-search-dirs"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
for (int i = 0; i < cmdout.length; ++i) {
|
||||
int prefixIndex = cmdout[i].indexOf(libPrefix);
|
||||
if (prefixIndex >= 0) {
|
||||
// Special case DOS-type GCCs like MinGW or Cygwin
|
||||
int s = prefixIndex + libPrefix.length();
|
||||
int t = cmdout[i].indexOf(';', s);
|
||||
while (t > 0) {
|
||||
dirs.addElement(cmdout[i].substring(s, t));
|
||||
s = t + 1;
|
||||
t = cmdout[i].indexOf(';', s);
|
||||
}
|
||||
dirs.addElement(cmdout[i].substring(s));
|
||||
++i;
|
||||
for (; i < cmdout.length; ++i) {
|
||||
dirs.addElement(cmdout[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Eliminate all but actual directories.
|
||||
String[] libpath = new String[dirs.size()];
|
||||
dirs.copyInto(libpath);
|
||||
int count = CUtil.checkDirectoryArray(libpath);
|
||||
// Build return array.
|
||||
libDirs = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < libpath.length; ++i) {
|
||||
if (libpath[i] != null) {
|
||||
libDirs[index++] = new File(libpath[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return libDirs;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isPluginModule()) {
|
||||
if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
|
||||
return machPluginLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
|
||||
return machDllLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
public void link(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
try {
|
||||
GppLinker clone = (GppLinker) this.clone();
|
||||
LinkerParam param = config.getParam("target");
|
||||
if (param != null)
|
||||
clone.setCommand(param.getValue() + "-" + this.getCommand());
|
||||
clone.superlink(task, outputFile, sourceFiles, config);
|
||||
} catch (CloneNotSupportedException e) {
|
||||
superlink(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
||||
private void superlink(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
super.link(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc.cross;
|
||||
import java.io.File;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.LinkerParam;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CommandLineLinkerConfiguration;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
|
||||
|
||||
import org.apache.tools.ant.BuildException;
|
||||
/**
|
||||
* Adapter for the 'ld' linker
|
||||
*
|
||||
* @author Curt Arnold
|
||||
*/
|
||||
public final class LdLinker extends AbstractLdLinker {
|
||||
private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
|
||||
".lib", ".dll", ".so", ".sl"};
|
||||
private static final String[] objFiles = new String[]{".o", ".a", ".lib",
|
||||
".dll", ".so", ".sl"};
|
||||
private static final String[] discardFiles = new String[0];
|
||||
private static final LdLinker dllLinker = new LdLinker("ld", objFiles,
|
||||
discardFiles, "lib", ".so", false, new LdLinker("ld", objFiles,
|
||||
discardFiles, "lib", ".so", true, null));
|
||||
private static final LdLinker instance = new LdLinker("ld", objFiles,
|
||||
discardFiles, "", "", false, null);
|
||||
public static LdLinker getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private File[] libDirs;
|
||||
private LdLinker(String command, String[] extensions,
|
||||
String[] ignoredExtensions, String outputPrefix,
|
||||
String outputSuffix, boolean isLibtool, LdLinker libtoolLinker) {
|
||||
super(command, "-version", extensions, ignoredExtensions, outputPrefix,
|
||||
outputSuffix, isLibtool, libtoolLinker);
|
||||
}
|
||||
protected Object clone() throws CloneNotSupportedException {
|
||||
LdLinker clone = (LdLinker) super.clone();
|
||||
return clone;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
return dllLinker;
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
public void link(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
try {
|
||||
LdLinker clone = (LdLinker) this.clone();
|
||||
LinkerParam param = config.getParam("target");
|
||||
if (param != null)
|
||||
clone.setCommand(param.getValue() + "-" + this.getCommand());
|
||||
clone.superlink(task, outputFile, sourceFiles, config);
|
||||
} catch (CloneNotSupportedException e) {
|
||||
superlink(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
||||
private void superlink(CCTask task, File outputFile, String[] sourceFiles,
|
||||
CommandLineLinkerConfiguration config) throws BuildException {
|
||||
super.link(task, outputFile, sourceFiles, config);
|
||||
}
|
||||
}
|
@ -0,0 +1,245 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc.cross.sparc_sun_solaris2;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Processor;
|
||||
import net.sf.antcontrib.cpptasks.gcc.GccCompatibleCCompiler;
|
||||
import net.sf.antcontrib.cpptasks.parser.CParser;
|
||||
import net.sf.antcontrib.cpptasks.parser.FortranParser;
|
||||
import net.sf.antcontrib.cpptasks.parser.Parser;
|
||||
|
||||
import org.apache.tools.ant.BuildException;
|
||||
import org.apache.tools.ant.types.Environment;
|
||||
import net.sf.antcontrib.cpptasks.OptimizationEnum;
|
||||
|
||||
/**
|
||||
* Adapter for the GCC C/C++ compiler
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
public final class GccCCompiler extends GccCompatibleCCompiler {
|
||||
private final static String[] sourceExtensions = new String[]{".c", /* C */
|
||||
".cc", /* C++ */
|
||||
".cpp", /* C++ */
|
||||
".cxx", /* C++ */
|
||||
".c++", /* C++ */
|
||||
".i", /* preprocessed C */
|
||||
".ii", /* preprocessed C++ */
|
||||
".f", /* FORTRAN */
|
||||
".for", /* FORTRAN */
|
||||
".m", /* Objective-C */
|
||||
".mm", /* Objected-C++ */
|
||||
".s" /* Assembly */
|
||||
};
|
||||
private final static String[] headerExtensions = new String[]{".h", ".hpp",
|
||||
".inl"};
|
||||
public static final String CMD_PREFIX = "sparc-sun-solaris2-";
|
||||
private static final GccCCompiler cppInstance = new GccCCompiler(CMD_PREFIX
|
||||
+ "c++", sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler(CMD_PREFIX + "c++", sourceExtensions,
|
||||
headerExtensions, true, null, false, null), false, null);
|
||||
private static final GccCCompiler g77Instance = new GccCCompiler(CMD_PREFIX
|
||||
+ "g77", sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler(CMD_PREFIX + "g77", sourceExtensions,
|
||||
headerExtensions, true, null, false, null), false, null);
|
||||
private static final GccCCompiler gppInstance = new GccCCompiler(CMD_PREFIX
|
||||
+ "g++", sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler(CMD_PREFIX + "g++", sourceExtensions,
|
||||
headerExtensions, true, null, false, null), false, null);
|
||||
private static final GccCCompiler instance = new GccCCompiler(CMD_PREFIX
|
||||
+ "gcc", sourceExtensions, headerExtensions, false,
|
||||
new GccCCompiler(CMD_PREFIX + "gcc", sourceExtensions,
|
||||
headerExtensions, true, null, false, null), false, null);
|
||||
/**
|
||||
* Gets c++ adapter
|
||||
*/
|
||||
public static GccCCompiler getCppInstance() {
|
||||
return cppInstance;
|
||||
}
|
||||
/**
|
||||
* Gets g77 adapter
|
||||
*/
|
||||
public static GccCCompiler getG77Instance() {
|
||||
return g77Instance;
|
||||
}
|
||||
/**
|
||||
* Gets gpp adapter
|
||||
*/
|
||||
public static GccCCompiler getGppInstance() {
|
||||
return gppInstance;
|
||||
}
|
||||
/**
|
||||
* Gets gcc adapter
|
||||
*/
|
||||
public static GccCCompiler getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private String identifier;
|
||||
private File[] includePath;
|
||||
private boolean isPICMeaningful = true;
|
||||
/**
|
||||
* Private constructor. Use GccCCompiler.getInstance() to get singleton
|
||||
* instance of this class.
|
||||
*/
|
||||
private GccCCompiler(String command, String[] sourceExtensions,
|
||||
String[] headerExtensions, boolean isLibtool,
|
||||
GccCCompiler libtoolCompiler, boolean newEnvironment,
|
||||
Environment env) {
|
||||
super(command, null, sourceExtensions, headerExtensions, isLibtool,
|
||||
libtoolCompiler, newEnvironment, env);
|
||||
isPICMeaningful = System.getProperty("os.name").indexOf("Windows") < 0;
|
||||
}
|
||||
public void addImpliedArgs(final Vector args,
|
||||
final boolean debug,
|
||||
final boolean multithreaded,
|
||||
final boolean exceptions,
|
||||
final LinkType linkType,
|
||||
final Boolean rtti,
|
||||
final OptimizationEnum optimization,
|
||||
final Boolean defaultflag) {
|
||||
super.addImpliedArgs(args, debug, multithreaded,
|
||||
exceptions, linkType, rtti, optimization, defaultflag);
|
||||
if (isPICMeaningful && linkType.isSharedLibrary()) {
|
||||
args.addElement("-fPIC");
|
||||
}
|
||||
}
|
||||
public Processor changeEnvironment(boolean newEnvironment, Environment env) {
|
||||
if (newEnvironment || env != null) {
|
||||
return new GccCCompiler(getCommand(), this.getSourceExtensions(),
|
||||
this.getHeaderExtensions(), this.getLibtool(),
|
||||
(GccCCompiler) this.getLibtoolCompiler(), newEnvironment,
|
||||
env);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Create parser to determine dependencies.
|
||||
*
|
||||
* Will create appropriate parser (C++, FORTRAN) based on file extension.
|
||||
*
|
||||
*/
|
||||
protected Parser createParser(File source) {
|
||||
if (source != null) {
|
||||
String sourceName = source.getName();
|
||||
int lastDot = sourceName.lastIndexOf('.');
|
||||
if (lastDot >= 0 && lastDot + 1 < sourceName.length()) {
|
||||
char afterDot = sourceName.charAt(lastDot + 1);
|
||||
if (afterDot == 'f' || afterDot == 'F') {
|
||||
return new FortranParser();
|
||||
}
|
||||
}
|
||||
}
|
||||
return new CParser();
|
||||
}
|
||||
public File[] getEnvironmentIncludePath() {
|
||||
if (includePath == null) {
|
||||
//
|
||||
// construct default include path from machine id and version id
|
||||
//
|
||||
String[] defaultInclude = new String[1];
|
||||
StringBuffer buf = new StringBuffer("/lib/");
|
||||
buf.append(GccProcessor.getMachine());
|
||||
buf.append('/');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
buf.append("/include");
|
||||
defaultInclude[0] = buf.toString();
|
||||
//
|
||||
// read specs file and look for -istart and -idirafter
|
||||
//
|
||||
String[] specs = GccProcessor.getSpecs();
|
||||
String[][] optionValues = GccProcessor.parseSpecs(specs, "*cpp:",
|
||||
new String[]{"-isystem ", "-idirafter "});
|
||||
//
|
||||
// if no entries were found, then use a default path
|
||||
//
|
||||
if (optionValues[0].length == 0 && optionValues[1].length == 0) {
|
||||
optionValues[0] = new String[]{"/usr/local/include",
|
||||
"/usr/include", "/usr/include/win32api"};
|
||||
}
|
||||
//
|
||||
// remove mingw entries.
|
||||
// For MinGW compiles this will mean the
|
||||
// location of the sys includes will be
|
||||
// wrong in dependencies.xml
|
||||
// but that should have no significant effect
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
for (int j = 0; j < optionValues[i].length; j++) {
|
||||
if (optionValues[i][j].indexOf("mingw") > 0) {
|
||||
optionValues[i][j] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// if cygwin then
|
||||
// we have to prepend location of gcc32
|
||||
// and .. to start of absolute filenames to
|
||||
// have something that will exist in the
|
||||
// windows filesystem
|
||||
if (GccProcessor.isCygwin()) {
|
||||
GccProcessor.convertCygwinFilenames(optionValues[0]);
|
||||
GccProcessor.convertCygwinFilenames(optionValues[1]);
|
||||
GccProcessor.convertCygwinFilenames(defaultInclude);
|
||||
}
|
||||
int count = CUtil.checkDirectoryArray(optionValues[0]);
|
||||
count += CUtil.checkDirectoryArray(optionValues[1]);
|
||||
count += CUtil.checkDirectoryArray(defaultInclude);
|
||||
includePath = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
for (int j = 0; j < optionValues[i].length; j++) {
|
||||
if (optionValues[i][j] != null) {
|
||||
includePath[index++] = new File(optionValues[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < defaultInclude.length; i++) {
|
||||
if (defaultInclude[i] != null) {
|
||||
includePath[index++] = new File(defaultInclude[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (File[]) includePath.clone();
|
||||
}
|
||||
public String getIdentifier() throws BuildException {
|
||||
if (identifier == null) {
|
||||
StringBuffer buf;
|
||||
if (getLibtool()) {
|
||||
buf = new StringBuffer("libtool ");
|
||||
} else {
|
||||
buf = new StringBuffer(' ');
|
||||
}
|
||||
buf.append(getCommand());
|
||||
buf.append(' ');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
buf.append(' ');
|
||||
buf.append(GccProcessor.getMachine());
|
||||
identifier = buf.toString();
|
||||
}
|
||||
return identifier;
|
||||
}
|
||||
public Linker getLinker(LinkType linkType) {
|
||||
return GccLinker.getInstance().getLinker(linkType);
|
||||
}
|
||||
public int getMaximumCommandLength() {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc.cross.sparc_sun_solaris2;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractArLibrarian;
|
||||
/**
|
||||
* Adapter for the 'ar' archiver
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
public final class GccLibrarian extends AbstractArLibrarian {
|
||||
private static String[] objFileExtensions = new String[]{".o"};
|
||||
private static GccLibrarian instance = new GccLibrarian(
|
||||
GccCCompiler.CMD_PREFIX + "ar", objFileExtensions, false,
|
||||
new GccLibrarian(GccCCompiler.CMD_PREFIX + "ar", objFileExtensions,
|
||||
true, null));
|
||||
public static GccLibrarian getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private GccLibrarian(String command, String[] inputExtensions,
|
||||
boolean isLibtool, GccLibrarian libtoolLibrarian) {
|
||||
super(command, "V", inputExtensions, new String[0], "lib", ".a",
|
||||
isLibtool, libtoolLibrarian);
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
return GccLinker.getInstance().getLinker(type);
|
||||
}
|
||||
}
|
@ -0,0 +1,215 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc.cross.sparc_sun_solaris2;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
|
||||
/**
|
||||
* Adapter for the GCC linker
|
||||
*
|
||||
* @author Adam Murdoch
|
||||
*/
|
||||
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(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
|
||||
".so", false, new GccLinker(GccCCompiler.CMD_PREFIX + "gcc",
|
||||
objFiles, discardFiles, "lib", ".so", true, null));
|
||||
private static final GccLinker instance = new GccLinker(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "", "",
|
||||
false, null);
|
||||
private static final GccLinker machBundleLinker = new GccLinker(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
|
||||
".bundle", false, null);
|
||||
private static final GccLinker machDllLinker = new GccLinker(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
|
||||
".dylib", false, null);
|
||||
public static GccLinker getInstance() {
|
||||
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, Boolean defaultflag) {
|
||||
super.addImpliedArgs(debug, linkType, args, defaultflag);
|
||||
if (getIdentifier().indexOf("mingw") >= 0) {
|
||||
if (linkType.isSubsystemConsole()) {
|
||||
args.addElement("-mconsole");
|
||||
}
|
||||
if (linkType.isSubsystemGUI()) {
|
||||
args.addElement("-mwindows");
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Allows drived linker to decorate linker option. Override by GccLinker to
|
||||
* prepend a "-Wl," to pass option to through gcc to linker.
|
||||
*
|
||||
* @param buf
|
||||
* buffer that may be used and abused in the decoration process,
|
||||
* must not be null.
|
||||
* @param arg
|
||||
* linker argument
|
||||
*/
|
||||
public String decorateLinkerOption(StringBuffer buf, String arg) {
|
||||
String decoratedArg = arg;
|
||||
if (arg.length() > 1 && arg.charAt(0) == '-') {
|
||||
switch (arg.charAt(1)) {
|
||||
//
|
||||
// passed automatically by GCC
|
||||
//
|
||||
case 'g' :
|
||||
case 'f' :
|
||||
case 'F' :
|
||||
/* Darwin */
|
||||
case 'm' :
|
||||
case 'O' :
|
||||
case 'W' :
|
||||
case 'l' :
|
||||
case 'L' :
|
||||
case 'u' :
|
||||
case 'v' :
|
||||
break;
|
||||
default :
|
||||
boolean known = false;
|
||||
for (int i = 0; i < linkerOptions.length; i++) {
|
||||
if (linkerOptions[i].equals(arg)) {
|
||||
known = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!known) {
|
||||
buf.setLength(0);
|
||||
buf.append("-Wl,");
|
||||
buf.append(arg);
|
||||
decoratedArg = buf.toString();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return decoratedArg;
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
public File[] getLibraryPath() {
|
||||
if (libDirs == null) {
|
||||
//
|
||||
// construct gcc lib path from machine and version
|
||||
//
|
||||
StringBuffer buf = new StringBuffer("/lib/gcc-lib/");
|
||||
buf.append(GccProcessor.getMachine());
|
||||
buf.append('/');
|
||||
buf.append(GccProcessor.getVersion());
|
||||
//
|
||||
// build default path from gcc and system /lib and /lib/w32api
|
||||
//
|
||||
String[] impliedLibPath = new String[]{buf.toString(),
|
||||
"/lib/w32api", "/lib"};
|
||||
//
|
||||
// read gcc specs file for other library paths
|
||||
//
|
||||
String[] specs = GccProcessor.getSpecs();
|
||||
String[][] libpaths = GccProcessor.parseSpecs(specs, "*link:",
|
||||
new String[]{"%q"});
|
||||
String[] libpath;
|
||||
if (libpaths[0].length > 0) {
|
||||
libpath = new String[libpaths[0].length + 3];
|
||||
int i = 0;
|
||||
for (; i < libpaths[0].length; i++) {
|
||||
libpath[i] = libpaths[0][i];
|
||||
}
|
||||
libpath[i++] = buf.toString();
|
||||
libpath[i++] = "/lib/w32api";
|
||||
libpath[i++] = "/lib";
|
||||
} else {
|
||||
//
|
||||
// if a failure to find any matches then
|
||||
// use some default values for lib path entries
|
||||
libpath = new String[]{"/usr/local/lib/mingw",
|
||||
"/usr/local/lib", "/usr/lib/w32api", "/usr/lib/mingw",
|
||||
"/usr/lib", buf.toString(), "/lib/w32api", "/lib"};
|
||||
}
|
||||
for (int i = 0; i < libpath.length; i++) {
|
||||
if (libpath[i].indexOf("mingw") >= 0) {
|
||||
libpath[i] = null;
|
||||
}
|
||||
}
|
||||
//
|
||||
// if cygwin then
|
||||
// we have to prepend location of gcc32
|
||||
// and .. to start of absolute filenames to
|
||||
// have something that will exist in the
|
||||
// windows filesystem
|
||||
if (GccProcessor.isCygwin()) {
|
||||
GccProcessor.convertCygwinFilenames(libpath);
|
||||
}
|
||||
//
|
||||
// check that remaining entries are actual directories
|
||||
//
|
||||
int count = CUtil.checkDirectoryArray(libpath);
|
||||
//
|
||||
// populate return array with remaining entries
|
||||
//
|
||||
libDirs = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < libpath.length; i++) {
|
||||
if (libpath[i] != null) {
|
||||
libDirs[index++] = new File(libpath[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return libDirs;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isPluginModule()) {
|
||||
if (isDarwin()) {
|
||||
return machBundleLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
if (isDarwin()) {
|
||||
return machDllLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,305 @@
|
||||
/*
|
||||
*
|
||||
* 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.gcc.cross.sparc_sun_solaris2;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
|
||||
import net.sf.antcontrib.cpptasks.types.LibraryTypeEnum;
|
||||
|
||||
/**
|
||||
* A add-in class for Gcc processors
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class GccProcessor {
|
||||
// the results from gcc -dumpmachine
|
||||
private static String machine;
|
||||
private static String[] specs;
|
||||
// the results from gcc -dumpversion
|
||||
private static String version;
|
||||
private static int addLibraryPatterns(String[] libnames, StringBuffer buf,
|
||||
String prefix, String extension, String[] patterns, int offset) {
|
||||
for (int i = 0; i < libnames.length; i++) {
|
||||
buf.setLength(0);
|
||||
buf.append(prefix);
|
||||
buf.append(libnames[i]);
|
||||
buf.append(extension);
|
||||
patterns[offset + i] = buf.toString();
|
||||
}
|
||||
return offset + libnames.length;
|
||||
}
|
||||
/**
|
||||
* Converts absolute Cygwin file or directory names to the corresponding
|
||||
* Win32 name.
|
||||
*
|
||||
* @param names
|
||||
* array of names, some elements may be null, will be changed in
|
||||
* place.
|
||||
*/
|
||||
public static void convertCygwinFilenames(String[] names) {
|
||||
if (names == null) {
|
||||
throw new NullPointerException("names");
|
||||
}
|
||||
File gccDir = CUtil.getExecutableLocation(GccCCompiler.CMD_PREFIX
|
||||
+ "gcc.exe");
|
||||
if (gccDir != null) {
|
||||
String prefix = gccDir.getAbsolutePath() + "/..";
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
String name = names[i];
|
||||
if (name != null && name.length() > 1 && name.charAt(0) == '/') {
|
||||
buf.setLength(0);
|
||||
buf.append(prefix);
|
||||
buf.append(name);
|
||||
names[i] = buf.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public static String[] getLibraryPatterns(String[] libnames, LibraryTypeEnum libType) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
String[] patterns = new String[libnames.length * 2];
|
||||
int offset = addLibraryPatterns(libnames, buf, "lib", ".a", patterns, 0);
|
||||
if (isHPUX()) {
|
||||
offset = addLibraryPatterns(libnames, buf, "lib", ".sl", patterns,
|
||||
offset);
|
||||
} else {
|
||||
offset = addLibraryPatterns(libnames, buf, "lib", ".so", patterns,
|
||||
offset);
|
||||
}
|
||||
return patterns;
|
||||
}
|
||||
public static String getMachine() {
|
||||
if (machine == null) {
|
||||
String[] args = new String[]{GccCCompiler.CMD_PREFIX + "gcc",
|
||||
"-dumpmachine"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
if (cmdout.length == 0) {
|
||||
machine = "nomachine";
|
||||
} else {
|
||||
machine = cmdout[0];
|
||||
}
|
||||
}
|
||||
return machine;
|
||||
}
|
||||
public static String[] getOutputFileSwitch(String letter, String outputFile) {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
if (outputFile.indexOf(' ') >= 0) {
|
||||
buf.append('"');
|
||||
buf.append(outputFile.replace('\\', '/'));
|
||||
buf.append('"');
|
||||
} else {
|
||||
buf.append(outputFile.replace('\\', '/'));
|
||||
}
|
||||
String[] retval = new String[]{letter, buf.toString()};
|
||||
return retval;
|
||||
}
|
||||
/**
|
||||
* Returns the contents of the gcc specs file.
|
||||
*
|
||||
* The implementation locates gcc.exe in the executable path and then
|
||||
* builds a relative path name from the results of -dumpmachine and
|
||||
* -dumpversion. Attempts to use gcc -dumpspecs to provide this information
|
||||
* resulted in stalling on the Execute.run
|
||||
*
|
||||
* @returns contents of the specs file
|
||||
*/
|
||||
public static String[] getSpecs() {
|
||||
if (specs == null) {
|
||||
File gccParent = CUtil
|
||||
.getExecutableLocation(GccCCompiler.CMD_PREFIX + "gcc.exe");
|
||||
if (gccParent != null) {
|
||||
//
|
||||
// build a relative path like
|
||||
// ../lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
|
||||
//
|
||||
StringBuffer buf = new StringBuffer("../lib/gcc-lib/");
|
||||
buf.append(getMachine());
|
||||
buf.append('/');
|
||||
buf.append(getVersion());
|
||||
buf.append("/specs");
|
||||
//
|
||||
// resolve it relative to the location of gcc.exe
|
||||
//
|
||||
String relativePath = buf.toString();
|
||||
File specsFile = new File(gccParent, relativePath);
|
||||
//
|
||||
// found the specs file
|
||||
//
|
||||
try {
|
||||
//
|
||||
// read the lines in the file
|
||||
//
|
||||
BufferedReader reader = new BufferedReader(new FileReader(
|
||||
specsFile));
|
||||
Vector lines = new Vector(100);
|
||||
String line = reader.readLine();
|
||||
while (line != null) {
|
||||
lines.addElement(line);
|
||||
line = reader.readLine();
|
||||
}
|
||||
specs = new String[lines.size()];
|
||||
lines.copyInto(specs);
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (specs == null) {
|
||||
specs = new String[0];
|
||||
}
|
||||
return specs;
|
||||
}
|
||||
public static String getVersion() {
|
||||
if (version == null) {
|
||||
String[] args = new String[]{GccCCompiler.CMD_PREFIX + "gcc",
|
||||
"-dumpversion"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
if (cmdout.length == 0) {
|
||||
version = "noversion";
|
||||
} else {
|
||||
version = cmdout[0];
|
||||
}
|
||||
}
|
||||
return version;
|
||||
}
|
||||
public static boolean isCaseSensitive() {
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Determines if task is running with cygwin
|
||||
*
|
||||
* @return true if cygwin was detected
|
||||
*/
|
||||
public static boolean isCygwin() {
|
||||
return getMachine().indexOf("cygwin") > 0;
|
||||
}
|
||||
private static boolean isHPUX() {
|
||||
String osname = System.getProperty("os.name").toLowerCase();
|
||||
if (osname.indexOf("hp") >= 0 && osname.indexOf("ux") >= 0) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* Parses the results of the specs file for a specific processor and
|
||||
* options
|
||||
*
|
||||
* @param specsContent
|
||||
* Contents of specs file as returned from getSpecs
|
||||
* @param specSectionStart
|
||||
* start of spec section, for example "*cpp:"
|
||||
* @param options
|
||||
* command line switches such as "-istart"
|
||||
*/
|
||||
public static String[][] parseSpecs(String[] specsContent,
|
||||
String specSectionStart, String[] options) {
|
||||
if (specsContent == null) {
|
||||
throw new NullPointerException("specsContent");
|
||||
}
|
||||
if (specSectionStart == null) {
|
||||
throw new NullPointerException("specSectionStart");
|
||||
}
|
||||
if (options == null) {
|
||||
throw new NullPointerException("option");
|
||||
}
|
||||
String[][] optionValues = new String[options.length][];
|
||||
StringBuffer optionValue = new StringBuffer(40);
|
||||
for (int i = 0; i < specsContent.length; i++) {
|
||||
String specLine = specsContent[i];
|
||||
//
|
||||
// if start of section then start paying attention
|
||||
//
|
||||
if (specLine.startsWith(specSectionStart)) {
|
||||
Vector[] optionVectors = new Vector[options.length];
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
optionVectors[j] = new Vector(10);
|
||||
}
|
||||
//
|
||||
// go to next line and examine contents
|
||||
// and repeat until end of file
|
||||
//
|
||||
for (i++; i < specsContent.length; i++) {
|
||||
specLine = specsContent[i];
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
int optionStart = specLine.indexOf(options[j]);
|
||||
while (optionStart >= 0) {
|
||||
optionValue.setLength(0);
|
||||
//
|
||||
// walk rest of line looking for first non
|
||||
// whitespace
|
||||
// and then next space
|
||||
boolean hasNonBlank = false;
|
||||
int k = optionStart + options[j].length();
|
||||
for (; k < specLine.length(); k++) {
|
||||
//
|
||||
// either a blank or a "}" (close of
|
||||
// conditional)
|
||||
// section will end the path
|
||||
//
|
||||
if (specLine.charAt(k) == ' '
|
||||
|| specLine.charAt(k) == '}') {
|
||||
if (hasNonBlank) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
hasNonBlank = true;
|
||||
optionValue.append(specLine.charAt(k));
|
||||
}
|
||||
}
|
||||
//
|
||||
// transition back to whitespace
|
||||
// value is over, add it to vector
|
||||
if (hasNonBlank) {
|
||||
optionVectors[j].addElement(optionValue
|
||||
.toString());
|
||||
}
|
||||
//
|
||||
// find next occurance on line
|
||||
//
|
||||
optionStart = specLine.indexOf(options[j], k);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// copy vectors over to option arrays
|
||||
//
|
||||
for (int j = 0; j < options.length; j++) {
|
||||
optionValues[j] = new String[optionVectors[j].size()];
|
||||
optionVectors[j].copyInto(optionValues[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
// fill in any missing option values with
|
||||
// a zero-length string array
|
||||
for (int i = 0; i < optionValues.length; i++) {
|
||||
String[] zeroLenArray = new String[0];
|
||||
if (optionValues[i] == null) {
|
||||
optionValues[i] = zeroLenArray;
|
||||
}
|
||||
}
|
||||
return optionValues;
|
||||
}
|
||||
private GccProcessor() {
|
||||
}
|
||||
}
|
@ -0,0 +1,210 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2003-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.gcc.cross.sparc_sun_solaris2;
|
||||
import java.io.File;
|
||||
import java.util.Vector;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.CCTask;
|
||||
import net.sf.antcontrib.cpptasks.CUtil;
|
||||
import net.sf.antcontrib.cpptasks.compiler.CaptureStreamHandler;
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
|
||||
import net.sf.antcontrib.cpptasks.types.LibrarySet;
|
||||
/**
|
||||
* Adapter for the g++ variant of the GCC linker
|
||||
*
|
||||
* @author Stephen M. Webb <stephen.webb@bregmasoft.com>
|
||||
*/
|
||||
public class GppLinker extends AbstractLdLinker {
|
||||
protected static final String[] discardFiles = new String[0];
|
||||
protected static final String[] objFiles = new String[]{".o", ".a", ".lib",
|
||||
".dll", ".so", ".sl"};
|
||||
private final static String libPrefix = "libraries: =";
|
||||
protected static final String[] libtoolObjFiles = new String[]{".fo", ".a",
|
||||
".lib", ".dll", ".so", ".sl"};
|
||||
private static String[] linkerOptions = new String[]{"-bundle", "-dylib",
|
||||
"-dynamic", "-dynamiclib", "-nostartfiles", "-nostdlib",
|
||||
"-prebind", "-s", "-static", "-shared", "-symbolic", "-Xlinker"};
|
||||
private static final GppLinker dllLinker = new GppLinker(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
|
||||
".so", false, new GppLinker(GccCCompiler.CMD_PREFIX + "gcc",
|
||||
objFiles, discardFiles, "lib", ".so", true, null));
|
||||
private static final GppLinker instance = new GppLinker(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "", "",
|
||||
false, null);
|
||||
private static final GppLinker machDllLinker = new GppLinker(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
|
||||
".dylib", false, null);
|
||||
private static final GppLinker machPluginLinker = new GppLinker(
|
||||
GccCCompiler.CMD_PREFIX + "gcc", objFiles, discardFiles, "lib",
|
||||
".bundle", false, null);
|
||||
public static GppLinker getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private File[] libDirs;
|
||||
private String runtimeLibrary;
|
||||
protected GppLinker(String command, String[] extensions,
|
||||
String[] ignoredExtensions, String outputPrefix,
|
||||
String outputSuffix, boolean isLibtool, GppLinker libtoolLinker) {
|
||||
super(command, "-dumpversion", extensions, ignoredExtensions,
|
||||
outputPrefix, outputSuffix, isLibtool, libtoolLinker);
|
||||
}
|
||||
protected void addImpliedArgs(boolean debug, LinkType linkType, Vector args, Boolean defaultflag) {
|
||||
super.addImpliedArgs(debug, linkType, args, defaultflag);
|
||||
if (getIdentifier().indexOf("mingw") >= 0) {
|
||||
if (linkType.isSubsystemConsole()) {
|
||||
args.addElement("-mconsole");
|
||||
}
|
||||
if (linkType.isSubsystemGUI()) {
|
||||
args.addElement("-mwindows");
|
||||
}
|
||||
}
|
||||
if (linkType.isStaticRuntime()) {
|
||||
String[] cmdin = new String[]{GccCCompiler.CMD_PREFIX + "g++",
|
||||
"-print-file-name=libstdc++.a"};
|
||||
String[] cmdout = CaptureStreamHandler.run(cmdin);
|
||||
if (cmdout.length > 0) {
|
||||
runtimeLibrary = cmdout[0];
|
||||
} else {
|
||||
runtimeLibrary = null;
|
||||
}
|
||||
} else {
|
||||
runtimeLibrary = "-lstdc++";
|
||||
}
|
||||
}
|
||||
public String[] addLibrarySets(CCTask task, LibrarySet[] libsets,
|
||||
Vector preargs, Vector midargs, Vector endargs) {
|
||||
String[] rs = super.addLibrarySets(task, libsets, preargs, midargs,
|
||||
endargs);
|
||||
if (runtimeLibrary != null) {
|
||||
endargs.addElement(runtimeLibrary);
|
||||
}
|
||||
return rs;
|
||||
}
|
||||
/**
|
||||
* Allows drived linker to decorate linker option. Override by GppLinker to
|
||||
* prepend a "-Wl," to pass option to through gcc to linker.
|
||||
*
|
||||
* @param buf
|
||||
* buffer that may be used and abused in the decoration process,
|
||||
* must not be null.
|
||||
* @param arg
|
||||
* linker argument
|
||||
*/
|
||||
public String decorateLinkerOption(StringBuffer buf, String arg) {
|
||||
String decoratedArg = arg;
|
||||
if (arg.length() > 1 && arg.charAt(0) == '-') {
|
||||
switch (arg.charAt(1)) {
|
||||
//
|
||||
// passed automatically by GCC
|
||||
//
|
||||
case 'g' :
|
||||
case 'f' :
|
||||
case 'F' :
|
||||
/* Darwin */
|
||||
case 'm' :
|
||||
case 'O' :
|
||||
case 'W' :
|
||||
case 'l' :
|
||||
case 'L' :
|
||||
case 'u' :
|
||||
break;
|
||||
default :
|
||||
boolean known = false;
|
||||
for (int i = 0; i < linkerOptions.length; i++) {
|
||||
if (linkerOptions[i].equals(arg)) {
|
||||
known = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!known) {
|
||||
buf.setLength(0);
|
||||
buf.append("-Wl,");
|
||||
buf.append(arg);
|
||||
decoratedArg = buf.toString();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return decoratedArg;
|
||||
}
|
||||
/**
|
||||
* Returns library path.
|
||||
*
|
||||
*/
|
||||
public File[] getLibraryPath() {
|
||||
if (libDirs == null) {
|
||||
Vector dirs = new Vector();
|
||||
// Ask GCC where it will look for its libraries.
|
||||
String[] args = new String[]{GccCCompiler.CMD_PREFIX + "g++",
|
||||
"-print-search-dirs"};
|
||||
String[] cmdout = CaptureStreamHandler.run(args);
|
||||
for (int i = 0; i < cmdout.length; ++i) {
|
||||
int prefixIndex = cmdout[i].indexOf(libPrefix);
|
||||
if (prefixIndex >= 0) {
|
||||
// Special case DOS-type GCCs like MinGW or Cygwin
|
||||
int s = prefixIndex + libPrefix.length();
|
||||
int t = cmdout[i].indexOf(';', s);
|
||||
while (t > 0) {
|
||||
dirs.addElement(cmdout[i].substring(s, t));
|
||||
s = t + 1;
|
||||
t = cmdout[i].indexOf(';', s);
|
||||
}
|
||||
dirs.addElement(cmdout[i].substring(s));
|
||||
++i;
|
||||
for (; i < cmdout.length; ++i) {
|
||||
dirs.addElement(cmdout[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Eliminate all but actual directories.
|
||||
String[] libpath = new String[dirs.size()];
|
||||
dirs.copyInto(libpath);
|
||||
int count = CUtil.checkDirectoryArray(libpath);
|
||||
// Build return array.
|
||||
libDirs = new File[count];
|
||||
int index = 0;
|
||||
for (int i = 0; i < libpath.length; ++i) {
|
||||
if (libpath[i] != null) {
|
||||
libDirs[index++] = new File(libpath[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return libDirs;
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isPluginModule()) {
|
||||
if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
|
||||
return machPluginLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
if (GccProcessor.getMachine().indexOf("darwin") >= 0) {
|
||||
return machDllLinker;
|
||||
} else {
|
||||
return dllLinker;
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2001-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.gcc.cross.sparc_sun_solaris2;
|
||||
import java.io.File;
|
||||
|
||||
import net.sf.antcontrib.cpptasks.compiler.LinkType;
|
||||
import net.sf.antcontrib.cpptasks.compiler.Linker;
|
||||
import net.sf.antcontrib.cpptasks.gcc.AbstractLdLinker;
|
||||
/**
|
||||
* Adapter for the 'ld' linker
|
||||
*
|
||||
* @author Curt Arnold
|
||||
*/
|
||||
public final class LdLinker extends AbstractLdLinker {
|
||||
private static final String[] discardFiles = new String[0];
|
||||
private static final String[] libtoolObjFiles = new String[]{".fo", ".a",
|
||||
".lib", ".dll", ".so", ".sl"};
|
||||
private static final String[] objFiles = new String[]{".o", ".a", ".lib",
|
||||
".dll", ".so", ".sl"};
|
||||
private static final LdLinker dllLinker = new LdLinker(
|
||||
GccCCompiler.CMD_PREFIX + "ld", objFiles, discardFiles, "lib",
|
||||
".so", false, new LdLinker(GccCCompiler.CMD_PREFIX + "ld",
|
||||
objFiles, discardFiles, "lib", ".so", true, null));
|
||||
private static final LdLinker instance = new LdLinker(
|
||||
GccCCompiler.CMD_PREFIX + "ld", objFiles, discardFiles, "", "",
|
||||
false, null);
|
||||
public static LdLinker getInstance() {
|
||||
return instance;
|
||||
}
|
||||
private File[] libDirs;
|
||||
private LdLinker(String command, String[] extensions,
|
||||
String[] ignoredExtensions, String outputPrefix,
|
||||
String outputSuffix, boolean isLibtool, LdLinker libtoolLinker) {
|
||||
super(command, "-version", extensions, ignoredExtensions, outputPrefix,
|
||||
outputSuffix, isLibtool, libtoolLinker);
|
||||
}
|
||||
public Linker getLinker(LinkType type) {
|
||||
if (type.isStaticLibrary()) {
|
||||
return GccLibrarian.getInstance();
|
||||
}
|
||||
if (type.isSharedLibrary()) {
|
||||
return dllLinker;
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user