Initial import.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user