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

1. Build Macro mechanism fixes

2. NPE in dep calculator
This commit is contained in:
Mikhail Sennikovsky 2007-05-15 13:34:14 +00:00
parent 0ed0e8e23b
commit eb2f600fc2
4 changed files with 68 additions and 42 deletions

View file

@ -11,7 +11,6 @@
package org.eclipse.cdt.managedbuilder.internal.buildmodel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@ -27,6 +26,7 @@ import org.eclipse.cdt.managedbuilder.buildmodel.IBuildResource;
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildStep;
import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.cdt.managedbuilder.core.IBuildObject;
import org.eclipse.cdt.managedbuilder.core.IBuilder;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IInputType;
import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator;
@ -422,7 +422,9 @@ public class BuildStep implements IBuildStep {
String result = str;
try {
if(resolveAll){
SupplierBasedCdtVariableSubstitutor sub = createSubstitutor(fileData);
IConfiguration cfg = getBuildDescription().getConfiguration();
IBuilder builder = cfg.getBuilder();
SupplierBasedCdtVariableSubstitutor sub = createSubstitutor(cfg, builder, fileData);
result = CdtVariableResolver.resolveToString(str, sub);
} else {
result = ManagedBuildManager.getBuildMacroProvider().resolveValueToMakefileFormat(str, "", " ", IBuildMacroProvider.CONTEXT_FILE, fileData); //$NON-NLS-1$ //$NON-NLS-2$
@ -433,11 +435,13 @@ public class BuildStep implements IBuildStep {
return result;
}
private SupplierBasedCdtVariableSubstitutor createSubstitutor(IFileContextData fileData){
private SupplierBasedCdtVariableSubstitutor createSubstitutor(IConfiguration cfg, IBuilder builder, IFileContextData fileData){
BuildMacroProvider prov = (BuildMacroProvider)ManagedBuildManager.getBuildMacroProvider();
IMacroContextInfo info = prov.getMacroContextInfo(IBuildMacroProvider.CONTEXT_FILE, fileData);
FileMacroExplicitSubstitutor sub = new FileMacroExplicitSubstitutor(
info,
cfg,
builder,
"", " "); //$NON-NLS-1$ //$NON-NLS-2$
return sub;
@ -445,12 +449,15 @@ public class BuildStep implements IBuildStep {
private String[] getCommandFlags(IPath inRcPath, IPath outRcPath, boolean resolveAll){
try {
return resolveAll ?
((Tool)fTool).getToolCommandFlags(inRcPath, outRcPath,
createSubstitutor(new FileContextData(inRcPath, outRcPath, null, fTool)),
BuildMacroProvider.getDefault())
:
fTool.getToolCommandFlags(inRcPath, outRcPath);
if(resolveAll) {
IConfiguration cfg = getBuildDescription().getConfiguration();
IBuilder builder = cfg.getBuilder();
return ((Tool)fTool).getToolCommandFlags(inRcPath, outRcPath,
createSubstitutor(cfg, builder,
new FileContextData(inRcPath, outRcPath, null, fTool)),
BuildMacroProvider.getDefault());
}
return fTool.getToolCommandFlags(inRcPath, outRcPath);
} catch (BuildException e) {
}
return new String[0];

View file

@ -13,18 +13,26 @@ package org.eclipse.cdt.managedbuilder.internal.buildmodel;
import org.eclipse.cdt.core.cdtvariables.CdtVariableException;
import org.eclipse.cdt.core.cdtvariables.ICdtVariable;
import org.eclipse.cdt.managedbuilder.core.IBuilder;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.internal.macros.IMacroContextInfo;
import org.eclipse.cdt.managedbuilder.internal.macros.MbsMacroSupplier;
import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableSubstitutor;
public class FileMacroExplicitSubstitutor extends SupplierBasedCdtVariableSubstitutor {
private IConfiguration fCfg;
private IBuilder fBuilder;
// public FileMacroExplicitSubstitutor(int contextType, Object contextData, String inexistentMacroValue, String listDelimiter){
// super(contextType, contextData, inexistentMacroValue, listDelimiter);
// }
public FileMacroExplicitSubstitutor(IMacroContextInfo contextInfo, String inexistentMacroValue, String listDelimiter){
public FileMacroExplicitSubstitutor(IMacroContextInfo contextInfo,
IConfiguration cfg,
IBuilder builder,
String inexistentMacroValue, String listDelimiter){
super(contextInfo, inexistentMacroValue, listDelimiter);
fCfg = cfg;
fBuilder = builder;
}
/* (non-Javadoc)
@ -33,7 +41,7 @@ public class FileMacroExplicitSubstitutor extends SupplierBasedCdtVariableSubsti
protected ResolvedMacro resolveMacro(ICdtVariable macro) throws CdtVariableException{
if(macro instanceof MbsMacroSupplier.FileContextMacro){
MbsMacroSupplier.FileContextMacro fileMacro = (MbsMacroSupplier.FileContextMacro)macro;
String val = fileMacro.getExplicitMacroValue();
String val = fileMacro.getExplicitMacroValue(fCfg, fBuilder);
return new ResolvedMacro(macro.getName(), val);
}
return super.resolveMacro(macro);

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.managedbuilder.core.IManagedProject;
import org.eclipse.cdt.managedbuilder.core.IOption;
import org.eclipse.cdt.managedbuilder.core.IOutputType;
import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration;
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
@ -125,25 +126,32 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
}
public class FileContextMacro extends BuildMacro{
private IFileContextData fContextData;
private IConfiguration fConfiguration;
// private IFileContextData fContextData;
// private IConfiguration fConfiguration;
//TODO: initialize builder
private IBuilder fBuilder;
// private IBuilder fBuilder;
private boolean fIsExplicit = true;
private boolean fIsInitialized;
private String fExplicitValue;
private boolean fIsExplicitResolved;
private IPath fInputFileLocation;
private IPath fOutputFileLocation;
private FileContextMacro(String name, IFileContextData contextData){
fName = name;
fType = VALUE_TEXT;
fContextData = contextData;
loadValue(contextData);
// fContextData = contextData;
}
private void loadValue(){
private void loadValue(IFileContextData contextData){
if(fIsInitialized)
return;
IBuilder builder = null;
IOptionContextData optionContext = fContextData.getOptionContextData();
IConfiguration configuration = null;
IOptionContextData optionContext = contextData.getOptionContextData();
if(optionContext != null){
IBuildObject buildObject = optionContext.getParent();
if(buildObject instanceof ITool){
@ -154,11 +162,11 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
if(buildObject instanceof IToolChain){
IToolChain toolChain = (IToolChain)buildObject;
builder = toolChain.getBuilder();
fConfiguration = toolChain.getParent();
} else if (buildObject instanceof IResourceConfiguration){
fConfiguration = ((IResourceConfiguration)buildObject).getParent();
if(fConfiguration != null){
IToolChain toolChain = fConfiguration.getToolChain();
configuration = toolChain.getParent();
} else if (buildObject instanceof IResourceInfo){
configuration = ((IResourceInfo)buildObject).getParent();
if(configuration != null){
IToolChain toolChain = configuration.getToolChain();
if(toolChain != null)
builder = toolChain.getBuilder();
}
@ -176,25 +184,27 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
if(fStringValue == null){
fIsExplicit = true;
fStringValue = getExplicitFileMacroValue(fName, fContextData.getInputFileLocation(), fContextData.getOutputFileLocation(), fBuilder, fConfiguration);
fStringValue = getExplicitFileMacroValue(fName, contextData.getInputFileLocation(), contextData.getOutputFileLocation(), builder, configuration);
fExplicitValue = fStringValue;
fIsExplicitResolved = true;
}
fInputFileLocation = contextData.getInputFileLocation();
fOutputFileLocation = contextData.getOutputFileLocation();
fIsInitialized = true;
}
public String getExplicitMacroValue(){
loadValue();
public String getExplicitMacroValue(IConfiguration configuration, IBuilder builder){
// loadValue();
if(!fIsExplicitResolved){
fExplicitValue = getExplicitFileMacroValue(fName, fContextData.getInputFileLocation(), fContextData.getOutputFileLocation(), fBuilder, fConfiguration);
fExplicitValue = getExplicitFileMacroValue(fName, fInputFileLocation, fOutputFileLocation, builder, configuration);
fIsExplicitResolved = true;
}
return fExplicitValue;
}
public boolean isExplicit(){
loadValue();
// loadValue();
return fIsExplicit;
}
@ -202,7 +212,7 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
* @see org.eclipse.cdt.managedbuilder.macros.IBuildMacro#getStringValue()
*/
public String getStringValue(){
loadValue();
// loadValue();
return fStringValue;
}
}
@ -861,22 +871,22 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
}
public class OptionMacro extends BuildMacro{
private IOptionContextData fOptionContextData;
private IOptionContextData fParentOptionContextData;
// private IOptionContextData fOptionContextData;
// private IOptionContextData fParentOptionContextData;
// private IOption fParentOption;
private OptionMacro(String name, IOptionContextData optionContextData){
fName = name;
fOptionContextData = optionContextData;
fParentOptionContextData = getParent(fOptionContextData);
load();
// fOptionContextData = optionContextData;
IOptionContextData parentOptionContextData = getParent(optionContextData);
load(optionContextData, parentOptionContextData);
}
private boolean load(){
private boolean load(IOptionContextData optionContextData, IOptionContextData parentOptionContextData){
fStringValue = null;
fStringListValue = null;
fType = 0;
if(fParentOptionContextData != null){
IOption option = fParentOptionContextData.getOption();
if(parentOptionContextData != null){
IOption option = parentOptionContextData.getOption();
try{
switch (option.getValueType()) {
case IOption.BOOLEAN:
@ -949,9 +959,9 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
break;
}
if(fStringValue != null)
fStringValue = CdtVariableResolver.resolveToString(fStringValue,new IncludeDefaultsSubstitutor(fParentOptionContextData));
fStringValue = CdtVariableResolver.resolveToString(fStringValue,new IncludeDefaultsSubstitutor(parentOptionContextData));
else if(fStringListValue != null)
fStringListValue = CdtVariableResolver.resolveStringListValues(fStringListValue,new IncludeDefaultsSubstitutor(fParentOptionContextData), true);
fStringListValue = CdtVariableResolver.resolveStringListValues(fStringListValue,new IncludeDefaultsSubstitutor(parentOptionContextData), true);
}catch(Exception e){
fType = 0;
}

View file

@ -19,6 +19,7 @@ import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator;
import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo;
import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration;
import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacroProvider;
@ -83,9 +84,9 @@ public class DefaultGCCDependencyCalculatorPreBuildCommands implements IManagedD
if (buildContext instanceof IConfiguration) {
IConfiguration config = (IConfiguration)buildContext;
project = (IProject)config.getOwner();
} else if (buildContext instanceof IResourceConfiguration) {
IResourceConfiguration resConfig = (IResourceConfiguration)buildContext;
project = (IProject)resConfig.getOwner();
} else if (buildContext instanceof IResourceInfo) {
IResourceInfo resInfo = (IResourceInfo)buildContext;
project = (IProject)resInfo.getParent().getOwner();
}
sourceLocation = (source.isAbsolute() ? source : project.getLocation().append(source));