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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-