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;
|
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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Add table
Reference in a new issue