diff --git a/build/org.eclipse.cdt.managedbuilder.core/ChangeLog b/build/org.eclipse.cdt.managedbuilder.core/ChangeLog index 4e639a304c2..9de80e413e2 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/ChangeLog +++ b/build/org.eclipse.cdt.managedbuilder.core/ChangeLog @@ -1,3 +1,30 @@ +2003-10-01 Sean Evoy + Fix for bugs 43490 (trivial), 44020, and 43980. + Added a new field to the schema for a tool. The attribute manages a list of + project natures that the tool should be filtered against in the build model + and UI. + * schema/ManagedBuildTools.exsd + + Updated the ITool interface and its mplementors to pay attention to this new + attribute when loading from a plugin file. Clients can querry for a numeric + constant indicating the filter. + * src/org/eclipse/cdt/managedbuilder/core/ITool.java + * src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java + * src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java + + All the methods in managed build manager that access information stored in a tool + first check that the tool is valid for the project nature. + * src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java + + Put a safety check in the option reference constructor when reading one in from + a project file. I the option reference is to an option not managed by the build + model, the constructor does not add itself to the runtime representation of the + model. + * src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java + + In preparation for 44020, each new target created is assigned a truly random ID. + * src/org/eclipse/cdt/managedbuilder/internal/core/Target.java + 2003-09-30 Sean Evoy Fix for bug 41826. diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd index 3f6c1a321f6..a2363c30a7a 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd +++ b/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd @@ -118,6 +118,23 @@ + + + + Filter the display (and use) of the tool by the nature of the project. Selecting a value of 'cnature' insures that the tool will be displayed IFF there is a cnature associated with the project. A ccnature will filter this tool out. If 'ccnature' is selected, the tool will only be available for C++ projects. If 'both' is selected, the tool will be displayed when either nature is present. + + + + + + + + + + + + + diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java index e25ce3f0e7e..dcc2fea7b29 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java @@ -15,8 +15,9 @@ package org.eclipse.cdt.managedbuilder.core; */ public interface ITool extends IBuildObject { // Schema element names - public static final String TOOL_ELEMENT_NAME = "tool"; //$NON-NLS-1$ public static final String COMMAND = "command"; //$NON-NLS-1$ + public static final String INTERFACE_EXTS = "headerExtensions"; //$NON-NLS-1$ + public static final String NATURE = "natureFilter"; //$NON-NLS-1$ public static final String OPTION = "option"; //$NON-NLS-1$ public static final String OPTION_CAT = "optionCategory"; //$NON-NLS-1$ public static final String OPTION_REF = "optionReference"; //$NON-NLS-1$ @@ -24,8 +25,12 @@ public interface ITool extends IBuildObject { public static final String OUTPUT_PREFIX = "outputPrefix"; //$NON-NLS-1$ public static final String OUTPUTS = "outputs"; //$NON-NLS-1$ public static final String SOURCES = "sources"; //$NON-NLS-1$ - public static final String INTERFACE_EXTS = "headerExtensions"; //$NON-NLS-1$ + public static final String TOOL_ELEMENT_NAME = "tool"; //$NON-NLS-1$ public static final String WHITE_SPACE = " "; //$NON-NLS-1$ + + public static final int FILTER_C = 0; + public static final int FILTER_CC = 1; + public static final int FILTER_BOTH = 2; /** * Return true if the receiver builds files with the @@ -35,6 +40,25 @@ public interface ITool extends IBuildObject { * @return boolean */ public boolean buildsFileType(String extension); + + /** + * Answers a constant corresponding to the project nature the tool should be used + * for. Possible answers are: + * + *
+ *
ITool.FILTER_C + *
The tool should only be displayed for C projects. Notes: even + * though a C++ project has a C nature, this flag will mask the tool for C++ + * projects. + *
ITool.FILTER_CC + *
The tool should only be displayed for C++ projects. + *
ITool.FILTER_BOTH + *
The tool should be displayed for projects with both natures. + *
+ * + * @return int + */ + public int getNatureFilter(); /** * Get a particular option. diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index 95b537da3e3..d9533367515 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -15,12 +15,16 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; +import org.eclipse.cdt.core.CCProjectNature; +import org.eclipse.cdt.core.CProjectNature; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.ITarget; import org.eclipse.cdt.managedbuilder.core.ITool; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -189,8 +193,50 @@ public class Configuration extends BuildObject implements IConfiguration { ? parent.getTools() : target.getTools(); + // Validate that the tools correspond to the nature + IProject project = (IProject)target.getOwner(); + if (project != null) { + List validTools = new ArrayList(); + + // The target is associated with a real project + for (int i = 0; i < tools.length; ++i) { + ITool tool = tools[i]; + // Make sure the tool filter and project nature agree + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + try { + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + validTools.add(tool); + } + } catch (CoreException e) { + continue; + } + break; + case ITool.FILTER_CC: + try { + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + validTools.add(tool); + } + } catch (CoreException e) { + continue; + } + break; + case ITool.FILTER_BOTH: + validTools.add(tool); + break; + } + } + // Now put the valid tools back into the array + tools = (ITool[]) validTools.toArray(new ITool[validTools.size()]); + } + // Replace tools with local overrides for (int i = 0; i < tools.length; ++i) { + ITool tool = tools[i]; + if (tool == null) { + // May have been filtered out + continue; + } ToolReference ref = getToolReference(tools[i]); if (ref != null) tools[i] = ref; diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java index 5a79470ad98..7edafd91490 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java @@ -25,8 +25,12 @@ import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.ITarget; import org.eclipse.cdt.managedbuilder.core.ITool; +import org.eclipse.cdt.core.CCProjectNature; +import org.eclipse.cdt.core.CProjectNature; import org.eclipse.cdt.core.parser.IScannerInfo; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.w3c.dom.Document; @@ -34,7 +38,8 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { - + + // Local variables private boolean isDirty; private IResource owner; private Map targetMap; @@ -97,13 +102,32 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#buildsFileType(java.lang.String) */ public boolean buildsFileType(String srcExt) { + // Make sure the owner is treated as a project for the duration + IProject project = (IProject)owner; + // Check to see if there is a rule to build a file with this extension IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; - if (tool.buildsFileType(srcExt)) { - return true; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.buildsFileType(srcExt); + } + break; + case ITool.FILTER_CC: + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.buildsFileType(srcExt); + } + break; + case ITool.FILTER_BOTH: + return tool.buildsFileType(srcExt); + } + } catch (CoreException e) { + continue; } } return false; @@ -183,12 +207,33 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IScannerInfo#getDefinedSymbols() */ public Map getDefinedSymbols() { + IProject project = (IProject)owner; // Return the defined symbols for the default configuration HashMap symbols = new HashMap(); IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int i = 0; i < tools.length; i++) { ITool tool = tools[i]; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (!project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_CC: + if (!project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_BOTH: + break; + } + } catch (CoreException e) { + continue; + } + // Now extract the valid tool's options IOption[] opts = tool.getOptions(); for (int j = 0; j < opts.length; j++) { IOption option = opts[j]; @@ -229,20 +274,36 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getFlagsForSource(java.lang.String) */ public String getFlagsForSource(String extension) { + IProject project = (IProject)owner; + // Get all the tools for the current config IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; if (tool.buildsFileType(extension)) { - String flags = new String(); try { - flags = tool.getToolFlags(); + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolFlags(); + } + break; + case ITool.FILTER_CC: + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolFlags(); + } + break; + case ITool.FILTER_BOTH: + return tool.getToolFlags(); + } + } catch (CoreException e) { + continue; } catch (BuildException e) { // Give it your best shot with the next tool continue; } - return flags; } } return null; @@ -252,8 +313,9 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getToolFlags(java.lang.String) */ public String getFlagsForTarget(String extension) { + IProject project = (IProject)owner; // Treat null extensions as an empty string - String ext = extension == null ? new String() : extension; + String ext = extension == null ? new String() : extension; // Get all the tools for the current config IConfiguration config = getDefaultConfiguration(getDefaultTarget()); @@ -261,14 +323,28 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; if (tool.producesFileType(ext)) { - String flags = new String(); try { - flags = tool.getToolFlags(); + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolFlags(); + } + break; + case ITool.FILTER_CC: + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolFlags(); + } + break; + case ITool.FILTER_BOTH: + return tool.getToolFlags(); + } + } catch (CoreException e) { + continue; } catch (BuildException e) { - // Somehow the model is out of sync for this item. Keep iterating + // Give it your best shot with the next tool continue; } - return flags; } } return null; @@ -278,6 +354,8 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths() */ public String[] getIncludePaths() { + IProject project = (IProject)owner; + // Return the include paths for the default configuration ArrayList paths = new ArrayList(); IConfiguration config = getDefaultConfiguration(getDefaultTarget()); @@ -285,6 +363,26 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { ITool[] tools = config.getTools(); for (int i = 0; i < tools.length; i++) { ITool tool = tools[i]; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (!project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_CC: + if (!project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_BOTH: + break; + } + } catch (CoreException e) { + continue; + } + // The tool checks out for this project, get its options IOption[] opts = tool.getOptions(); for (int j = 0; j < opts.length; j++) { IOption option = opts[j]; @@ -318,12 +416,34 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getLibsForTarget(java.lang.String) */ public String[] getLibsForTarget(String extension) { + IProject project = (IProject)owner; + ArrayList libs = new ArrayList(); // Get all the tools for the current config IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (!project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_CC: + if (!project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_BOTH: + break; + } + } catch (CoreException e) { + continue; + } + // The tool is OK for this project nature if (tool.producesFileType(extension)) { IOption[] opts = tool.getOptions(); // Look for the lib option type @@ -398,14 +518,30 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getOutputExtension(java.lang.String) */ public String getOutputExtension(String resourceExtension) { + IProject project = (IProject)owner; // Get all the tools for the current config IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; - String output = tool.getOutputExtension(resourceExtension); - if (output != null) { - return output; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getOutputExtension(resourceExtension); + } + break; + case ITool.FILTER_CC: + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getOutputExtension(resourceExtension); + } + break; + case ITool.FILTER_BOTH: + return tool.getOutputExtension(resourceExtension); + } + } catch (CoreException e) { + continue; } } return null; @@ -415,6 +551,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getOutputFlag() */ public String getOutputFlag(String outputExt) { + IProject project = (IProject)owner; // Treat null extension as an empty string String ext = outputExt == null ? new String() : outputExt; @@ -424,6 +561,26 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (!project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_CC: + if (!project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_BOTH: + break; + } + } catch (CoreException e) { + continue; + } + // It's OK if (tool.producesFileType(ext)) { flags = tool.getOutputFlag(); } @@ -435,6 +592,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getOutputPrefix(java.lang.String) */ public String getOutputPrefix(String outputExtension) { + IProject project = (IProject)owner; // Treat null extensions as empty string String ext = outputExtension == null ? new String() : outputExtension; @@ -444,6 +602,25 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (!project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_CC: + if (!project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_BOTH: + break; + } + } catch (CoreException e) { + continue; + } if (tool.producesFileType(ext)) { flags = tool.getOutputPrefix(); } @@ -473,13 +650,33 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getToolForSource(java.lang.String) */ public String getToolForSource(String extension) { + IProject project = (IProject)owner; + // Get all the tools for the current config IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; if (tool.buildsFileType(extension)) { - return tool.getToolCommand(); + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolCommand(); + } + break; + case ITool.FILTER_CC: + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolCommand(); + } + break; + case ITool.FILTER_BOTH: + return tool.getToolCommand(); + } + } catch (CoreException e) { + continue; + } } } return null; @@ -489,6 +686,8 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getToolInvocation(java.lang.String) */ public String getToolForTarget(String extension) { + IProject project = (IProject)owner; + // Treat a null argument as an empty string String ext = extension == null ? new String() : extension; // Get all the tools for the current config @@ -497,7 +696,25 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; if (tool.producesFileType(ext)) { - return tool.getToolCommand(); + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolCommand(); + } + break; + case ITool.FILTER_CC: + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.getToolCommand(); + } + break; + case ITool.FILTER_BOTH: + return tool.getToolCommand(); + } + } catch (CoreException e) { + continue; + } } } return null; @@ -507,12 +724,33 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo#getUserObjectsForTarget(java.lang.String) */ public String[] getUserObjectsForTarget(String extension) { + IProject project = (IProject)owner; ArrayList objs = new ArrayList(); // Get all the tools for the current config IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (!project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_CC: + if (!project.hasNature(CCProjectNature.CC_NATURE_ID)) { + continue; + } + break; + case ITool.FILTER_BOTH: + break; + } + } catch (CoreException e) { + continue; + } + // The tool is OK for this project nature if (tool.producesFileType(extension)) { IOption[] opts = tool.getOptions(); // Look for the user object option type @@ -543,13 +781,31 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo#isHeaderFile(java.lang.String) */ public boolean isHeaderFile(String ext) { + IProject project = (IProject)owner; + // Check to see if there is a rule to build a file with this extension IConfiguration config = getDefaultConfiguration(getDefaultTarget()); ITool[] tools = config.getTools(); for (int index = 0; index < tools.length; index++) { ITool tool = tools[index]; - if (tool.isHeaderFile(ext)) { - return true; + try { + // Make sure the tool is right for the project + switch (tool.getNatureFilter()) { + case ITool.FILTER_C: + if (project.hasNature(CProjectNature.C_NATURE_ID) && !project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.isHeaderFile(ext); + } + break; + case ITool.FILTER_CC: + if (project.hasNature(CCProjectNature.CC_NATURE_ID)) { + return tool.isHeaderFile(ext); + } + break; + case ITool.FILTER_BOTH: + return tool.isHeaderFile(ext); + } + } catch (CoreException e) { + continue; } } return false; diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java index 12bda314184..265f820e278 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OptionReference.java @@ -120,6 +120,12 @@ public class OptionReference implements IOption { this.owner = owner; option = owner.getTool().getOption(element.getAttribute(ID)); + // Bail now if there's no option for the reference + if (option == null) { + return; + } + + // Hook the reference up owner.addOptionReference(this); // value diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Target.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Target.java index 9461b47da91..4ad06f66327 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Target.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Target.java @@ -16,6 +16,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.StringTokenizer; import org.eclipse.cdt.managedbuilder.core.IConfiguration; @@ -66,7 +67,13 @@ public class Target extends BuildObject implements ITarget { // Copy the parent's identity this.parent = parent; - setId(parent.getId() + ".1"); + Random r = new Random(); + r.setSeed(System.currentTimeMillis()); + int id = r.nextInt(); + if (id < 0) { + id *= -1; + } + setId(owner.getName() + "." + parent.getId() + "." + id); setName(parent.getName()); this.artifactName = parent.getArtifactName(); this.binaryParserId = parent.getBinaryParserId(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java index 483aefdc56d..828eea82bf1 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java @@ -41,6 +41,7 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { private String command; private List inputExtensions; private List interfaceExtensions; + private int natureFilter; private Map optionMap; private List options; private String outputExtension; @@ -71,6 +72,18 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { // name setName(element.getAttribute(ITool.NAME)); + // Get the nature filter + String nature = element.getAttribute(NATURE); + if (nature == null || "both".equals(nature)) { + natureFilter = FILTER_BOTH; + } else if ("cnature".equals(nature)) { + natureFilter = FILTER_C; + } else if ("ccnature".equals(nature)) { + natureFilter = FILTER_CC; + } else { + natureFilter = FILTER_BOTH; + } + // Get the supported input file extension String inputs = element.getAttribute(ITool.SOURCES) == null ? new String() : @@ -350,6 +363,13 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { return (IOption[])myOptions.toArray(new IOption[myOptions.size()]); } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.ITool#getNatureFilter() + */ + public int getNatureFilter() { + return natureFilter; + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITool#getOption(java.lang.String) */ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java index 3c095188014..91a13233d3c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java @@ -232,6 +232,7 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.ITool#getOutputFlag() */ public String getOutputFlag() { + // The tool reference does not override this value return parent.getOutputFlag(); } @@ -239,6 +240,7 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.ITool#getOutputPrefix() */ public String getOutputPrefix() { + // The tool reference does not override this value return parent.getOutputPrefix(); } @@ -253,6 +255,7 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.ITool#getTopOptionCategory() */ public IOptionCategory getTopOptionCategory() { + // The tool reference does not override this value return parent.getTopOptionCategory(); } @@ -260,6 +263,7 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.managedbuilder.core.ITool#isHeaderFile(java.lang.String) */ public boolean isHeaderFile(String ext) { + // The tool reference does not override this value return parent.isHeaderFile(ext); } @@ -267,6 +271,7 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.ITool#producesFileType(java.lang.String) */ public boolean producesFileType(String outputExtension) { + // The tool reference does not override this value return parent.producesFileType(outputExtension); } @@ -279,6 +284,7 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.IBuildObject#getId() */ public String getId() { + // The tool reference does not override this value return parent.getId(); } @@ -286,23 +292,17 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.IBuildObject#getName() */ public String getName() { + // The tool reference does not override this value return parent.getName(); } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.build.managed.IBuildObject#setId(java.lang.String) + /** + * Answers true if the reference is a reference to the + * tool specified in the argument. + * + * @param target the tool that should be tested + * @return boolean */ - public void setId(String id) { - // Not allowed - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.build.managed.IBuildObject#setName(java.lang.String) - */ - public void setName(String name) { - // Not allowed - } - public boolean references(ITool target) { if (equals(target)) { // we are the target @@ -367,9 +367,18 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.ITool#handlesFileType(java.lang.String) */ public boolean buildsFileType(String extension) { + // The tool reference does not override this value return parent.buildsFileType(extension); } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.ITool#getNatureFilter() + */ + public int getNatureFilter() { + // The tool reference does not override this value + return parent.getNatureFilter(); + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.ITool#getOption(java.lang.String) */ @@ -382,6 +391,7 @@ public class ToolReference implements ITool { * @see org.eclipse.cdt.core.build.managed.ITool#getOutput(java.lang.String) */ public String getOutputExtension(String inputExtension) { + // The tool reference does not override this value return parent.getOutputExtension(inputExtension); } diff --git a/build/org.eclipse.cdt.managedbuilder.ui/ChangeLog b/build/org.eclipse.cdt.managedbuilder.ui/ChangeLog index 115f40a891d..ec6e9fcf2e4 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/ChangeLog +++ b/build/org.eclipse.cdt.managedbuilder.ui/ChangeLog @@ -1,3 +1,19 @@ +2003-10-01 Sean Evoy + Fix for bugs 43490 (trivial), 44020, and 43980. + A massive change has occurred in the plugin file. I added new C tools that apply + only to projects with C natures. I also added option overrides in the default + configurations for these new tools. The trivial fix for the new C project wizard + involved changing the icon entry in the plugin file. + * plugin.xml + + In preparation for 44020, each new configuration created is assigned a truly + random ID. + * src/org/eclipse/cdt/managedbuilder/ui/wizards/NewManagedProjectWizard.java + * src/org/eclipse/cdt/managedbuilder/ui/properties/BuildPropertyPage.java + + Removed a tooltip that was not being populated properly. + * src/org/eclipse/cdt/managedbuilder/ui/wizards/CProjectPlatformPage.java + 2003-09-30 Sean Evoy Fix for bug 41826. diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties b/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties index 55075da5be9..0250a73879e 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties +++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties @@ -11,9 +11,11 @@ MngCCWizard.description=Create a new C++ project and let Eclipse create and mana ConfigName.Rel=Release ConfigName.Dbg=Debug ToolName.preprocessor = Preprocessor -ToolName.compiler = Compiler +ToolName.compiler.c = C Compiler +ToolName.compiler.cpp = C++ Compiler ToolName.archiver = Archiver -ToolName.linker = Linker +ToolName.linker.c = C Linker +ToolName.linker.cpp = C++ Linker OptionCategory.Preproc = Preprocessor OptionCategory.Dirs = Directories OptionCategory.General = General @@ -36,6 +38,7 @@ Option.Posix.Optimize.Most=Optimize most (-O3) Option.Posix.Verbose=Verbose (-v) Option.OtherFlags=Other flags +Option.Posix.Ansi=Support ANSI programs (-ansi) Option.Posix.Linker.NoStartFiles=Do not use standard start files (-nostartfiles) Option.Posix.Linker.NoDefLibs=Do not use default libraries (-nodefaultlibs) diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml index 60c55f945bb..87012e5e79d 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml @@ -37,7 +37,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -