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; package org.eclipse.cdt.managedbuilder.internal.buildmodel;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; 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.buildmodel.IBuildStep;
import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.cdt.managedbuilder.core.IBuildObject; 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.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IInputType; import org.eclipse.cdt.managedbuilder.core.IInputType;
import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator; import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator;
@ -422,7 +422,9 @@ public class BuildStep implements IBuildStep {
String result = str; String result = str;
try { try {
if(resolveAll){ 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); result = CdtVariableResolver.resolveToString(str, sub);
} else { } else {
result = ManagedBuildManager.getBuildMacroProvider().resolveValueToMakefileFormat(str, "", " ", IBuildMacroProvider.CONTEXT_FILE, fileData); //$NON-NLS-1$ //$NON-NLS-2$ 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; return result;
} }
private SupplierBasedCdtVariableSubstitutor createSubstitutor(IFileContextData fileData){ private SupplierBasedCdtVariableSubstitutor createSubstitutor(IConfiguration cfg, IBuilder builder, IFileContextData fileData){
BuildMacroProvider prov = (BuildMacroProvider)ManagedBuildManager.getBuildMacroProvider(); BuildMacroProvider prov = (BuildMacroProvider)ManagedBuildManager.getBuildMacroProvider();
IMacroContextInfo info = prov.getMacroContextInfo(IBuildMacroProvider.CONTEXT_FILE, fileData); IMacroContextInfo info = prov.getMacroContextInfo(IBuildMacroProvider.CONTEXT_FILE, fileData);
FileMacroExplicitSubstitutor sub = new FileMacroExplicitSubstitutor( FileMacroExplicitSubstitutor sub = new FileMacroExplicitSubstitutor(
info, info,
cfg,
builder,
"", " "); //$NON-NLS-1$ //$NON-NLS-2$ "", " "); //$NON-NLS-1$ //$NON-NLS-2$
return sub; return sub;
@ -445,12 +449,15 @@ public class BuildStep implements IBuildStep {
private String[] getCommandFlags(IPath inRcPath, IPath outRcPath, boolean resolveAll){ private String[] getCommandFlags(IPath inRcPath, IPath outRcPath, boolean resolveAll){
try { try {
return resolveAll ? if(resolveAll) {
((Tool)fTool).getToolCommandFlags(inRcPath, outRcPath, IConfiguration cfg = getBuildDescription().getConfiguration();
createSubstitutor(new FileContextData(inRcPath, outRcPath, null, fTool)), IBuilder builder = cfg.getBuilder();
BuildMacroProvider.getDefault()) return ((Tool)fTool).getToolCommandFlags(inRcPath, outRcPath,
: createSubstitutor(cfg, builder,
fTool.getToolCommandFlags(inRcPath, outRcPath); new FileContextData(inRcPath, outRcPath, null, fTool)),
BuildMacroProvider.getDefault());
}
return fTool.getToolCommandFlags(inRcPath, outRcPath);
} catch (BuildException e) { } catch (BuildException e) {
} }
return new String[0]; 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.CdtVariableException;
import org.eclipse.cdt.core.cdtvariables.ICdtVariable; 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.IMacroContextInfo;
import org.eclipse.cdt.managedbuilder.internal.macros.MbsMacroSupplier; import org.eclipse.cdt.managedbuilder.internal.macros.MbsMacroSupplier;
import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableSubstitutor; import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableSubstitutor;
public class FileMacroExplicitSubstitutor extends SupplierBasedCdtVariableSubstitutor { public class FileMacroExplicitSubstitutor extends SupplierBasedCdtVariableSubstitutor {
private IConfiguration fCfg;
private IBuilder fBuilder;
// public FileMacroExplicitSubstitutor(int contextType, Object contextData, String inexistentMacroValue, String listDelimiter){ // public FileMacroExplicitSubstitutor(int contextType, Object contextData, String inexistentMacroValue, String listDelimiter){
// super(contextType, contextData, inexistentMacroValue, 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); super(contextInfo, inexistentMacroValue, listDelimiter);
fCfg = cfg;
fBuilder = builder;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -33,7 +41,7 @@ public class FileMacroExplicitSubstitutor extends SupplierBasedCdtVariableSubsti
protected ResolvedMacro resolveMacro(ICdtVariable macro) throws CdtVariableException{ protected ResolvedMacro resolveMacro(ICdtVariable macro) throws CdtVariableException{
if(macro instanceof MbsMacroSupplier.FileContextMacro){ if(macro instanceof MbsMacroSupplier.FileContextMacro){
MbsMacroSupplier.FileContextMacro fileMacro = (MbsMacroSupplier.FileContextMacro)macro; MbsMacroSupplier.FileContextMacro fileMacro = (MbsMacroSupplier.FileContextMacro)macro;
String val = fileMacro.getExplicitMacroValue(); String val = fileMacro.getExplicitMacroValue(fCfg, fBuilder);
return new ResolvedMacro(macro.getName(), val); return new ResolvedMacro(macro.getName(), val);
} }
return super.resolveMacro(macro); 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.IOption;
import org.eclipse.cdt.managedbuilder.core.IOutputType; import org.eclipse.cdt.managedbuilder.core.IOutputType;
import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration; 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.ITool;
import org.eclipse.cdt.managedbuilder.core.IToolChain; import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
@ -125,25 +126,32 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
} }
public class FileContextMacro extends BuildMacro{ public class FileContextMacro extends BuildMacro{
private IFileContextData fContextData; // private IFileContextData fContextData;
private IConfiguration fConfiguration; // private IConfiguration fConfiguration;
//TODO: initialize builder //TODO: initialize builder
private IBuilder fBuilder; // private IBuilder fBuilder;
private boolean fIsExplicit = true; private boolean fIsExplicit = true;
private boolean fIsInitialized; private boolean fIsInitialized;
private String fExplicitValue; private String fExplicitValue;
private boolean fIsExplicitResolved; private boolean fIsExplicitResolved;
private IPath fInputFileLocation;
private IPath fOutputFileLocation;
private FileContextMacro(String name, IFileContextData contextData){ private FileContextMacro(String name, IFileContextData contextData){
fName = name; fName = name;
fType = VALUE_TEXT; fType = VALUE_TEXT;
fContextData = contextData;
loadValue(contextData);
// fContextData = contextData;
} }
private void loadValue(){ private void loadValue(IFileContextData contextData){
if(fIsInitialized) if(fIsInitialized)
return; return;
IBuilder builder = null; IBuilder builder = null;
IOptionContextData optionContext = fContextData.getOptionContextData(); IConfiguration configuration = null;
IOptionContextData optionContext = contextData.getOptionContextData();
if(optionContext != null){ if(optionContext != null){
IBuildObject buildObject = optionContext.getParent(); IBuildObject buildObject = optionContext.getParent();
if(buildObject instanceof ITool){ if(buildObject instanceof ITool){
@ -154,11 +162,11 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
if(buildObject instanceof IToolChain){ if(buildObject instanceof IToolChain){
IToolChain toolChain = (IToolChain)buildObject; IToolChain toolChain = (IToolChain)buildObject;
builder = toolChain.getBuilder(); builder = toolChain.getBuilder();
fConfiguration = toolChain.getParent(); configuration = toolChain.getParent();
} else if (buildObject instanceof IResourceConfiguration){ } else if (buildObject instanceof IResourceInfo){
fConfiguration = ((IResourceConfiguration)buildObject).getParent(); configuration = ((IResourceInfo)buildObject).getParent();
if(fConfiguration != null){ if(configuration != null){
IToolChain toolChain = fConfiguration.getToolChain(); IToolChain toolChain = configuration.getToolChain();
if(toolChain != null) if(toolChain != null)
builder = toolChain.getBuilder(); builder = toolChain.getBuilder();
} }
@ -176,25 +184,27 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
if(fStringValue == null){ if(fStringValue == null){
fIsExplicit = true; fIsExplicit = true;
fStringValue = getExplicitFileMacroValue(fName, fContextData.getInputFileLocation(), fContextData.getOutputFileLocation(), fBuilder, fConfiguration); fStringValue = getExplicitFileMacroValue(fName, contextData.getInputFileLocation(), contextData.getOutputFileLocation(), builder, configuration);
fExplicitValue = fStringValue; fExplicitValue = fStringValue;
fIsExplicitResolved = true; fIsExplicitResolved = true;
} }
fInputFileLocation = contextData.getInputFileLocation();
fOutputFileLocation = contextData.getOutputFileLocation();
fIsInitialized = true; fIsInitialized = true;
} }
public String getExplicitMacroValue(){ public String getExplicitMacroValue(IConfiguration configuration, IBuilder builder){
loadValue(); // loadValue();
if(!fIsExplicitResolved){ if(!fIsExplicitResolved){
fExplicitValue = getExplicitFileMacroValue(fName, fContextData.getInputFileLocation(), fContextData.getOutputFileLocation(), fBuilder, fConfiguration); fExplicitValue = getExplicitFileMacroValue(fName, fInputFileLocation, fOutputFileLocation, builder, configuration);
fIsExplicitResolved = true; fIsExplicitResolved = true;
} }
return fExplicitValue; return fExplicitValue;
} }
public boolean isExplicit(){ public boolean isExplicit(){
loadValue(); // loadValue();
return fIsExplicit; return fIsExplicit;
} }
@ -202,7 +212,7 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
* @see org.eclipse.cdt.managedbuilder.macros.IBuildMacro#getStringValue() * @see org.eclipse.cdt.managedbuilder.macros.IBuildMacro#getStringValue()
*/ */
public String getStringValue(){ public String getStringValue(){
loadValue(); // loadValue();
return fStringValue; return fStringValue;
} }
} }
@ -861,22 +871,22 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
} }
public class OptionMacro extends BuildMacro{ public class OptionMacro extends BuildMacro{
private IOptionContextData fOptionContextData; // private IOptionContextData fOptionContextData;
private IOptionContextData fParentOptionContextData; // private IOptionContextData fParentOptionContextData;
// private IOption fParentOption; // private IOption fParentOption;
private OptionMacro(String name, IOptionContextData optionContextData){ private OptionMacro(String name, IOptionContextData optionContextData){
fName = name; fName = name;
fOptionContextData = optionContextData; // fOptionContextData = optionContextData;
fParentOptionContextData = getParent(fOptionContextData); IOptionContextData parentOptionContextData = getParent(optionContextData);
load(); load(optionContextData, parentOptionContextData);
} }
private boolean load(){ private boolean load(IOptionContextData optionContextData, IOptionContextData parentOptionContextData){
fStringValue = null; fStringValue = null;
fStringListValue = null; fStringListValue = null;
fType = 0; fType = 0;
if(fParentOptionContextData != null){ if(parentOptionContextData != null){
IOption option = fParentOptionContextData.getOption(); IOption option = parentOptionContextData.getOption();
try{ try{
switch (option.getValueType()) { switch (option.getValueType()) {
case IOption.BOOLEAN: case IOption.BOOLEAN:
@ -949,9 +959,9 @@ public class MbsMacroSupplier extends BuildCdtVariablesSupplierBase {
break; break;
} }
if(fStringValue != null) if(fStringValue != null)
fStringValue = CdtVariableResolver.resolveToString(fStringValue,new IncludeDefaultsSubstitutor(fParentOptionContextData)); fStringValue = CdtVariableResolver.resolveToString(fStringValue,new IncludeDefaultsSubstitutor(parentOptionContextData));
else if(fStringListValue != null) else if(fStringListValue != null)
fStringListValue = CdtVariableResolver.resolveStringListValues(fStringListValue,new IncludeDefaultsSubstitutor(fParentOptionContextData), true); fStringListValue = CdtVariableResolver.resolveStringListValues(fStringListValue,new IncludeDefaultsSubstitutor(parentOptionContextData), true);
}catch(Exception e){ }catch(Exception e){
fType = 0; 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.IManagedCommandLineGenerator;
import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo; import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo;
import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration; 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.ITool;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacroProvider; import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacroProvider;
@ -83,9 +84,9 @@ public class DefaultGCCDependencyCalculatorPreBuildCommands implements IManagedD
if (buildContext instanceof IConfiguration) { if (buildContext instanceof IConfiguration) {
IConfiguration config = (IConfiguration)buildContext; IConfiguration config = (IConfiguration)buildContext;
project = (IProject)config.getOwner(); project = (IProject)config.getOwner();
} else if (buildContext instanceof IResourceConfiguration) { } else if (buildContext instanceof IResourceInfo) {
IResourceConfiguration resConfig = (IResourceConfiguration)buildContext; IResourceInfo resInfo = (IResourceInfo)buildContext;
project = (IProject)resConfig.getOwner(); project = (IProject)resInfo.getParent().getOwner();
} }
sourceLocation = (source.isAbsolute() ? source : project.getLocation().append(source)); sourceLocation = (source.isAbsolute() ? source : project.getLocation().append(source));