diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Configuration.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Configuration.java
index 6ed0d47ee61..7538a4e9e7a 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Configuration.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Configuration.java
@@ -22,6 +22,8 @@ import org.eclipse.core.resources.IResource;
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;
/**
*
@@ -88,6 +90,15 @@ public class Configuration extends BuildObject implements IConfiguration {
if (element.hasAttribute("parent"))
parent = target.getParent().getConfiguration(element.getAttribute("parent"));
+
+ NodeList configElements = element.getChildNodes();
+ for (int i = 0; i < configElements.getLength(); ++i) {
+ Node configElement = configElements.item(i);
+ if (configElement.getNodeName().equals("toolRef")) {
+ new ToolReference(this, (Element)configElement);
+ }
+ }
+
}
public void serealize(Document doc, Element element) {
@@ -103,6 +114,7 @@ public class Configuration extends BuildObject implements IConfiguration {
for (int i = 0; i < toolReferences.size(); ++i) {
ToolReference toolRef = (ToolReference)toolReferences.get(i);
Element toolRefElement = doc.createElement("toolRef");
+ element.appendChild(toolRefElement);
toolRef.serealize(doc, toolRefElement);
}
}
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Option.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Option.java
index e444c505526..ecb36ff2cc1 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Option.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Option.java
@@ -10,6 +10,7 @@
**********************************************************************/
package org.eclipse.cdt.internal.core.build.managed;
+import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.build.managed.BuildException;
@@ -53,6 +54,28 @@ public class Option extends BuildObject implements IOption {
String categoryId = element.getAttribute("category");
if (categoryId != null)
setCategory(tool.getOptionCategory(categoryId));
+
+ // valueType
+ String valueTypeStr = element.getAttribute("valueType");
+ if (valueTypeStr == null || valueTypeStr.equals("string"))
+ valueType = IOption.STRING;
+ else if (valueTypeStr.equals("stringList"))
+ valueType = IOption.STRING_LIST;
+
+ // value
+ switch (valueType) {
+ case IOption.STRING:
+ value = element.getAttribute("value");
+ break;
+ case IOption.STRING_LIST:
+ List valueList = new ArrayList();
+ value = valueList;
+ IConfigurationElement[] valueElements = element.getChildren("optionValue");
+ for (int i = 0; i < valueElements.length; ++i) {
+ valueList.add(valueElements[i].getAttribute("value"));
+ }
+ break;
+ }
}
/* (non-Javadoc)
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java
index cfbb3f8c9e5..d02eb34e688 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/OptionReference.java
@@ -10,6 +10,9 @@
**********************************************************************/
package org.eclipse.cdt.internal.core.build.managed;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.cdt.core.build.managed.BuildException;
import org.eclipse.cdt.core.build.managed.IOption;
import org.eclipse.cdt.core.build.managed.IOptionCategory;
@@ -17,6 +20,7 @@ import org.eclipse.cdt.core.build.managed.ITool;
import org.eclipse.core.runtime.IConfigurationElement;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
/**
*
@@ -51,6 +55,20 @@ public class OptionReference implements IOption {
option = owner.getTool().getOption(element.getAttribute("id"));
owner.addOptionReference(this);
+
+ // value
+ switch (option.getValueType()) {
+ case IOption.STRING:
+ value = element.getAttribute("value");
+ break;
+ case IOption.STRING_LIST:
+ List valueList = new ArrayList();
+ IConfigurationElement[] valueElements = element.getChildren("optionValue");
+ for (int i = 0; i < valueElements.length; ++i) {
+ valueList.add(valueElements[i].getAttribute("value"));
+ }
+ break;
+ }
}
/**
@@ -64,6 +82,21 @@ public class OptionReference implements IOption {
option = owner.getTool().getOption(element.getAttribute("id"));
owner.addOptionReference(this);
+
+ // value
+ switch (option.getValueType()) {
+ case IOption.STRING:
+ value = 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"));
+ }
+ break;
+ }
+
}
/**
@@ -74,7 +107,20 @@ public class OptionReference implements IOption {
*/
public void serealize(Document doc, Element element) {
element.setAttribute("id", option.getId());
- option = owner.getOption(element.getAttribute("id"));
+
+ // value
+ switch (option.getValueType()) {
+ case IOption.STRING:
+ element.setAttribute("value", (String)value);
+ break;
+ case IOption.STRING_LIST:
+ List valueList = (List)value;
+ for (int i = 0; i < valueList.size(); ++i) {
+ Element valueElement = doc.createElement("optionValue");
+ valueElement.setAttribute("value", (String)valueList.get(i));
+ element.appendChild(valueElement);
+ }
+ }
}
/* (non-Javadoc)
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java
index ff1efc8761f..ff77920d260 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ToolReference.java
@@ -22,6 +22,8 @@ import org.eclipse.cdt.core.build.managed.ITool;
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;
/**
*
@@ -69,6 +71,20 @@ public class ToolReference implements ITool {
}
public ToolReference(Configuration owner, Element element) {
+ this.owner = owner;
+
+ Target parentTarget = (Target)owner.getTarget();
+ parent = ((Target)parentTarget.getParent()).getTool(element.getAttribute("id"));
+
+ owner.addToolReference(this);
+
+ NodeList configElements = element.getChildNodes();
+ for (int i = 0; i < configElements.getLength(); ++i) {
+ Node configElement = configElements.item(i);
+ if (configElement.getNodeName().equals("optionRef")) {
+ new OptionReference(this, (Element)configElement);
+ }
+ }
}
public void serealize(Document doc, Element element) {
@@ -78,6 +94,7 @@ public class ToolReference implements ITool {
for (int i = 0; i < optionReferences.size(); ++i) {
OptionReference optionRef = (OptionReference)optionReferences.get(i);
Element optionRefElement = doc.createElement("optionRef");
+ element.appendChild(optionRefElement);
optionRef.serealize(doc, optionRefElement);
}
}
diff --git a/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd b/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd
index 3f80815b64b..dc77d15fc5f 100644
--- a/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd
+++ b/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd
@@ -1,330 +1,343 @@
-
-
-
-
-
-
-
-
- [Enter description of this extension point.]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This is the id of the option category for this option. The id can be the id of the tool which is also a category.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Represents a type of resource that is the target of the build process, for example, a Linux Library. A target contains a sequence of tool definitions and configurations. Targets are arranged in an inheritance hierarchy where a target inherits the list of tools from it's parent and can add to or override tools in this list.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This is a UI property. If set to true, users should not be able to create project configurations targeted at this target.
-
-
-
-
-
-
- The id of a target that this tool inherits from.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [Enter the first release in which this extension point appears.]
-
-
-
-
-
-
-
-
- [Enter extension point usage example here.]
-
-
-
-
-
-
-
-
- [Enter API information here.]
-
-
-
-
-
-
-
-
- [Enter information about supplied implementation of this extension point.]
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ [Enter description of this extension point.]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is the id of the option category for this option. The id can be the id of the tool which is also a category.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents a type of resource that is the target of the build process, for example, a Linux Library. A target contains a sequence of tool definitions and configurations. Targets are arranged in an inheritance hierarchy where a target inherits the list of tools from it's parent and can add to or override tools in this list.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is a UI property. If set to true, users should not be able to create project configurations targeted at this target.
+
+
+
+
+
+
+ The id of a target that this tool inherits from.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [Enter the first release in which this extension point appears.]
+
+
+
+
+
+
+
+
+ [Enter extension point usage example here.]
+
+
+
+
+
+
+
+
+ [Enter API information here.]
+
+
+
+
+
+
+
+
+ [Enter information about supplied implementation of this extension point.]
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/org.eclipse.cdt.ui.tests/build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java b/core/org.eclipse.cdt.ui.tests/build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java
index 30429829b10..ce22ea79206 100644
--- a/core/org.eclipse.cdt.ui.tests/build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java
+++ b/core/org.eclipse.cdt.ui.tests/build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java
@@ -54,7 +54,7 @@ public class AllBuildTests extends TestCase {
* Navigates through the build info as defined in the extensions
* defined in this plugin
*/
- public void testExtensions() {
+ public void testExtensions() throws Exception {
ITarget testRoot = null;
ITarget testSub = null;
@@ -67,7 +67,7 @@ public class AllBuildTests extends TestCase {
if (target.getName().equals("Test Root")) {
testRoot = target;
- checkRootTarget(testRoot);
+ checkRootTarget(testRoot, "x");
} else if (target.getName().equals("Test Sub")) {
testSub = target;
@@ -123,7 +123,19 @@ public class AllBuildTests extends TestCase {
for (int i = 0; i < configs.length; ++i)
target.createConfiguration(configs[i], target.getId() + "." + i);
- checkRootTarget(target);
+ checkRootTarget(target, "x");
+
+ // Override the "Option in Category" option value
+ configs = target.getConfigurations();
+ ITool[] tools = configs[0].getTools();
+ IOptionCategory topCategory = tools[0].getTopOptionCategory();
+ IOptionCategory[] categories = topCategory.getChildCategories();
+ IOption[] options = categories[0].getOptions(configs[0]);
+ configs[0].setOption(options[0], "z");
+ options = categories[0].getOptions(null);
+ assertEquals("x", options[0].getStringValue());
+ options = categories[0].getOptions(configs[0]);
+ assertEquals("z", options[0].getStringValue());
// Save, close, reopen and test again
ManagedBuildManager.saveBuildInfo(project);
@@ -133,7 +145,7 @@ public class AllBuildTests extends TestCase {
targets = ManagedBuildManager.getTargets(project);
assertEquals(1, targets.length);
- checkRootTarget(targets[0]);
+ checkRootTarget(targets[0], "z");
}
IProject createProject(String name) throws CoreException {
@@ -154,7 +166,7 @@ public class AllBuildTests extends TestCase {
return project;
}
- private void checkRootTarget(ITarget target) {
+ private void checkRootTarget(ITarget target, String oicValue) throws BuildException {
// Tools
ITool[] tools = target.getTools();
// Root Tool
@@ -164,7 +176,11 @@ public class AllBuildTests extends TestCase {
IOption[] options = rootTool.getOptions();
assertEquals(2, options.length);
assertEquals("Option in Top", options[0].getName());
+ String[] valueList = options[0].getStringListValue();
+ assertEquals("a", valueList[0]);
+ assertEquals("b", valueList[1]);
assertEquals("Option in Category", options[1].getName());
+ assertEquals("x", options[1].getStringValue());
// Option Categories
IOptionCategory topCategory = rootTool.getTopOptionCategory();
assertEquals("Root Tool", topCategory.getName());
@@ -187,11 +203,34 @@ public class AllBuildTests extends TestCase {
tools = rootConfig.getTools();
assertEquals(1, tools.length);
assertEquals("Root Tool", tools[0].getName());
+ topCategory = tools[0].getTopOptionCategory();
+ options = topCategory.getOptions(configs[0]);
+ assertEquals(1, options.length);
+ assertEquals("Option in Top", options[0].getName());
+ valueList = options[0].getStringListValue();
+ assertEquals("a", valueList[0]);
+ assertEquals("b", valueList[1]);
+ categories = topCategory.getChildCategories();
+ options = categories[0].getOptions(configs[0]);
+ assertEquals("Option in Category", options[0].getName());
+ assertEquals(oicValue, options[0].getStringValue());
// Root Override Config
assertEquals("Root Override Config", configs[1].getName());
tools = configs[1].getTools();
+ assertEquals(1, tools.length);
assertTrue(tools[0] instanceof ToolReference);
- options = tools[0].getOptions();
+ assertEquals("Root Tool", tools[0].getName());
+ topCategory = tools[0].getTopOptionCategory();
+ options = topCategory.getOptions(configs[1]);
+ assertEquals(1, options.length);
+ assertEquals("Option in Top", options[0].getName());
+ valueList = options[0].getStringListValue();
+ assertEquals("a", valueList[0]);
+ assertEquals("b", valueList[1]);
+ categories = topCategory.getChildCategories();
+ options = categories[0].getOptions(configs[1]);
+ assertEquals("Option in Category", options[0].getName());
+ assertEquals("y", options[0].getStringValue());
}
-
+
}
diff --git a/core/org.eclipse.cdt.ui.tests/plugin.xml b/core/org.eclipse.cdt.ui.tests/plugin.xml
index 463db3fa60e..9a6b943315d 100644
--- a/core/org.eclipse.cdt.ui.tests/plugin.xml
+++ b/core/org.eclipse.cdt.ui.tests/plugin.xml
@@ -42,14 +42,14 @@
@@ -106,11 +106,20 @@
@@ -124,8 +133,8 @@
+ value="y"
+ id="childOption">