[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Build Model Update
|
Here is some more work on the build
model. GUI to follow shortly.
Sean Evoy
Rational Software - IBM Software Group
Ottawa, Ontario, Canada
Index: plugin.xml
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/plugin.xml,v
retrieving revision 1.22
diff -u -r1.22 plugin.xml
--- plugin.xml 21 May 2003 16:29:58 -0000 1.22
+++ plugin.xml 28 May 2003 18:53:15 -0000
@@ -115,6 +115,17 @@
</builder>
</extension>
<extension
+ id="genmakebuilder"
+ name="%GeneratedMakefileCBuilder.name"
+ point="org.eclipse.core.resources.builders">
+ <builder
+ hasNature="true">
+ <run
+ class="org.eclipse.cdt.internal.core.GeneratedMakefileBuilder">
+ </run>
+ </builder>
+ </extension>
+ <extension
id="problem"
name="%CProblemMarker.name"
point="org.eclipse.core.resources.markers">
@@ -146,6 +157,22 @@
</runtime>
</extension>
<extension
+ id="managedBuildNature"
+ name="%ManagedBuildNature.name"
+ point="org.eclipse.core.resources.natures">
+ <requires-nature
+ id="org.eclipse.cdt.core.cnature">
+ </requires-nature>
+ <runtime>
+ <run
+ class="org.eclipse.cdt.core.ManagedCProjectNature">
+ </run>
+ </runtime>
+ <builder
+ id="org.eclipse.cdt.core.genmakebuilder">
+ </builder>
+ </extension>
+ <extension
point="org.eclipse.cdt.core.CBuildCommand">
<buildcommand
command="make">
@@ -251,30 +278,6 @@
enabled="true"
pattern="*.exe">
</ignore>
- </extension>
- <extension
- id="managedBuildNature"
- name="%ManagedBuildNature.name"
- point="org.eclipse.core.resources.natures">
- <requires-nature
- id="org.eclipse.cdt.core.cnature">
- </requires-nature>
- <runtime>
- <run
- class="org.eclipse.cdt.core.ManagedCProjectNature">
- </run>
- </runtime>
- </extension>
- <extension
- id="generatedMakefileCBuilder"
- name="%GeneratedMakefileCBuilder.name"
- point="org.eclipse.core.resources.builders">
- <builder
- hasNature="true">
- <run
- class="org.eclipse.cdt.internal.core.GeneratedMakefileCBuilder">
- </run>
- </builder>
</extension>
</plugin>
Index: build/org/eclipse/cdt/core/build/managed/IConfiguration.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IConfiguration.java,v
retrieving revision 1.5
diff -u -r1.5 IConfiguration.java
--- build/org/eclipse/cdt/core/build/managed/IConfiguration.java 17 Apr 2003 19:21:40 -0000 1.5
+++ build/org/eclipse/cdt/core/build/managed/IConfiguration.java 28 May 2003 18:53:15 -0000
@@ -12,9 +12,6 @@
import org.eclipse.core.resources.IResource;
-/**
- *
- */
public interface IConfiguration extends IBuildObject {
/**
@@ -36,19 +33,31 @@
* @return
*/
public ITool[] getTools();
-
+
/**
- * Sets an option value for this configuration.
+ * Sets the value of a boolean option for this configuration.
*
- * @param option
- * @param value
+ * @param option The option to change.
+ * @param value The value to apply to the option.
+ * @throws BuildException
+ */
+ public void setOption(IOption option, boolean value)
+ throws BuildException;
+
+ /**
+ * Sets the value of a string option for this configuration.
+ *
+ * @param option The option that will be effected by change.
+ * @param value The value to apply to the option.
*/
public void setOption(IOption option, String value)
throws BuildException;
/**
- * Sets an option value for this configuration.
- * @param option
+ * Sets the value of a list option for this configuration.
+ *
+ * @param option The option to change.
+ * @param value The values to apply to the option.
*/
public void setOption(IOption option, String[] value)
throws BuildException;
Index: build/org/eclipse/cdt/core/build/managed/IOption.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IOption.java,v
retrieving revision 1.6
diff -u -r1.6 IOption.java
--- build/org/eclipse/cdt/core/build/managed/IOption.java 21 May 2003 16:29:58 -0000 1.6
+++ build/org/eclipse/cdt/core/build/managed/IOption.java 28 May 2003 18:53:15 -0000
@@ -49,13 +49,6 @@
public String getCommand();
/**
- * @return a <code>String</code> containing the default value for the
- * enumerated option.
- */
- public String getDefaultEnumName ();
-
-
- /**
* @return <code>String</code> containing the command associated with the
* enumeration name.
*/
@@ -75,6 +68,16 @@
*/
public String [] getStringListValue() throws BuildException;
+ /**
+ * @return a <code>String</code> containing the selected enumeration in an
+ * enumerated option. For an option that has not been changed by the user,
+ * the receiver will answer with the default defined in the plugin manifest.
+ * If the user has modified the selection, the receiver will answer with the
+ * overridden selection.
+ */
+ public String getSelectedEnum ();
+
+
/**
* Returns the current value for this option if it is a String
*
Index: build/org/eclipse/cdt/core/build/managed/ITarget.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ITarget.java,v
retrieving revision 1.7
diff -u -r1.7 ITarget.java
--- build/org/eclipse/cdt/core/build/managed/ITarget.java 21 Apr 2003 19:37:46 -0000 1.7
+++ build/org/eclipse/cdt/core/build/managed/ITarget.java 28 May 2003 18:53:15 -0000
@@ -30,6 +30,11 @@
* @return
*/
public IResource getOwner();
+
+ /**
+ * @return the <code>ITarget</code> that is the parent of the receiver.
+ */
+ public ITarget getParent();
/**
* Returns the list of platform specific tools associated with this
Index: build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java,v
retrieving revision 1.6
diff -u -r1.6 ManagedBuildManager.java
--- build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java 17 Apr 2003 19:21:40 -0000 1.6
+++ build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java 28 May 2003 18:53:15 -0000
@@ -91,6 +91,16 @@
}
/**
+ * @return
+ */
+ public static Map getExtensionTargetMap() {
+ if (extensionTargetMap == null) {
+ extensionTargetMap = new HashMap();
+ }
+ return extensionTargetMap;
+ }
+
+ /**
* Returns the targets owned by this project. If none are owned,
* an empty array is returned.
*
@@ -108,6 +118,7 @@
}
}
+
public static ITarget getTarget(IResource resource, String id) {
if (resource != null) {
ResourceBuildInfo buildInfo = getBuildInfo(resource);
@@ -115,7 +126,7 @@
return buildInfo.getTarget(id);
}
- ITarget target = (ITarget)extensionTargetMap.get(id);
+ ITarget target = (ITarget)getExtensionTargetMap().get(id);
if (target != null)
return target;
@@ -158,23 +169,48 @@
/**
* Set the string value for an option for a given config.
*
- * @param config
- * @param option
- * @param value
+ * @param config The configuration the option belongs to.
+ * @param option The option to set the value for.
+ * @param value The boolean that the option should contain after the change.
+ */
+ public static void setOption(IConfiguration config, IOption option, boolean value) {
+ try {
+ config.setOption(option, value);
+ } catch (BuildException e) {
+ return;
+ }
+ }
+
+ /**
+ * Set the string value for an option for a given config.
+ *
+ * @param config The configuration the option belongs to.
+ * @param option The option to set the value for.
+ * @param value The value that the option should contain after the change.
*/
public static void setOption(IConfiguration config, IOption option, String value) {
+ try {
+ config.setOption(option, value);
+ } catch (BuildException e) {
+ return;
+ }
}
/**
* Set the string array value for an option for a given config.
*
- * @param config
- * @param option
- * @param value
+ * @param config The configuration the option belongs to.
+ * @param option The option to set the value for.
+ * @param value The values the option should contain after the change.
*/
public static void setOption(IConfiguration config, IOption option, String[] value) {
-
+ try {
+ config.setOption(option, value);
+ } catch (BuildException e) {
+ return;
+ }
}
+
/**
* Saves the build information associated with a project and all resources
* in the project to the build info file.
@@ -229,11 +265,10 @@
public static void addExtensionTarget(Target target) {
if (extensionTargets == null) {
extensionTargets = new ArrayList();
- extensionTargetMap = new HashMap();
}
extensionTargets.add(target);
- extensionTargetMap.put(target.getId(), target);
+ getExtensionTargetMap().put(target.getId(), target);
}
private static void loadExtensions() {
@@ -279,6 +314,8 @@
}
public static ResourceBuildInfo getBuildInfo(IResource resource, boolean create) {
+ // Make sure the extension information is loaded first
+ loadExtensions();
ResourceBuildInfo buildInfo = null;
try {
buildInfo = (ResourceBuildInfo)resource.getSessionProperty(buildInfoProperty);
@@ -304,4 +341,6 @@
public static ResourceBuildInfo getBuildInfo(IResource resource) {
return getBuildInfo(resource, false);
}
+
+
}
Index: build/org/eclipse/cdt/internal/core/build/managed/Configuration.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Configuration.java,v
retrieving revision 1.8
diff -u -r1.8 Configuration.java
--- build/org/eclipse/cdt/internal/core/build/managed/Configuration.java 25 Apr 2003 14:32:51 -0000 1.8
+++ build/org/eclipse/cdt/internal/core/build/managed/Configuration.java 28 May 2003 18:53:16 -0000
@@ -11,6 +11,7 @@
package org.eclipse.cdt.internal.core.build.managed;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.core.build.managed.BuildException;
@@ -36,6 +37,7 @@
/**
* A fresh new configuration for a target.
+ *
* @param target
* @param id
*/
@@ -46,14 +48,28 @@
target.addConfiguration(this);
}
+ /**
+ * Create a new configuration based on one already defined.
+ *
+ * @param target The <code>Target</code> the receiver will be added to.
+ * @param parent The <code>IConfiguration</code> to copy the settings from.
+ * @param id A unique ID for the configuration.
+ */
public Configuration(Target target, IConfiguration parent, String id) {
this.id = id;
+ this.name = parent.getName();
this.target = target;
this.parent = parent;
target.addConfiguration(this);
}
+ /**
+ * Create a new <code>Configuration</code> based on the specification in the plugin manifest.
+ *
+ * @param target The <code>Target</code> the receiver will be added to.
+ * @param element The element from the manifest that contains the default configuration settings.
+ */
public Configuration(Target target, IConfigurationElement element) {
this.target = target;
@@ -75,6 +91,12 @@
}
}
+ /**
+ * Build a configuration from the project manifest file.
+ *
+ * @param target The <code>Target</code> the configuration belongs to.
+ * @param element The element from the manifest that contains the overridden configuration information.
+ */
public Configuration(Target target, Element element) {
this.target = target;
@@ -88,8 +110,17 @@
if (element.hasAttribute("name"))
setName(element.getAttribute("name"));
- if (element.hasAttribute("parent"))
- parent = target.getParent().getConfiguration(element.getAttribute("parent"));
+ if (element.hasAttribute("parent")) {
+ // See if the target has a parent
+ ITarget targetParent = target.getParent();
+ // If so, then get my parent from it
+ if (targetParent != null) {
+ parent = targetParent.getConfiguration(element.getAttribute("parent"));
+ }
+ else {
+ parent = null;
+ }
+ }
NodeList configElements = element.getChildNodes();
for (int i = 0; i < configElements.getLength(); ++i) {
@@ -101,7 +132,13 @@
}
- public void serealize(Document doc, Element element) {
+ /**
+ * Persist receiver to project file.
+ *
+ * @param doc
+ * @param element
+ */
+ public void serialize(Document doc, Element element) {
element.setAttribute("id", id);
if (name != null)
@@ -115,7 +152,7 @@
ToolReference toolRef = (ToolReference)toolReferences.get(i);
Element toolRefElement = doc.createElement("toolRef");
element.appendChild(toolRefElement);
- toolRef.serealize(doc, toolRefElement);
+ toolRef.serialize(doc, toolRefElement);
}
}
@@ -206,17 +243,37 @@
}
/* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.IConfiguration#setOption(org.eclipse.cdt.core.build.managed.IOption, boolean)
+ */
+ public void setOption(IOption option, boolean value) throws BuildException {
+ // Is there a delta
+ if (option.getBooleanValue() != value)
+ createOptionReference(option).setValue(value);
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IConfiguration#setOption(org.eclipse.cdt.core.build.managed.IOption, java.lang.String)
*/
public void setOption(IOption option, String value) throws BuildException {
- createOptionReference(option).setValue(value);
+ String oldValue;
+ // Check whether this is an enumerated option
+ if (option.getValueType() == IOption.ENUMERATED) {
+ oldValue = option.getEnumCommand(option.getSelectedEnum());
+ }
+ else {
+ oldValue = option.getStringValue();
+ }
+ if (!oldValue.equals(value))
+ createOptionReference(option).setValue(value);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IConfiguration#setOption(org.eclipse.cdt.core.build.managed.IOption, java.lang.String[])
*/
public void setOption(IOption option, String[] value) throws BuildException {
- createOptionReference(option).setValue(value);
+ // Is there a delta
+ String[] oldValue = option.getStringListValue();
+ if(!Arrays.equals(value, oldValue))
+ createOptionReference(option).setValue(value);
}
-
}
Index: build/org/eclipse/cdt/internal/core/build/managed/Option.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Option.java,v
retrieving revision 1.5
diff -u -r1.5 Option.java
--- build/org/eclipse/cdt/internal/core/build/managed/Option.java 21 May 2003 16:29:58 -0000 1.5
+++ build/org/eclipse/cdt/internal/core/build/managed/Option.java 28 May 2003 18:53:16 -0000
@@ -37,6 +37,7 @@
private String command;
private static final String[] emptyStrings = new String[0];
+ private static final String EMPTY_STRING = new String();
public Option(ITool tool) {
this.tool = tool;
@@ -64,7 +65,9 @@
// valueType
String valueTypeStr = element.getAttribute("valueType");
- if (valueTypeStr == null || valueTypeStr.equals("string"))
+ if (valueTypeStr == null)
+ valueType = -1;
+ else if (valueTypeStr.equals("string"))
valueType = IOption.STRING;
else if (valueTypeStr.equals("stringList"))
valueType = IOption.STRING_LIST;
@@ -107,6 +110,8 @@
}
value = valueList;
break;
+ default :
+ break;
}
}
@@ -140,17 +145,18 @@
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.core.build.managed.IOption#getDefaultEnumValue()
+ * @see org.eclipse.cdt.core.build.managed.IOption#getEnumCommand(java.lang.String)
*/
- public String getDefaultEnumName() {
- return defaultEnumName;
+ public String getEnumCommand(String name) {
+ String cmd = (String) enumCommands.get(name);
+ return (cmd == null ? new String() : cmd);
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.core.build.managed.IOption#getEnumCommand(java.lang.String)
+ * @see org.eclipse.cdt.core.build.managed.IOption#getDefaultEnumValue()
*/
- public String getEnumCommand(String name) {
- return (String) enumCommands.get(name);
+ public String getSelectedEnum() {
+ return defaultEnumName;
}
/* (non-Javadoc)
@@ -167,7 +173,8 @@
* @see org.eclipse.cdt.core.build.managed.IOption#getStringValue()
*/
public String getStringValue() {
- return (String)value;
+ String v = (String) value;
+ return value == null ? EMPTY_STRING : v;
}
/* (non-Javadoc)
Index: build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java,v
retrieving revision 1.6
diff -u -r1.6 OptionReference.java
--- build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java 21 May 2003 16:29:58 -0000 1.6
+++ build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java 28 May 2003 18:53:16 -0000
@@ -11,10 +11,9 @@
package org.eclipse.cdt.internal.core.build.managed;
import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Arrays;
import java.util.List;
-import java.util.Map;
-
+import java.util.ListIterator;
import org.eclipse.cdt.core.build.managed.BuildException;
import org.eclipse.cdt.core.build.managed.IOption;
@@ -23,6 +22,7 @@
import org.eclipse.core.runtime.IConfigurationElement;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
@@ -33,9 +33,7 @@
private IOption option;
private ToolReference owner;
private Object value;
- private String defaultEnumName;
private String command;
- private Map enumCommands;
/**
* Created internally.
@@ -46,7 +44,7 @@
public OptionReference(ToolReference owner, IOption option) {
this.owner = owner;
this.option = option;
-
+ // Until the option reference is changed, all values will be extracted from original option
owner.addOptionReference(this);
}
@@ -63,7 +61,6 @@
owner.addOptionReference(this);
// value
- enumCommands = new HashMap();
switch (option.getValueType()) {
case IOption.BOOLEAN:
value = new Boolean(element.getAttribute("defaultValue"));
@@ -72,19 +69,7 @@
value = element.getAttribute("defaultValue");
break;
case IOption.ENUMERATED:
- List enumList = new ArrayList();
- IConfigurationElement[] enumElements = element.getChildren("optionEnum");
- for (int i = 0; i < enumElements.length; ++i) {
- String optName = enumElements[i].getAttribute("name");
- String optCommand = enumElements[i].getAttribute("command");
- enumList.add(optName);
- enumCommands.put(optName, optCommand);
- Boolean isDefault = new Boolean(enumElements[i].getAttribute("isDefault"));
- if (isDefault.booleanValue()) {
- defaultEnumName = optName;
- }
- }
- value = enumList;
+ value = option.getEnumCommand(option.getSelectedEnum());
break;
case IOption.STRING_LIST:
List valueList = new ArrayList();
@@ -112,14 +97,20 @@
// value
switch (option.getValueType()) {
case IOption.BOOLEAN:
+ value = new Boolean(element.getAttribute("value"));
+ break;
case IOption.STRING:
- value = element.getAttribute("value");
+ case IOption.ENUMERATED:
+ value = (String) element.getAttribute("value");
break;
case IOption.STRING_LIST:
List valueList = new ArrayList();
NodeList nodes = element.getElementsByTagName("optionValue");
for (int i = 0; i < nodes.getLength(); ++i) {
- valueList.add(((Element)nodes.item(i)).getAttribute("value"));
+ Node node = nodes.item(i);
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ valueList.add(((Element)node).getAttribute("value"));
+ }
}
value = valueList;
break;
@@ -128,33 +119,29 @@
}
/**
- * Write out to project file.
+ * Persist receiver to project file.
*
* @param doc
* @param element
*/
- public void serealize(Document doc, Element element) {
+ public void serialize(Document doc, Element element) {
element.setAttribute("id", option.getId());
// value
switch (option.getValueType()) {
case IOption.BOOLEAN:
+ element.setAttribute("value", ((Boolean)value).toString());
+ break;
case IOption.STRING:
+ case IOption.ENUMERATED:
element.setAttribute("value", (String)value);
break;
case IOption.STRING_LIST:
- List stringList = (List)value;
- for (int i = 0; i < stringList.size(); ++i) {
+ ArrayList stringList = (ArrayList)value;
+ ListIterator iter = stringList.listIterator();
+ while (iter.hasNext()) {
Element valueElement = doc.createElement("optionValue");
- valueElement.setAttribute("value", (String)stringList.get(i));
- element.appendChild(valueElement);
- }
- break;
- case IOption.ENUMERATED:
- List enumList = (List)value;
- for (int i = 0; i < enumList.size(); ++i) {
- Element valueElement = doc.createElement("optionEnum");
- valueElement.setAttribute("value", (String)enumList.get(i));
+ valueElement.setAttribute("value", (String)iter.next());
element.appendChild(valueElement);
}
break;
@@ -183,25 +170,10 @@
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.core.build.managed.IOption#getDefaultEnumValue()
- */
- public String getDefaultEnumName() {
- if (value == null) {
- return option.getDefaultEnumName();
- } else {
- return defaultEnumName;
- }
- }
-
- /* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IOption#getEnumCommand(java.lang.String)
*/
public String getEnumCommand(String name) {
- if (value == null) {
- return option.getEnumCommand(name);
- } else {
- return (String)enumCommands.get(name);
- }
+ return option.getEnumCommand(name);
}
/* (non-Javadoc)
@@ -234,13 +206,28 @@
}
/* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.IOption#getDefaultEnumValue()
+ */
+ public String getSelectedEnum() {
+ if (value == null) {
+ // Return the default defined for the enumeration in the manifest.
+ return option.getSelectedEnum();
+ } else {
+ // Value will contain the selection of the user
+ return (String) value;
+ }
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IOption#getStringListValue()
*/
public String[] getStringListValue() throws BuildException {
if (value == null)
return option.getStringListValue();
- else if (getValueType() == IOption.STRING_LIST)
- return (String[])value;
+ else if (getValueType() == IOption.STRING_LIST) {
+ ArrayList list = (ArrayList)value;
+ return (String[]) list.toArray(new String[list.size()]);
+ }
else
throw new BuildException("bad value type");
}
@@ -287,16 +274,34 @@
return option.equals(target);
}
+ /**
+ * @param value
+ */
+ public void setValue(boolean value) throws BuildException {
+ if (getValueType() == IOption.BOOLEAN)
+ this.value = new Boolean(value);
+ else
+ throw new BuildException("bad value type");
+ }
+
public void setValue(String value) throws BuildException {
- if (getValueType() == IOption.STRING)
+ if (getValueType() == IOption.STRING || getValueType() == IOption.ENUMERATED)
this.value = value;
else
throw new BuildException("bad value type");
}
+ /**
+ * Sets the value of the receiver to be an array of items.
+ *
+ * @param value An array of strings to place in the option reference.
+ * @throws BuildException
+ */
public void setValue(String [] value) throws BuildException {
- if (getValueType() == IOption.STRING_LIST)
- this.value = value;
+ if (getValueType() == IOption.STRING_LIST) {
+ // Just replace what the option reference is holding onto
+ this.value = new ArrayList(Arrays.asList(value));
+ }
else
throw new BuildException("bad value type");
}
Index: build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java,v
retrieving revision 1.1
diff -u -r1.1 ResourceBuildInfo.java
--- build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java 14 Apr 2003 20:02:38 -0000 1.1
+++ build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java 28 May 2003 18:53:16 -0000
@@ -1,11 +1,16 @@
-/*
- * Created on Apr 13, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
package org.eclipse.cdt.internal.core.build.managed;
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+ * **********************************************************************/
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -16,12 +21,6 @@
import org.w3c.dom.Element;
import org.w3c.dom.Node;
-/**
- * @author dschaefe
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
public class ResourceBuildInfo {
private IResource owner;
@@ -41,7 +40,6 @@
if (child.getNodeName().equals("target")) {
new Target(this, (Element)child);
}
-
child = child.getNextSibling();
}
}
Index: build/org/eclipse/cdt/internal/core/build/managed/Target.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java,v
retrieving revision 1.7
diff -u -r1.7 Target.java
--- build/org/eclipse/cdt/internal/core/build/managed/Target.java 21 Apr 2003 19:37:46 -0000 1.7
+++ build/org/eclipse/cdt/internal/core/build/managed/Target.java 28 May 2003 18:53:16 -0000
@@ -51,11 +51,12 @@
* @param parent
*/
public Target(IResource owner, ITarget parent) {
+ // Make the owner of the target the project resource
this(owner);
- this.parent = parent;
-
+
// Copy the parent's identity
- setId(parent.getId());
+ this.parent = parent;
+ setId(parent.getId() + ".1");
setName(parent.getName());
// Hook me up
@@ -136,13 +137,18 @@
if (child.getNodeName().equals("configuration")) {
new Configuration(this, (Element)child);
}
-
child = child.getNextSibling();
}
}
+ /**
+ * Persist receiver to project file.
+ *
+ * @param doc
+ * @param element
+ */
public void serialize(Document doc, Element element) {
element.setAttribute("id", getId());
element.setAttribute("name", getName());
@@ -155,7 +161,7 @@
Configuration config = (Configuration)configurations.get(i);
Element configElement = doc.createElement("configuration");
element.appendChild(configElement);
- config.serealize(doc, configElement);
+ config.serialize(doc, configElement);
}
}
@@ -198,7 +204,14 @@
}
public ITool getTool(String id) {
- return (ITool)toolMap.get(id);
+ ITool result = null;
+ // See if receiver has it in list
+ result = (ITool)toolMap.get(id);
+ // If not, check if parent has it
+ if (result == null && parent != null) {
+ result = ((Target)parent).getTool(id);
+ }
+ return result;
}
public void addTool(ITool tool) {
Index: build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java,v
retrieving revision 1.4
diff -u -r1.4 ToolReference.java
--- build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java 25 Apr 2003 14:32:51 -0000 1.4
+++ build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java 28 May 2003 18:53:16 -0000
@@ -36,10 +36,10 @@
private Map optionRefMap;
/**
- * Created on the fly.
+ * Created a tool reference on the fly based on an existing tool.
*
- * @param owner
- * @param parent
+ * @param owner The <code>Configuration</code> the receiver will be added to.
+ * @param parent The <code>ITool</code>tool the reference will be based on.
*/
public ToolReference(Configuration owner, ITool parent) {
this.owner = owner;
@@ -49,10 +49,10 @@
}
/**
- * Created from extension.
+ * Created tool reference from an extension defined in a plugin manifest.
*
- * @param owner
- * @param element
+ * @param owner The <code>Configuration</code> the receiver will be added to.
+ * @param element The element containing build information for the reference.
*/
public ToolReference(Configuration owner, IConfigurationElement element) {
this.owner = owner;
@@ -70,6 +70,13 @@
}
}
+ /**
+ * Create a new tool reference based on information contained in a project file.
+ *
+ * @param owner The <code>Configuration</code> the receiver will be added to.
+ * @param element The element defined in the project file containing build information
+ * for the receiver.
+ */
public ToolReference(Configuration owner, Element element) {
this.owner = owner;
@@ -87,7 +94,14 @@
}
}
- public void serealize(Document doc, Element element) {
+ /**
+ * Persist receiver to project file.
+ *
+ * @param doc The persistent store for the reference information.
+ * @param element The root element in the store the receiver must use
+ * to persist settings.
+ */
+ public void serialize(Document doc, Element element) {
element.setAttribute("id", parent.getId());
if (optionReferences != null)
@@ -95,7 +109,7 @@
OptionReference optionRef = (OptionReference)optionReferences.get(i);
Element optionRefElement = doc.createElement("optionRef");
element.appendChild(optionRefElement);
- optionRef.serealize(doc, optionRefElement);
+ optionRef.serialize(doc, optionRefElement);
}
}
Index: src/org/eclipse/cdt/core/ManagedCProjectNature.java
===================================================================
RCS file: src/org/eclipse/cdt/core/ManagedCProjectNature.java
diff -N src/org/eclipse/cdt/core/ManagedCProjectNature.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/core/ManagedCProjectNature.java 28 May 2003 18:53:17 -0000
@@ -0,0 +1,165 @@
+package org.eclipse.cdt.core;
+
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+***********************************************************************/
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Plugin;
+
+public class ManagedCProjectNature implements IProjectNature {
+ public static final String BUILDER_NAME= "genmakebuilder";
+ public static final String BUILDER_ID= CCorePlugin.PLUGIN_ID + "." + BUILDER_NAME;
+ private static final String MNG_NATURE_ID = CCorePlugin.PLUGIN_ID + ".managedBuildNature";
+ private IProject project;
+
+ /**
+ * Utility method for adding a managed nature to a project.
+ *
+ * @param proj the project to add the managed nature to.
+ * @param monitor a progress monitor to indicate the duration of the operation, or
+ * <code>null</code> if progress reporting is not required.
+ */
+ public static void addManagedNature(IProject project, IProgressMonitor monitor) throws CoreException {
+ addNature(project, MNG_NATURE_ID, monitor);
+ }
+
+ public static void addManagedBuilder(IProject project, IProgressMonitor monitor) throws CoreException {
+ // Add the builder to the project
+ IProjectDescription description = project.getDescription();
+ ICommand[] commands = description.getBuildSpec();
+ boolean found = false;
+ // See if the builder is already there
+ for (int i = 0; i < commands.length; ++i) {
+ if (commands[i].getBuilderName().equals(getBuilderID())) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ //add builder to project
+ ICommand command = description.newCommand();
+ command.setBuilderName(getBuilderID());
+ ICommand[] newCommands = new ICommand[commands.length + 1];
+ // Add it before other builders.
+ System.arraycopy(commands, 0, newCommands, 1, commands.length);
+ newCommands[0] = command;
+ description.setBuildSpec(newCommands);
+ project.setDescription(description, null);
+ }
+ }
+
+ /**
+ * Utility method for adding a nature to a project.
+ *
+ * @param proj the project to add the nature to.
+ * @param natureId the id of the nature to assign to the project
+ * @param monitor a progress monitor to indicate the duration of the operation, or
+ * <code>null</code> if progress reporting is not required.
+ */
+ public static void addNature(IProject project, String natureId, IProgressMonitor monitor) throws CoreException {
+ IProjectDescription description = project.getDescription();
+ String[] prevNatures = description.getNatureIds();
+ for (int i = 0; i < prevNatures.length; i++) {
+ if (natureId.equals(prevNatures[i]))
+ return;
+ }
+ String[] newNatures = new String[prevNatures.length + 1];
+ System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
+ newNatures[prevNatures.length] = natureId;
+ description.setNatureIds(newNatures);
+ project.setDescription(description, monitor);
+ }
+
+ /**
+ * Get the correct builderID
+ */
+ public static String getBuilderID() {
+ Plugin plugin = (Plugin)CCorePlugin.getDefault();
+ IPluginDescriptor descriptor = plugin.getDescriptor();
+ if (descriptor.getExtension(BUILDER_NAME) != null) {
+ return descriptor.getUniqueIdentifier() + "." + BUILDER_NAME;
+ }
+ return BUILDER_ID;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#configure()
+ */
+ public void configure() throws CoreException {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#deconfigure()
+ */
+ public void deconfigure() throws CoreException {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#getProject()
+ */
+ public IProject getProject() {
+ // Just return the project associated with the nature
+ return project;
+ }
+
+
+ /**
+ * Utility method to remove the managed nature from a project.
+ *
+ * @param project to remove the managed nature from
+ * @param mon progress monitor to indicate the duration of the operation, or
+ * <code>null</code> if progress reporting is not required.
+ * @throws CoreException
+ */
+ public static void removeManagedNature(IProject project, IProgressMonitor mon) throws CoreException {
+ removeNature(project, MNG_NATURE_ID, mon);
+ }
+
+ /**
+ * Utility method for removing a project nature from a project.
+ *
+ * @param proj the project to remove the nature from
+ * @param natureId the nature id to remove
+ * @param monitor a progress monitor to indicate the duration of the operation, or
+ * <code>null</code> if progress reporting is not required.
+ */
+ public static void removeNature(IProject project, String natureId, IProgressMonitor monitor) throws CoreException {
+ IProjectDescription description = project.getDescription();
+ String[] prevNatures = description.getNatureIds();
+ List newNatures = new ArrayList(Arrays.asList(prevNatures));
+ newNatures.remove(natureId);
+ description.setNatureIds((String[])newNatures.toArray(new String[newNatures.size()]));
+ project.setDescription(description, monitor);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
+ */
+ public void setProject(IProject project) {
+ // Set the project for the nature
+ this.project = project;
+ }
+
+}
Index: src/org/eclipse/cdt/internal/core/CCorePluginResources.properties
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CCorePluginResources.properties,v
retrieving revision 1.1
diff -u -r1.1 CCorePluginResources.properties
--- src/org/eclipse/cdt/internal/core/CCorePluginResources.properties 28 Mar 2003 21:00:39 -0000 1.1
+++ src/org/eclipse/cdt/internal/core/CCorePluginResources.properties 28 May 2003 18:53:17 -0000
@@ -4,4 +4,8 @@
# All Rights Reserved.
#
################################################
-CBuilder.build_error= Build Error
\ No newline at end of file
+CBuilder.build_error= Build Error
+
+# Generated makefile builder messages
+MakeBuilder.message.rebuild = Regenerating makefile for project {0}
+MakeBuilder.message.incremental = Updating makefile for project {0}
\ No newline at end of file
Index: src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java
===================================================================
RCS file: src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java
diff -N src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java 28 May 2003 18:53:17 -0000
@@ -0,0 +1,250 @@
+package org.eclipse.cdt.internal.core;
+
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+ * **********************************************************************/
+
+import java.io.ByteArrayInputStream;
+import java.util.Map;
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.build.managed.ManagedBuildManager;
+import org.eclipse.cdt.core.resources.ACBuilder;
+import org.eclipse.cdt.core.resources.MakeUtil;
+import org.eclipse.cdt.internal.core.build.managed.ResourceBuildInfo;
+import org.eclipse.cdt.internal.core.model.Util;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+
+public class GeneratedMakefileBuilder extends ACBuilder {
+ // String constants
+ private static final String MESSAGE = "MakeBuilder.message"; //$NON-NLS-1$
+ private static final String REBUILD = MESSAGE + ".rebuild"; //$NON-NLS-1$
+ private static final String INCREMENTAL = MESSAGE + ".incremental"; //$NON-NLS-1$
+ private static final String FILENAME = "makefile"; //$NON-NLS-1$
+ private static final String NEWLINE = System.getProperty("line.separator", "\n"); //$NON-NLS-1$
+ private static final String TAB = "\t"; //$NON-NLS-1$
+
+ public class MyResourceDeltaVisitor implements IResourceDeltaVisitor {
+ boolean bContinue;
+
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ IResource resource = delta.getResource();
+ if (resource != null && resource.getProject() == getProject()) {
+ bContinue = true;
+ return false;
+ }
+ return true;
+ }
+ public boolean shouldBuild() {
+ return bContinue;
+ }
+ }
+
+ /**
+ *
+ */
+ public GeneratedMakefileBuilder() {
+ super();
+ }
+
+ /**
+ * @param buffer
+ */
+ private void addMacros(StringBuffer buffer, ResourceBuildInfo info) {
+ // TODO this should come from the build model
+ buffer.append("CC = " + NEWLINE);
+ buffer.append("CFLAGS = " + NEWLINE);
+ buffer.append("LD = " + NEWLINE);
+ buffer.append("LDFLAGS = " + NEWLINE);
+ buffer.append("RM = rm -f" + NEWLINE);
+ buffer.append("MAKE = make" + NEWLINE);
+
+ buffer.append(NEWLINE);
+ }
+
+ /**
+ * @param buffer
+ */
+ private void addTargets(StringBuffer buffer) {
+ // TODO Targets should come from build model
+
+ // TODO Generate 'all' for now
+ buffer.append("all:" + NEWLINE);
+ buffer.append(NEWLINE);
+
+
+ // Always add a clean target
+ buffer.append("clean:" + NEWLINE);
+ buffer.append(TAB + "$(RM) *.o" + NEWLINE);
+ buffer.append(NEWLINE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.internal.events.InternalBuilder#build(int, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+ if (kind == IncrementalProjectBuilder.FULL_BUILD) {
+ fullBuild(monitor);
+ }
+ else {
+ // Create a delta visitor to make sure we should be rebuilding
+ MyResourceDeltaVisitor visitor = new MyResourceDeltaVisitor();
+ IResourceDelta delta = getDelta(getProject());
+ if (delta == null) {
+ fullBuild(monitor);
+ }
+ else {
+ delta.accept(visitor);
+ if (visitor.shouldBuild()) {
+ incrementalBuild(delta, monitor);
+ }
+ }
+ }
+ // Checking to see if the user cancelled the build
+ checkCancel(monitor);
+ // Build referenced projects
+ return getProject().getReferencedProjects();
+ }
+
+ /**
+ * Check whether the build has been canceled.
+ */
+ public void checkCancel(IProgressMonitor monitor) {
+ if (monitor != null && monitor.isCanceled())
+ throw new OperationCanceledException();
+ }
+
+ /**
+ * @param monitor
+ */
+ private void fullBuild(IProgressMonitor monitor) throws CoreException {
+ // Rebuild the entire project
+ IProject currentProject = getProject();
+ String statusMsg = null;
+
+ // Need to report status to the user
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ statusMsg = CCorePlugin.getFormattedString(REBUILD, currentProject.getName());
+ monitor.subTask(statusMsg);
+
+ // Get a filehandle for the makefile
+ IPath filePath = getWorkingDirectory().append(IPath.SEPARATOR + FILENAME);
+ String temp = filePath.toString();
+ IFile fileHandle = getMakefile(filePath, monitor);
+
+ // Add the items to the makefile
+ populateMakefile(fileHandle, monitor);
+
+ monitor.worked(1);
+ }
+
+ /**
+ * Gets the makefile for the project. It may be empty.
+ *
+ * @return The <code>IFile</code> to generate the makefile into.
+ */
+ public IFile getMakefile(IPath filePath, IProgressMonitor monitor) throws CoreException {
+ // Create or get the handle for the makefile
+ IWorkspaceRoot root= CCorePlugin.getWorkspace().getRoot();
+ IFile newFile = root.getFileForLocation(filePath);
+ if (newFile == null) {
+ newFile = root.getFile(filePath);
+ }
+ // Create the file if it does not exist
+ ByteArrayInputStream contents = new ByteArrayInputStream(new byte[0]);
+ try {
+ newFile.create(contents, false, monitor);
+ }
+ catch (CoreException e) {
+ // If the file already existed locally, just refresh to get contents
+ if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED)
+ newFile.refreshLocal(IResource.DEPTH_ZERO, null);
+ else
+ throw e;
+ }
+ // TODO handle long running file operation
+ return newFile;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.resources.ACBuilder#getWorkingDirectory()
+ */
+ public IPath getWorkingDirectory() {
+ IProject currProject = getProject();
+ IPath workingDirectory = new Path(MakeUtil.getSessionBuildDir((IResource) currProject));
+ if (workingDirectory.isEmpty())
+ workingDirectory = currProject.getLocation();
+ return workingDirectory;
+ }
+
+ /**
+ * @param delta
+ * @param monitor
+ */
+ private void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException {
+ // Rebuild the resource tree in the delta
+ IProject currentProject = getProject();
+ String statusMsg = null;
+
+ // Need to report status to the user
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ statusMsg = CCorePlugin.getFormattedString(INCREMENTAL, currentProject.getName());
+ monitor.subTask(statusMsg);
+
+ // Get a filehandle for the makefile
+ IPath filePath = getWorkingDirectory();
+ filePath.addTrailingSeparator();
+ filePath.append(FILENAME);
+ IFile fileHandle = getMakefile(filePath, monitor);
+
+ // Now populate it
+ populateMakefile(fileHandle, monitor);
+
+ monitor.worked(1);
+ }
+
+ /**
+ * Recreate the entire contents of the makefile.
+ *
+ * @param fileHandle The file to place the contents in.
+ */
+ private void populateMakefile(IFile fileHandle, IProgressMonitor monitor) throws CoreException {
+ // Write out the contents of the build model
+ StringBuffer buffer = new StringBuffer();
+ ResourceBuildInfo info = ManagedBuildManager.getBuildInfo(getProject());
+
+ // Add the macro definitions
+ addMacros(buffer, info);
+
+ // Add targets
+ addTargets(buffer);
+
+ // Save the file
+ Util.save(buffer, fileHandle);
+ }
+
+
+}
Index: plugin.xml
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/plugin.xml,v
retrieving revision 1.11
diff -u -r1.11 plugin.xml
--- plugin.xml 21 May 2003 16:30:00 -0000 1.11
+++ plugin.xml 28 May 2003 18:54:17 -0000
@@ -108,7 +108,7 @@
name="List Option in Top"
command="-L"
valueType="stringList"
- id="topOption">
+ id="list.option">
<optionValue
value="a">
</optionValue>
@@ -121,20 +121,20 @@
name="Boolean Option in Top"
command="-b"
valueType="boolean"
- id="topBoolOption">
+ id="boolean.option">
</option>
<option
defaultValue="x"
name="String Option in Category"
category="category"
valueType="string"
- id="childOption">
+ id="string.option">
</option>
<option
name="Enumerated Option in Category"
category="category"
valueType="enumerated"
- id="child.enumerated.option">
+ id="enumerated.option">
<optionEnum
name="Default Enum"
value="s"
@@ -162,7 +162,11 @@
<optionRef
defaultValue="y"
value="y"
- id="childOption">
+ id="string.option">
+ </optionRef>
+ <optionRef
+ defaultValue="true"
+ id="boolean.option">
</optionRef>
</toolRef>
</configuration>
Index: build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java,v
retrieving revision 1.8
diff -u -r1.8 AllBuildTests.java
--- build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java 21 May 2003 16:30:00 -0000 1.8
+++ build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java 28 May 2003 18:54:18 -0000
@@ -10,6 +10,8 @@
**********************************************************************/
package org.eclipse.cdt.core.build.managed.tests;
+import java.util.Arrays;
+
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -32,6 +34,12 @@
*
*/
public class AllBuildTests extends TestCase {
+ private static final boolean boolVal = true;
+ private static final String newConfigName = "test.config.override";
+ private static final String enumVal = "Another Enum";
+ private static final String[] listVal = {"_DEBUG", "/usr/include", "libglade.a"};
+ private static final String projectName = "BuildTest";
+ private static final String stringVal = "-c -wall";
public AllBuildTests(String name) {
super(name);
@@ -42,6 +50,7 @@
suite.addTest(new AllBuildTests("testExtensions"));
suite.addTest(new AllBuildTests("testProject"));
+ suite.addTest(new AllBuildTests("testConfigurations"));
return suite;
}
@@ -96,10 +105,56 @@
assertNotNull(testRoot);
assertNotNull(testSub);
}
+
+ public void testConfigurations() throws CoreException, BuildException {
+ // Open the test project
+ IProject project = createProject(projectName);
+
+ // Make sure there is one and only one target with 2 configs
+ ITarget[] definedTargets = ManagedBuildManager.getTargets(project);
+ assertEquals(1, definedTargets.length);
+ ITarget rootTarget = definedTargets[0];
+ IConfiguration[] definedConfigs = rootTarget.getConfigurations();
+ assertEquals(2, definedConfigs.length);
+ IConfiguration baseConfig = definedConfigs[0];
+
+ // Create a new configuration
+ IConfiguration newConfig = rootTarget.createConfiguration(baseConfig, newConfigName);
+ assertEquals(3, rootTarget.getConfigurations().length);
+
+ // There is only one tool
+ ITool[] definedTools = newConfig.getTools();
+ assertEquals(1, definedTools.length);
+ ITool rootTool = definedTools[0];
+
+ // Override options in the new configuration
+ IOptionCategory topCategory = rootTool.getTopOptionCategory();
+ assertEquals("Root Tool", topCategory.getName());
+ IOption[] options = topCategory.getOptions(null);
+ assertEquals(2, options.length);
+ ManagedBuildManager.setOption(newConfig, options[0], listVal);
+ ManagedBuildManager.setOption(newConfig, options[1], boolVal);
+
+ IOptionCategory[] categories = topCategory.getChildCategories();
+ assertEquals(1, categories.length);
+ options = categories[0].getOptions(null);
+ assertEquals(2, options.length);
+ ManagedBuildManager.setOption(newConfig, options[0], stringVal);
+ ManagedBuildManager.setOption(newConfig, options[1], enumVal);
+
+ // Save, close, reopen and test again
+ ManagedBuildManager.saveBuildInfo(project);
+ project.close(null);
+ ManagedBuildManager.removeBuildInfo(project);
+ project.open(null);
+
+ // Test the values in the new configuration
+ checkOptionReferences(project);
+ }
public void testProject() throws CoreException, BuildException {
// Create new project
- IProject project = createProject("BuildTest");
+ IProject project = createProject(projectName);
assertEquals(0, ManagedBuildManager.getTargets(project).length);
@@ -125,7 +180,7 @@
checkRootTarget(target, "x");
- // Override the "Option in Category" option value
+ // Override the "String Option in Category" option value
configs = target.getConfigurations();
ITool[] tools = configs[0].getTools();
IOptionCategory topCategory = tools[0].getTopOptionCategory();
@@ -166,6 +221,57 @@
return project;
}
+ private void checkOptionReferences(IProject project) throws BuildException {
+ // Get the targets out of the project
+ ITarget[] definedTargets = ManagedBuildManager.getTargets(project);
+ assertEquals(1, definedTargets.length);
+ ITarget rootTarget = definedTargets[0];
+
+ // Now get the configs
+ IConfiguration[] definedConfigs = rootTarget.getConfigurations();
+ assertEquals(3, definedConfigs.length);
+ IConfiguration newConfig = rootTarget.getConfiguration(newConfigName);
+ assertNotNull(newConfig);
+
+ // Now get the tool options and make sure the values are correct
+ ITool[] definedTools = newConfig.getTools();
+ assertEquals(1, definedTools.length);
+ ITool rootTool = definedTools[0];
+
+ // Check that the options in the new config contain overridden values
+ IOption[] rootOptions = rootTool.getOptions();
+ assertEquals(4, rootOptions.length);
+ // First is the new list
+ assertEquals("List Option in Top", rootOptions[0].getName());
+ assertEquals(IOption.STRING_LIST, rootOptions[0].getValueType());
+ String[] list = rootOptions[0].getStringListValue();
+ assertEquals(3, list.length);
+ assertTrue(Arrays.equals(listVal, list));
+ assertEquals(rootOptions[0].getCommand(), "-L");
+ // Next option is a boolean in top
+ assertEquals("Boolean Option in Top", rootOptions[1].getName());
+ assertEquals(IOption.BOOLEAN, rootOptions[1].getValueType());
+ assertEquals(boolVal, rootOptions[1].getBooleanValue());
+ assertEquals("-b", rootOptions[1].getCommand());
+ // Next option is a string category
+ assertEquals("String Option in Category", rootOptions[2].getName());
+ assertEquals(IOption.STRING, rootOptions[2].getValueType());
+ assertEquals(stringVal, rootOptions[2].getStringValue());
+ // Final option is an enumerated
+ assertEquals("Enumerated Option in Category", rootOptions[3].getName());
+ assertEquals(IOption.ENUMERATED, rootOptions[3].getValueType());
+ String selEnum = rootOptions[3].getSelectedEnum();
+ assertEquals(enumVal, selEnum);
+ String[] enums = rootOptions[3].getApplicableValues();
+ assertEquals(2, enums.length);
+ assertEquals("Default Enum", enums[0]);
+ assertEquals("Another Enum", enums[1]);
+ assertEquals("-e1", rootOptions[3].getEnumCommand(enums[0]));
+ assertEquals("-e2", rootOptions[3].getEnumCommand(enums[1]));
+ assertEquals("-e2", rootOptions[3].getEnumCommand(selEnum));
+ }
+
+
private void checkRootTarget(ITarget target, String oicValue) throws BuildException {
// Tools
ITool[] tools = target.getTools();
@@ -195,7 +301,7 @@
// Final option is an enumerated
assertEquals("Enumerated Option in Category", options[3].getName());
assertEquals(IOption.ENUMERATED, options[3].getValueType());
- assertEquals("Default Enum", options[3].getDefaultEnumName());
+ assertEquals("Default Enum", options[3].getSelectedEnum());
valueList = options[3].getApplicableValues();
assertEquals(2, valueList.length);
assertEquals("Default Enum", valueList[0]);
@@ -241,6 +347,7 @@
assertEquals("String Option in Category", options[0].getName());
assertEquals(oicValue, options[0].getStringValue());
assertEquals("Enumerated Option in Category", options[1].getName());
+
// Root Override Config
assertEquals("Root Override Config", configs[1].getName());
tools = configs[1].getTools();