package org.buildroot.cdt.toolchain;
import java.io.File;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IOption;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable;
import org.eclipse.cdt.managedbuilder.envvar.IConfigurationEnvironmentVariableSupplier;
import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider;
import org.eclipse.core.runtime.Platform;
public class BuildrootEnvironmentVariableSupplier implements
IConfigurationEnvironmentVariableSupplier {
private enum ToolName {
CC("gcc"), CXX("g++"), LD("ld");
private String toolName;
private ToolName(String toolName) {
this.toolName = toolName;
}
public String getToolName() {
return toolName;
}
}
public IBuildEnvironmentVariable getVariable(String variableName,
IConfiguration configuration, IEnvironmentVariableProvider provider) {
if (PathEnvironmentVariable.name.equals(variableName)
&& PathEnvironmentVariable.isVar(variableName))
return PathEnvironmentVariable.create(configuration);
else if (ToolName.CC.name().equals(variableName))
return ToolEnvironmentVariable.create(configuration, ToolName.CC);
else if (ToolName.CXX.name().equals(variableName))
return ToolEnvironmentVariable.create(configuration, ToolName.CXX);
else if (ToolName.LD.name().equals(variableName))
return ToolEnvironmentVariable.create(configuration, ToolName.LD);
else
return null;
}
public IBuildEnvironmentVariable[] getVariables(
IConfiguration configuration, IEnvironmentVariableProvider provider) {
IBuildEnvironmentVariable path = PathEnvironmentVariable
.create(configuration);
IBuildEnvironmentVariable toolCC = ToolEnvironmentVariable.create(
configuration, ToolName.CC);
IBuildEnvironmentVariable toolCXX = ToolEnvironmentVariable.create(
configuration, ToolName.CXX);
IBuildEnvironmentVariable toolLD = ToolEnvironmentVariable.create(
configuration, ToolName.LD);
return path != null ? new IBuildEnvironmentVariable[] { path, toolCC,
toolCXX, toolLD } : new IBuildEnvironmentVariable[0];
}
private static class PathEnvironmentVariable implements
IBuildEnvironmentVariable {
public static String name = "PATH";
private File path;
private PathEnvironmentVariable(File path) {
this.path = path;
}
public static PathEnvironmentVariable create(
IConfiguration configuration) {
IToolChain toolchain = configuration.getToolChain();
while (toolchain.getOptionById(toolchain.getBaseId()
+ ".option.path") == null) {
toolchain = toolchain.getSuperClass();
}
IOption option = toolchain.getOptionById(toolchain.getBaseId()
+ ".option.path");
String path = (String) option.getValue();
File sysroot = new File(path);
File bin = new File(sysroot, "bin");
if (bin.isDirectory())
sysroot = bin;
return new PathEnvironmentVariable(sysroot);
}
public static boolean isVar(String name) {
// Windows has case insensitive env var names
return Platform.getOS().equals(Platform.OS_WIN32) ? name
.equalsIgnoreCase(PathEnvironmentVariable.name) : name
.equals(PathEnvironmentVariable.name);
}
public String getDelimiter() {
return Platform.getOS().equals(Platform.OS_WIN32) ? ";" : ":";
}
public String getName() {
return name;
}
public int getOperation() {
return IBuildEnvironmentVariable.ENVVAR_PREPEND;
}
public String getValue() {
return path.getAbsolutePath();
}
}
private static class ToolEnvironmentVariable implements
IBuildEnvironmentVariable {
public String toolName;
public String varName;
public String prefix;
private ToolEnvironmentVariable(String toolName, String varName,
String prefix) {
this.toolName = toolName;
this.varName = varName;
this.prefix = prefix;
}
public static IBuildEnvironmentVariable create(
IConfiguration configuration, ToolName toolName) {
IToolChain toolchain = configuration.getToolChain();
while (toolchain.getOptionById(toolchain.getBaseId()
+ ".option.prefix") == null) {
toolchain = toolchain.getSuperClass();
}
IOption option = toolchain.getOptionById(toolchain.getBaseId()
+ ".option.prefix");
return new ToolEnvironmentVariable(toolName.name(),
toolName.getToolName(), (String) option.getValue());
}
@Override
public String getName() {
return toolName;
}
@Override
public String getValue() {
return prefix + varName;
}
@Override
public int getOperation() {
return IBuildEnvironmentVariable.ENVVAR_REPLACE;
}
@Override
public String getDelimiter() {
return Platform.getOS().equals(Platform.OS_WIN32) ? ";" : ":";
}
}
}