1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fix for cdt variable (Build Macros) functionality

This commit is contained in:
Mikhail Sennikovsky 2007-06-15 14:27:59 +00:00
parent d09c6cad1e
commit 42b622ae87
2 changed files with 73 additions and 9 deletions

View file

@ -27,6 +27,7 @@ import org.eclipse.cdt.managedbuilder.core.IInputType;
import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
import org.eclipse.cdt.managedbuilder.core.IManagedProject; import org.eclipse.cdt.managedbuilder.core.IManagedProject;
import org.eclipse.cdt.managedbuilder.core.IOutputType; import org.eclipse.cdt.managedbuilder.core.IOutputType;
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
import org.eclipse.cdt.managedbuilder.core.ITool; import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider; import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider;
@ -179,6 +180,15 @@ public class BuildfileMacroSubstitutor extends SupplierBasedCdtVariableSubstitut
} else if (contextData instanceof IBuilder){ } else if (contextData instanceof IBuilder){
builder = (IBuilder)contextData; builder = (IBuilder)contextData;
cfg = builder.getParent().getParent(); cfg = builder.getParent().getParent();
} else if (contextData instanceof ITool) {
ITool tool = (ITool)contextData;
IResourceInfo rcInfo = tool.getParentResourceInfo();
if(rcInfo != null){
cfg = rcInfo.getParent();
if(cfg != null){
builder = cfg.getBuilder();
}
}
} }
} }
break; break;
@ -210,7 +220,8 @@ public class BuildfileMacroSubstitutor extends SupplierBasedCdtVariableSubstitut
if(fConfiguration != null && fBuilder != null && if(fConfiguration != null && fBuilder != null &&
fBuilder.keepEnvironmentVariablesInBuildfile() && fBuilder.keepEnvironmentVariablesInBuildfile() &&
fVarMngr.isEnvironmentVariable(macro, fCfgDes) && fVarMngr.isEnvironmentVariable(macro, fCfgDes) &&
!CdtVariableResolver.isStringListVariable(macro.getValueType())){ (!CdtVariableResolver.isStringListVariable(macro.getValueType())
|| size(macro.getStringListValue()) < 2)){
String ref = getMacroReference(macro); String ref = getMacroReference(macro);
if(ref != null) if(ref != null)
resolved = new ResolvedMacro(macro.getName(),ref); resolved = new ResolvedMacro(macro.getName(),ref);
@ -221,6 +232,10 @@ public class BuildfileMacroSubstitutor extends SupplierBasedCdtVariableSubstitut
return super.resolveMacro(macro); return super.resolveMacro(macro);
} }
private static int size(String[] value){
return value != null ? value.length : 0;
}
public IConfiguration getConfiguration(){ public IConfiguration getConfiguration(){
return fConfiguration; return fConfiguration;
} }
@ -264,7 +279,8 @@ public class BuildfileMacroSubstitutor extends SupplierBasedCdtVariableSubstitut
public void setMacroContextInfo(IVariableContextInfo info) public void setMacroContextInfo(IVariableContextInfo info)
throws CdtVariableException{ throws CdtVariableException{
super.setMacroContextInfo(info); super.setMacroContextInfo(info);
// init(); if(info instanceof IMacroContextInfo)
init(null, (IMacroContextInfo)info);
} }
/* (non-Javadoc) /* (non-Javadoc)

View file

@ -10,10 +10,13 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.cdtvariables; package org.eclipse.cdt.internal.core.cdtvariables;
import java.util.Arrays;
import org.eclipse.cdt.core.cdtvariables.CdtVariableException; import org.eclipse.cdt.core.cdtvariables.CdtVariableException;
import org.eclipse.cdt.core.cdtvariables.ICdtVariable; import org.eclipse.cdt.core.cdtvariables.ICdtVariable;
import org.eclipse.cdt.core.cdtvariables.ICdtVariableManager; import org.eclipse.cdt.core.cdtvariables.ICdtVariableManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.internal.core.cdtvariables.EclipseVariablesVariableSupplier.EclipseVarMacro; import org.eclipse.cdt.internal.core.cdtvariables.EclipseVariablesVariableSupplier.EclipseVarMacro;
import org.eclipse.cdt.internal.core.settings.model.CConfigurationDescriptionCache; import org.eclipse.cdt.internal.core.settings.model.CConfigurationDescriptionCache;
import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver; import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver;
@ -21,6 +24,8 @@ import org.eclipse.cdt.utils.cdtvariables.ICdtVariableSupplier;
import org.eclipse.cdt.utils.cdtvariables.IVariableContextInfo; import org.eclipse.cdt.utils.cdtvariables.IVariableContextInfo;
import org.eclipse.cdt.utils.cdtvariables.IVariableSubstitutor; import org.eclipse.cdt.utils.cdtvariables.IVariableSubstitutor;
import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableManager; import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableManager;
import org.eclipse.core.internal.events.BuildManager;
import org.eclipse.core.internal.localstore.IsSynchronizedVisitor;
import org.eclipse.core.variables.IStringVariable; import org.eclipse.core.variables.IStringVariable;
/** /**
@ -30,12 +35,12 @@ import org.eclipse.core.variables.IStringVariable;
public class CdtVariableManager implements ICdtVariableManager { public class CdtVariableManager implements ICdtVariableManager {
static private CdtVariableManager fDefault; static private CdtVariableManager fDefault;
public static UserDefinedVariableSupplier fUserDefinedMacroSupplier = UserDefinedVariableSupplier.getInstance(); public static final UserDefinedVariableSupplier fUserDefinedMacroSupplier = UserDefinedVariableSupplier.getInstance();
public static BuildSystemVariableSupplier fBuildSystemVariableSupplier = BuildSystemVariableSupplier.getInstance(); public static final BuildSystemVariableSupplier fBuildSystemVariableSupplier = BuildSystemVariableSupplier.getInstance();
public static EnvironmentVariableSupplier fEnvironmentMacroSupplier = EnvironmentVariableSupplier.getInstance(); public static final EnvironmentVariableSupplier fEnvironmentMacroSupplier = EnvironmentVariableSupplier.getInstance();
public static CdtMacroSupplier fCdtMacroSupplier = CdtMacroSupplier.getInstance(); public static final CdtMacroSupplier fCdtMacroSupplier = CdtMacroSupplier.getInstance();
public static EclipseVariablesVariableSupplier fEclipseVariablesMacroSupplier = EclipseVariablesVariableSupplier.getInstance(); public static final EclipseVariablesVariableSupplier fEclipseVariablesMacroSupplier = EclipseVariablesVariableSupplier.getInstance();
protected CdtVariableManager(){ protected CdtVariableManager(){
} }
@ -58,6 +63,11 @@ public class CdtVariableManager implements ICdtVariableManager {
return SupplierBasedCdtVariableManager.getVariable(macroName, return SupplierBasedCdtVariableManager.getVariable(macroName,
getMacroContextInfo(type,cfg),true); getMacroContextInfo(type,cfg),true);
} }
private IVariableContextInfo getVariableContextInfo(ICConfigurationDescription cfg){
int type = getContextType(cfg);
return getMacroContextInfo(type,cfg);
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider#getMacros(int, java.lang.Object, boolean) * @see org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider#getMacros(int, java.lang.Object, boolean)
@ -187,7 +197,45 @@ public class CdtVariableManager implements ICdtVariableManager {
public boolean isEnvironmentVariable(ICdtVariable variable, public boolean isEnvironmentVariable(ICdtVariable variable,
ICConfigurationDescription cfg) { ICConfigurationDescription cfg) {
return variable instanceof EnvironmentVariableSupplier.EnvVarMacro; if(variable instanceof EnvironmentVariableSupplier.EnvVarMacro)
return true;
IVariableContextInfo info = getVariableContextInfo(cfg);
ICdtVariable var = fEnvironmentMacroSupplier.getVariable(variable.getName(), info);
if(var != null && variablesEqual(var, variable))
return true;
return false;
}
private static boolean variablesEqual(ICdtVariable var1, ICdtVariable var2){
if(CDataUtil.objectsEqual(var1, var2))
return true;
if(var1 == null || var2 == null)
return false;
if(var1.getValueType() != var2.getValueType())
return false;
if(!var1.getName().equals(var2.getName()))
return false;
try {
if(CdtVariableResolver.isStringListVariable(var1.getValueType())){
String[] v1 = var1.getStringListValue();
String[] v2 = var2.getStringListValue();
if(!Arrays.equals(v1, v2))
return false;
} else {
if(!CDataUtil.objectsEqual(var1.getStringValue(), var2.getStringValue()))
return false;
}
} catch (CdtVariableException e){
return false;
}
return true;
} }
public IStringVariable toEclipseVariable(ICdtVariable variable, public IStringVariable toEclipseVariable(ICdtVariable variable,