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:
parent
0ed0e8e23b
commit
eb2f600fc2
4 changed files with 68 additions and 42 deletions
|
@ -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];
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Reference in a new issue