/*******************************************************************************
* Copyright (c) 2012, 2013 Andrew Gvozdev and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrew Gvozdev - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.internal.envvar;
import org.eclipse.cdt.core.cdtvariables.ICdtVariable;
import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.internal.core.cdtvariables.CdtVariableManager;
import org.eclipse.cdt.internal.core.cdtvariables.ICoreVariableContextInfo;
import org.eclipse.cdt.internal.core.envvar.EnvironmentVariableManager;
import org.eclipse.cdt.internal.core.envvar.ICoreEnvironmentVariableSupplier;
import org.eclipse.cdt.internal.core.envvar.IEnvironmentContextInfo;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.envvar.IConfigurationEnvironmentVariableSupplier;
import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider;
import org.eclipse.cdt.utils.cdtvariables.ICdtVariableSupplier;
import org.eclipse.cdt.utils.cdtvariables.IVariableContextInfo;
/**
* Helper class to resolve environment variables directly from toolchain. The intention is
* to use that in New Project Wizard and other scenarios when no configuration is available yet.
*
* @noextend This class is not intended to be subclassed by clients.
*/
public class EnvironmentVariableManagerToolChain extends EnvironmentVariableManager {
private final IToolChain toolChain;
private final ICConfigurationDescription cfgDescription;
public EnvironmentVariableManagerToolChain(IToolChain toolchain) {
this.toolChain = toolchain;
IConfiguration cfg = toolChain.getParent();
cfgDescription = cfg != null ? ManagedBuildManager.getDescriptionForConfiguration(cfg) : null;
}
/**
* Wrapper class to deliver appropriate set of environment variable suppliers.
*/
private class ToolChainEnvironmentContextInfo implements IEnvironmentContextInfo {
private final ICoreEnvironmentVariableSupplier fToolchainSupplier;
private ToolChainEnvironmentContextInfo(IToolChain toolChain) {
fToolchainSupplier = new ToolChainEnvironmentVariableSupplier(toolChain);
}
@Override
public IEnvironmentContextInfo getNext() {
return null;
}
@Override
public ICoreEnvironmentVariableSupplier[] getSuppliers() {
return new ICoreEnvironmentVariableSupplier[] {
fUserSupplier,
fToolchainSupplier,
fEclipseSupplier,
};
}
@Override
public Object getContext() {
return null;
}
}
/**
* Tool-chain variable supplier
*/
private class ToolChainEnvironmentVariableSupplier implements ICoreEnvironmentVariableSupplier {
private final IEnvironmentVariableProvider environmentVariableProvider = EnvironmentVariableProvider.getDefault();
private final IConfigurationEnvironmentVariableSupplier toolchainSupplier;
private ToolChainEnvironmentVariableSupplier(IToolChain toolChain) {
this.toolchainSupplier = toolChain.getEnvironmentVariableSupplier();
}
@Override
public IEnvironmentVariable getVariable(String name, Object context) {
if (toolchainSupplier == null) {
return null;
}
return toolchainSupplier.getVariable(name, null, environmentVariableProvider);
}
@Override
public IEnvironmentVariable[] getVariables(Object context) {
if (toolchainSupplier == null) {
return new IEnvironmentVariable[0];
}
return toolchainSupplier.getVariables(null, environmentVariableProvider);
}
@Override
public boolean appendEnvironment(Object context) {
return true;
}
}
/**
* Wrapper class to deliver appropriate set of suppliers for variable substitution.
*/
private final class ToolChainCoreVariableContextInfo implements ICoreVariableContextInfo {
private final ToolChainCdtVariableSupplier fToolChainSupplier;
private ToolChainCoreVariableContextInfo(IToolChain toolChain) {
fToolChainSupplier = new ToolChainCdtVariableSupplier(toolChain);
}
@Override
public ICdtVariableSupplier[] getSuppliers() {
return new ICdtVariableSupplier[] {
CdtVariableManager.fUserDefinedMacroSupplier,
fToolChainSupplier,
CdtVariableManager.fEnvironmentMacroSupplier,
CdtVariableManager.fCdtMacroSupplier,
CdtVariableManager.fEclipseVariablesMacroSupplier,
};
}
@Override
public IVariableContextInfo getNext() {
return null;
}
@Override
public int getContextType() {
return CONTEXT_WORKSPACE;
}
@Override
public Object getContextData() {
return null;
}
}
/**
* Tool-chain supplier for variable substitution.
*/
private class ToolChainCdtVariableSupplier implements ICdtVariableSupplier {
private final IConfigurationEnvironmentVariableSupplier toolchainSupplier;
private ToolChainCdtVariableSupplier(IToolChain toolChain) {
this.toolchainSupplier = toolChain.getEnvironmentVariableSupplier();
}
@Override
public ICdtVariable getVariable(String macroName, IVariableContextInfo context) {
if (toolchainSupplier == null) {
return null;
}
IEnvironmentVariable var = toolchainSupplier.getVariable(macroName, null, ManagedBuildManager.getEnvironmentVariableProvider());
return CdtVariableManager.fEnvironmentMacroSupplier.createBuildMacro(var);
}
@Override
public ICdtVariable[] getVariables(IVariableContextInfo context) {
if (toolchainSupplier == null) {
return null;
}
IEnvironmentVariable[] vars = toolchainSupplier.getVariables(null, ManagedBuildManager.getEnvironmentVariableProvider());
if (vars != null) {
ICdtVariable[] cdtVars = new ICdtVariable[vars.length];
for (int i = 0; i < vars.length; i++) {
cdtVars[i] = CdtVariableManager.fEnvironmentMacroSupplier.createBuildMacro(vars[i]);
}
}
return null;
}
}
/**
* Returns context info object which defines environment variable suppliers including tool-chain supplier.
*/
@Override
public IEnvironmentContextInfo getContextInfo(Object level) {
if (cfgDescription != null) {
// Use regular EnvironmentVariableManager when configuration is available
return super.getContextInfo(level);
}
return new ToolChainEnvironmentContextInfo(toolChain);
}
/**
* Returns context info object which defines environment variable substitutions including that of tool-chain.
*/
@Override
public ICoreVariableContextInfo getMacroContextInfoForContext(Object context) {
if (cfgDescription != null) {
// Use regular EnvironmentVariableManager when configuration is available
return super.getMacroContextInfoForContext(context);
}
return new ToolChainCoreVariableContextInfo(toolChain);
}
public IEnvironmentVariable getVariable(String variableName, boolean resolveMacros) {
return getVariable(variableName, cfgDescription, resolveMacros);
}
}