mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Work on the Build Model.
- Model is maturing - Loading/saving moved into the objects themselves - Project build info saved to/loaded from a file
This commit is contained in:
parent
5eb714f36f
commit
e6d765afcd
15 changed files with 1012 additions and 220 deletions
|
@ -85,7 +85,8 @@ public interface IOption extends IBuildObject {
|
|||
* @param config
|
||||
* @param value
|
||||
*/
|
||||
public IOption setStringValue(IConfiguration config, String value);
|
||||
public IOption setValue(IConfiguration config, String value)
|
||||
throws BuildException;
|
||||
|
||||
/**
|
||||
* Sets the value for this option in a given configuration.
|
||||
|
@ -95,6 +96,7 @@ public interface IOption extends IBuildObject {
|
|||
* @param config
|
||||
* @param value
|
||||
*/
|
||||
public IOption setStringValue(IConfiguration config, String[] value);
|
||||
public IOption setValue(IConfiguration config, String[] value)
|
||||
throws BuildException;
|
||||
|
||||
}
|
||||
|
|
|
@ -23,20 +23,13 @@ public interface IOptionCategory extends IBuildObject {
|
|||
public IOptionCategory[] getChildCategories();
|
||||
|
||||
/**
|
||||
* Returns a new child category for this category.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public IOptionCategory createChildCategory();
|
||||
|
||||
/**
|
||||
* Returns the options in this category for a given tool.
|
||||
* Returns the options in this category for a given configuration.
|
||||
*
|
||||
* @param tool
|
||||
* @return
|
||||
*/
|
||||
public IOption[] getOptions(ITool tool);
|
||||
|
||||
public IOption[] getOptions(IConfiguration configuration);
|
||||
|
||||
/**
|
||||
* Returns the category that owns this category, or null if this is the
|
||||
* top category for a tool.
|
||||
|
|
|
@ -18,6 +18,12 @@ import org.eclipse.core.resources.IResource;
|
|||
*/
|
||||
public interface ITarget extends IBuildObject {
|
||||
|
||||
/**
|
||||
* Returns whether this target is abstract
|
||||
* @return
|
||||
*/
|
||||
public boolean isAbstract();
|
||||
|
||||
/**
|
||||
* Gets the resource that this target is applied to.
|
||||
*
|
||||
|
@ -33,34 +39,10 @@ public interface ITarget extends IBuildObject {
|
|||
*/
|
||||
public ITool[] getTools();
|
||||
|
||||
/**
|
||||
* Creates a new tool.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public ITool createTool();
|
||||
|
||||
/**
|
||||
* Returns all of the configurations defined by this target.
|
||||
* @return
|
||||
*/
|
||||
public IConfiguration[] getConfigurations();
|
||||
|
||||
/**
|
||||
* Creates a new configuration for this target.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public IConfiguration createConfiguration()
|
||||
throws BuildException;
|
||||
|
||||
/**
|
||||
* Creates a new configuration based on the parent config for this target.
|
||||
*
|
||||
* @param parentConfig
|
||||
* @return
|
||||
*/
|
||||
public IConfiguration createConfiguration(IConfiguration parentConfig)
|
||||
throws BuildException;
|
||||
|
||||
}
|
||||
|
|
|
@ -27,12 +27,12 @@ public interface ITool extends IBuildObject {
|
|||
public IOption[] getOptions();
|
||||
|
||||
/**
|
||||
* Creates a new option for this tool. Generally, this should only be
|
||||
* done by the extension and project data loaders.
|
||||
* Get a particular option.
|
||||
*
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public IOption createOption();
|
||||
public IOption getOption(String id);
|
||||
|
||||
/**
|
||||
* Options are organized into categories for UI purposes.
|
||||
|
|
|
@ -10,15 +10,27 @@
|
|||
**********************************************************************/
|
||||
package org.eclipse.cdt.core.build.managed;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
||||
import org.apache.xerces.dom.DocumentImpl;
|
||||
import org.apache.xml.serialize.Method;
|
||||
import org.apache.xml.serialize.OutputFormat;
|
||||
import org.apache.xml.serialize.Serializer;
|
||||
import org.apache.xml.serialize.SerializerFactory;
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.internal.core.build.managed.Configuration;
|
||||
import org.eclipse.cdt.internal.core.build.managed.ResourceBuildInfo;
|
||||
import org.eclipse.cdt.internal.core.build.managed.Target;
|
||||
import org.eclipse.cdt.internal.core.build.managed.Tool;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
@ -26,6 +38,9 @@ import org.eclipse.core.runtime.IConfigurationElement;
|
|||
import org.eclipse.core.runtime.IExtension;
|
||||
import org.eclipse.core.runtime.IExtensionPoint;
|
||||
import org.eclipse.core.runtime.QualifiedName;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
/**
|
||||
* This is the main entry point for getting at the build information
|
||||
|
@ -33,13 +48,16 @@ import org.eclipse.core.runtime.QualifiedName;
|
|||
*/
|
||||
public class ManagedBuildManager {
|
||||
|
||||
private static final QualifiedName ownedTargetsProperty
|
||||
= new QualifiedName(CCorePlugin.PLUGIN_ID, "ownedTargets");
|
||||
private static final QualifiedName definedTargetsProperty
|
||||
= new QualifiedName(CCorePlugin.PLUGIN_ID, "definedTargets");
|
||||
private static final QualifiedName buildInfoProperty
|
||||
= new QualifiedName(CCorePlugin.PLUGIN_ID, "buildInfo");
|
||||
|
||||
private static final ITarget[] emptyTargets = new ITarget[0];
|
||||
|
||||
|
||||
// Targets defined by extensions (i.e., not associated with a resource)
|
||||
private static boolean extensionTargetsLoaded = false;
|
||||
private static List extensionTargets;
|
||||
private static Map extensionTargetMap;
|
||||
|
||||
/**
|
||||
* Returns the list of targets that are defined by this project,
|
||||
* projects referenced by this project, and by the extensions.
|
||||
|
@ -53,13 +71,7 @@ public class ManagedBuildManager {
|
|||
|
||||
// Get the targets for this project and all referenced projects
|
||||
List definedTargets = null;
|
||||
|
||||
if (project != null) {
|
||||
try {
|
||||
definedTargets = (List)project.getSessionProperty(definedTargetsProperty);
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
}
|
||||
// To Do
|
||||
|
||||
// Create the array and copy the elements over
|
||||
int size = extensionTargets.size()
|
||||
|
@ -86,15 +98,30 @@ public class ManagedBuildManager {
|
|||
* @return
|
||||
*/
|
||||
public static ITarget[] getTargets(IResource resource) {
|
||||
List targets = getOwnedTargetsProperty(resource);
|
||||
ResourceBuildInfo buildInfo = getBuildInfo(resource);
|
||||
|
||||
if (targets != null) {
|
||||
if (buildInfo != null) {
|
||||
List targets = buildInfo.getTargets();
|
||||
return (ITarget[])targets.toArray(new ITarget[targets.size()]);
|
||||
} else {
|
||||
return emptyTargets;
|
||||
}
|
||||
}
|
||||
|
||||
public static ITarget getTarget(IResource resource, String id) {
|
||||
if (resource != null) {
|
||||
ResourceBuildInfo buildInfo = getBuildInfo(resource);
|
||||
if (buildInfo != null)
|
||||
return buildInfo.getTarget(id);
|
||||
}
|
||||
|
||||
ITarget target = (ITarget)extensionTargetMap.get(id);
|
||||
if (target != null)
|
||||
return target;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new target to the resource based on the parentTarget.
|
||||
*
|
||||
|
@ -103,7 +130,7 @@ public class ManagedBuildManager {
|
|||
* @return
|
||||
* @throws BuildException
|
||||
*/
|
||||
public static ITarget addTarget(IResource resource, ITarget parentTarget)
|
||||
public static ITarget createTarget(IResource resource, ITarget parentTarget)
|
||||
throws BuildException
|
||||
{
|
||||
IResource owner = parentTarget.getOwner();
|
||||
|
@ -113,7 +140,7 @@ public class ManagedBuildManager {
|
|||
return parentTarget;
|
||||
|
||||
if (resource instanceof IProject) {
|
||||
// Owner must be null
|
||||
// Must be an extension target (why?)
|
||||
if (owner != null)
|
||||
throw new BuildException("addTarget: owner not null");
|
||||
} else {
|
||||
|
@ -125,19 +152,7 @@ public class ManagedBuildManager {
|
|||
}
|
||||
|
||||
// Passed validation
|
||||
List targets = getOwnedTargetsProperty(resource);
|
||||
if (targets == null) {
|
||||
targets = new ArrayList();
|
||||
try {
|
||||
resource.setSessionProperty(ownedTargetsProperty, targets);
|
||||
} catch (CoreException e) {
|
||||
throw new BuildException("addTarget: could not add property");
|
||||
}
|
||||
}
|
||||
|
||||
Target newTarget = new Target(resource, parentTarget);
|
||||
targets.add(newTarget);
|
||||
return newTarget;
|
||||
return new Target(resource, parentTarget);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -147,19 +162,65 @@ public class ManagedBuildManager {
|
|||
* @param project
|
||||
*/
|
||||
public static void saveBuildInfo(IProject project) {
|
||||
// Create document
|
||||
Document doc = new DocumentImpl();
|
||||
Element rootElement = doc.createElement("buildInfo");
|
||||
doc.appendChild(rootElement);
|
||||
|
||||
// Populate from buildInfo
|
||||
// To do - find other resources also
|
||||
ResourceBuildInfo buildInfo = getBuildInfo(project);
|
||||
if (buildInfo != null)
|
||||
buildInfo.serialize(doc, rootElement);
|
||||
|
||||
// Save the document
|
||||
ByteArrayOutputStream s = new ByteArrayOutputStream();
|
||||
OutputFormat format = new OutputFormat();
|
||||
format.setIndenting(true);
|
||||
format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$
|
||||
String xml = null;
|
||||
try {
|
||||
Serializer serializer
|
||||
= SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(new OutputStreamWriter(s, "UTF8"), format);
|
||||
serializer.asDOMSerializer().serialize(doc);
|
||||
xml = s.toString("UTF8"); //$NON-NLS-1$
|
||||
IFile rscFile = project.getFile(".cdtbuild");
|
||||
InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
|
||||
// update the resource content
|
||||
if (rscFile.exists()) {
|
||||
rscFile.setContents(inputStream, IResource.FORCE, null);
|
||||
} else {
|
||||
rscFile.create(inputStream, IResource.FORCE, null);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public static void removeBuildInfo(IResource resource) {
|
||||
try {
|
||||
resource.setSessionProperty(buildInfoProperty, null);
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
}
|
||||
|
||||
// Private stuff
|
||||
|
||||
private static List extensionTargets;
|
||||
|
||||
private static void loadExtensions() {
|
||||
if (extensionTargets != null)
|
||||
return;
|
||||
|
||||
extensionTargets = new ArrayList();
|
||||
Map targetMap = new HashMap();
|
||||
|
||||
public static void addExtensionTarget(Target target) {
|
||||
if (extensionTargets == null) {
|
||||
extensionTargets = new ArrayList();
|
||||
extensionTargetMap = new HashMap();
|
||||
}
|
||||
|
||||
extensionTargets.add(target);
|
||||
extensionTargetMap.put(target.getId(), target);
|
||||
}
|
||||
|
||||
private static void loadExtensions() {
|
||||
if (extensionTargetsLoaded)
|
||||
return;
|
||||
extensionTargetsLoaded = true;
|
||||
|
||||
IExtensionPoint extensionPoint
|
||||
= CCorePlugin.getDefault().getDescriptor().getExtensionPoint("ManagedBuildInfo");
|
||||
IExtension[] extensions = extensionPoint.getExtensions();
|
||||
|
@ -169,61 +230,58 @@ public class ManagedBuildManager {
|
|||
for (int j = 0; j < elements.length; ++j) {
|
||||
IConfigurationElement element = elements[j];
|
||||
if (element.getName().equals("target")) {
|
||||
String parentId = element.getAttribute("parent");
|
||||
Target target = null;
|
||||
if (parentId != null)
|
||||
target = new Target(null, (Target)targetMap.get(parentId));
|
||||
else
|
||||
target = new Target(null);
|
||||
target.setName(element.getAttribute("name"));
|
||||
extensionTargets.add(target);
|
||||
targetMap.put(element.getAttribute("id"), target);
|
||||
|
||||
IConfigurationElement[] targetElements = element.getChildren();
|
||||
for (int k = 0; k < targetElements.length; ++k) {
|
||||
IConfigurationElement targetElement = targetElements[k];
|
||||
if (targetElement.getName().equals("tool")) {
|
||||
ITool tool = target.createTool();
|
||||
tool.setName(targetElement.getAttribute("name"));
|
||||
|
||||
Map categoryMap = new HashMap();
|
||||
categoryMap.put(targetElement.getAttribute("id"), tool.getTopOptionCategory());
|
||||
IConfigurationElement[] toolElements = targetElement.getChildren();
|
||||
for (int l = 0; l < toolElements.length; ++l) {
|
||||
IConfigurationElement toolElement = toolElements[l];
|
||||
if (toolElement.getName().equals("option")) {
|
||||
IOption option = tool.createOption();
|
||||
option.setName(toolElement.getAttribute("name"));
|
||||
|
||||
String categoryId = toolElement.getAttribute("category");
|
||||
if (categoryId != null)
|
||||
option.setCategory((IOptionCategory)categoryMap.get(categoryId));
|
||||
} else if (toolElement.getName().equals("optionCategory")) {
|
||||
IOptionCategory owner = (IOptionCategory)categoryMap.get(toolElement.getAttribute("owner"));
|
||||
IOptionCategory category = owner.createChildCategory();
|
||||
category.setName(toolElement.getAttribute("name"));
|
||||
categoryMap.put(toolElement.getAttribute("id"), category);
|
||||
}
|
||||
}
|
||||
} else if (targetElement.getName().equals("configuration")) {
|
||||
try {
|
||||
IConfiguration config = target.createConfiguration();
|
||||
config.setName(targetElement.getAttribute("name"));
|
||||
} catch (BuildException e) {
|
||||
// Not sure what to do here.
|
||||
}
|
||||
}
|
||||
}
|
||||
new Target(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static List getOwnedTargetsProperty(IResource resource) {
|
||||
try {
|
||||
return (List)resource.getSessionProperty(ownedTargetsProperty);
|
||||
} catch (CoreException e) {
|
||||
|
||||
private static ResourceBuildInfo loadBuildInfo(IProject project) {
|
||||
ResourceBuildInfo buildInfo = null;
|
||||
IFile file = project.getFile(".cdtbuild");
|
||||
if (!file.exists())
|
||||
return null;
|
||||
|
||||
try {
|
||||
InputStream stream = file.getContents();
|
||||
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
||||
Document document = parser.parse(stream);
|
||||
Node rootElement = document.getFirstChild();
|
||||
if (rootElement.getNodeName().equals("buildInfo")) {
|
||||
buildInfo = new ResourceBuildInfo(project, (Element)rootElement);
|
||||
project.setSessionProperty(buildInfoProperty, buildInfo);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
buildInfo = null;
|
||||
}
|
||||
|
||||
return buildInfo;
|
||||
}
|
||||
|
||||
public static ResourceBuildInfo getBuildInfo(IResource resource, boolean create) {
|
||||
ResourceBuildInfo buildInfo = null;
|
||||
try {
|
||||
buildInfo = (ResourceBuildInfo)resource.getSessionProperty(buildInfoProperty);
|
||||
} catch (CoreException e) {
|
||||
}
|
||||
|
||||
if (buildInfo == null && resource instanceof IProject) {
|
||||
buildInfo = loadBuildInfo((IProject)resource);
|
||||
}
|
||||
|
||||
if (buildInfo == null && create) {
|
||||
try {
|
||||
buildInfo = new ResourceBuildInfo();
|
||||
resource.setSessionProperty(buildInfoProperty, buildInfo);
|
||||
} catch (CoreException e) {
|
||||
buildInfo = null;
|
||||
}
|
||||
}
|
||||
|
||||
return buildInfo;
|
||||
}
|
||||
|
||||
public static ResourceBuildInfo getBuildInfo(IResource resource) {
|
||||
return getBuildInfo(resource, false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,12 +10,14 @@
|
|||
**********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.build.managed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.ITarget;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -24,7 +26,7 @@ public class Configuration extends BuildObject implements IConfiguration {
|
|||
|
||||
private ITarget target;
|
||||
private IConfiguration parent;
|
||||
private List toolReference;
|
||||
private List toolReferences;
|
||||
|
||||
public Configuration(Target target) {
|
||||
this.target = target;
|
||||
|
@ -34,6 +36,27 @@ public class Configuration extends BuildObject implements IConfiguration {
|
|||
this.parent = parent;
|
||||
}
|
||||
|
||||
public Configuration(Target target, IConfigurationElement element) {
|
||||
this(target);
|
||||
|
||||
// id
|
||||
setId(element.getAttribute("id"));
|
||||
|
||||
// hook me up
|
||||
target.addConfiguration(this);
|
||||
|
||||
// name
|
||||
setName(element.getAttribute("name"));
|
||||
|
||||
IConfigurationElement[] configElements = element.getChildren();
|
||||
for (int l = 0; l < configElements.length; ++l) {
|
||||
IConfigurationElement configElement = configElements[l];
|
||||
if (configElement.getName().equals("toolRef")) {
|
||||
new ToolReference(this, configElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IConfiguration#getName()
|
||||
*/
|
||||
|
@ -45,8 +68,18 @@ public class Configuration extends BuildObject implements IConfiguration {
|
|||
* @see org.eclipse.cdt.core.build.managed.IConfiguration#getTools()
|
||||
*/
|
||||
public ITool[] getTools() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
ITool[] tools = parent != null
|
||||
? parent.getTools()
|
||||
: target.getTools();
|
||||
|
||||
// Replace tools with overrides
|
||||
for (int i = 0; i < tools.length; ++i) {
|
||||
ToolReference ref = getToolReference(tools[i]);
|
||||
if (ref != null)
|
||||
tools[i] = ref;
|
||||
}
|
||||
|
||||
return tools;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -70,4 +103,25 @@ public class Configuration extends BuildObject implements IConfiguration {
|
|||
return getTarget().getOwner();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the reference for a given tool.
|
||||
*
|
||||
* @param tool
|
||||
* @return
|
||||
*/
|
||||
private ToolReference getToolReference(ITool tool) {
|
||||
if (toolReferences != null)
|
||||
for (int i = 0; i < toolReferences.size(); ++i) {
|
||||
ToolReference toolRef = (ToolReference)toolReferences.get(i);
|
||||
if (toolRef.references(tool))
|
||||
return toolRef;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addToolReference(ToolReference toolRef) {
|
||||
if (toolReferences == null)
|
||||
toolReferences = new ArrayList();
|
||||
toolReferences.add(toolRef);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,10 +10,14 @@
|
|||
**********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.build.managed;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.BuildException;
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.IOption;
|
||||
import org.eclipse.cdt.core.build.managed.IOptionCategory;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -22,40 +26,66 @@ public class Option extends BuildObject implements IOption {
|
|||
|
||||
private ITool tool;
|
||||
private IOptionCategory category;
|
||||
private List enumValues;
|
||||
|
||||
private int valueType;
|
||||
private Object value;
|
||||
|
||||
private static final String[] emptyStrings = new String[0];
|
||||
|
||||
public Option(ITool tool) {
|
||||
this.tool = tool;
|
||||
}
|
||||
|
||||
public Option(Tool tool, IConfigurationElement element) {
|
||||
this(tool);
|
||||
|
||||
// id
|
||||
setId(element.getAttribute("id"));
|
||||
|
||||
// hook me up
|
||||
tool.addOption(this);
|
||||
|
||||
// name
|
||||
setName(element.getAttribute("name"));
|
||||
|
||||
// category
|
||||
String categoryId = element.getAttribute("category");
|
||||
if (categoryId != null)
|
||||
setCategory(tool.getOptionCategory(categoryId));
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getApplicableValues()
|
||||
*/
|
||||
public String[] getApplicableValues() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
return enumValues != null
|
||||
? (String[])enumValues.toArray(new String[enumValues.size()])
|
||||
: emptyStrings;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getCategory()
|
||||
*/
|
||||
public IOptionCategory getCategory() {
|
||||
return (category != null) ? category : getTool().getTopOptionCategory();
|
||||
return category != null ? category : getTool().getTopOptionCategory();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getStringListValue()
|
||||
*/
|
||||
public String[] getStringListValue() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
List v = (List)value;
|
||||
return v != null
|
||||
? (String[])v.toArray(new String[v.size()])
|
||||
: emptyStrings;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getStringValue()
|
||||
*/
|
||||
public String getStringValue() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
return (String)value;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -69,24 +99,45 @@ public class Option extends BuildObject implements IOption {
|
|||
* @see org.eclipse.cdt.core.build.managed.IOption#getValueType()
|
||||
*/
|
||||
public int getValueType() {
|
||||
// TODO Auto-generated method stub
|
||||
return 0;
|
||||
return valueType;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#setStringValue(org.eclipse.cdt.core.build.managed.IConfiguration, java.lang.String)
|
||||
*/
|
||||
public IOption setStringValue(IConfiguration config, String value) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
public IOption setValue(IConfiguration config, String value)
|
||||
throws BuildException
|
||||
{
|
||||
if (valueType != IOption.STRING)
|
||||
throw new BuildException("Bad value for type");
|
||||
|
||||
if (config == null) {
|
||||
this.value = value;
|
||||
return this;
|
||||
} else {
|
||||
|
||||
// Magic time
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#setStringValue(org.eclipse.cdt.core.build.managed.IConfiguration, java.lang.String[])
|
||||
*/
|
||||
public IOption setStringValue(IConfiguration config, String[] value) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
public IOption setValue(IConfiguration config, String[] value)
|
||||
throws BuildException
|
||||
{
|
||||
if (valueType != IOption.STRING_LIST)
|
||||
throw new BuildException("Bad value for type");
|
||||
|
||||
if (config == null) {
|
||||
this.value = value;
|
||||
return this;
|
||||
} else {
|
||||
// More magic
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
|
|
@ -13,9 +13,11 @@ package org.eclipse.cdt.internal.core.build.managed;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.IOption;
|
||||
import org.eclipse.cdt.core.build.managed.IOptionCategory;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -31,6 +33,28 @@ public class OptionCategory extends BuildObject implements IOptionCategory {
|
|||
this.owner = owner;
|
||||
}
|
||||
|
||||
public OptionCategory(Tool tool, IConfigurationElement element) {
|
||||
String parentId = element.getAttribute("parent");
|
||||
if (parentId != null)
|
||||
owner = tool.getOptionCategory(element.getAttribute("parent"));
|
||||
else
|
||||
owner = tool;
|
||||
|
||||
// id
|
||||
setId(element.getAttribute("id"));
|
||||
|
||||
// Name
|
||||
setName(element.getAttribute("name"));
|
||||
|
||||
// Hook me in
|
||||
if (owner instanceof Tool)
|
||||
((Tool)owner).addChildCategory(this);
|
||||
else
|
||||
((OptionCategory)owner).addChildCategory(this);
|
||||
|
||||
tool.addOptionCategory(this);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#getChildCategories()
|
||||
*/
|
||||
|
@ -41,17 +65,10 @@ public class OptionCategory extends BuildObject implements IOptionCategory {
|
|||
return emtpyCategories;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#createChildCategory()
|
||||
*/
|
||||
public IOptionCategory createChildCategory() {
|
||||
IOptionCategory category = new OptionCategory(this);
|
||||
|
||||
public void addChildCategory(OptionCategory category) {
|
||||
if (children == null)
|
||||
children = new ArrayList();
|
||||
children.add(category);
|
||||
|
||||
return category;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -72,16 +89,31 @@ public class OptionCategory extends BuildObject implements IOptionCategory {
|
|||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptions(org.eclipse.cdt.core.build.managed.ITool)
|
||||
*/
|
||||
public IOption[] getOptions(ITool tool) {
|
||||
List myOptions = new ArrayList();
|
||||
public IOption[] getOptions(IConfiguration configuration) {
|
||||
ITool tool = getTool();
|
||||
if (configuration != null) {
|
||||
// TODO don't like this much
|
||||
ITool[] tools = configuration.getTools();
|
||||
for (int i = 0; i < tools.length; ++i) {
|
||||
if (tools[i] instanceof ToolReference) {
|
||||
if (((ToolReference)tools[i]).references(tool)) {
|
||||
tool = tools[i];
|
||||
break;
|
||||
}
|
||||
} else if (tools[i].equals(tool))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
IOption[] allOptions = tool.getOptions();
|
||||
|
||||
List myOptions = new ArrayList();
|
||||
|
||||
for (int i = 0; i < allOptions.length; ++i) {
|
||||
IOption option = allOptions[i];
|
||||
if (option.getCategory().equals(this))
|
||||
myOptions.add(option);
|
||||
}
|
||||
|
||||
|
||||
return (IOption[])myOptions.toArray(new IOption[myOptions.size()]);
|
||||
}
|
||||
|
||||
|
|
|
@ -10,9 +10,145 @@
|
|||
**********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.build.managed;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.IOption;
|
||||
import org.eclipse.cdt.core.build.managed.IOptionCategory;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class OptionReference {
|
||||
public class OptionReference implements IOption {
|
||||
|
||||
private IOption option;
|
||||
private ITool tool;
|
||||
|
||||
public OptionReference(IOption option, ITool tool) {
|
||||
this.option = option;
|
||||
this.tool = tool;
|
||||
}
|
||||
|
||||
public OptionReference(ToolReference owner, IConfigurationElement element) {
|
||||
this.tool = owner;
|
||||
|
||||
option = tool.getOption(element.getAttribute("id"));
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getApplicableValues()
|
||||
*/
|
||||
public String[] getApplicableValues() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getCategory()
|
||||
*/
|
||||
public IOptionCategory getCategory() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IBuildObject#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getStringListValue()
|
||||
*/
|
||||
public String[] getStringListValue() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getStringValue()
|
||||
*/
|
||||
public String getStringValue() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getTool()
|
||||
*/
|
||||
public ITool getTool() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#getValueType()
|
||||
*/
|
||||
public int getValueType() {
|
||||
// TODO Auto-generated method stub
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#setCategory(org.eclipse.cdt.core.build.managed.IOptionCategory)
|
||||
*/
|
||||
public void setCategory(IOptionCategory category) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#setStringValue(org.eclipse.cdt.core.build.managed.IConfiguration, java.lang.String)
|
||||
*/
|
||||
public IOption setValue(IConfiguration config, String value) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOption#setStringValue(org.eclipse.cdt.core.build.managed.IConfiguration, java.lang.String[])
|
||||
*/
|
||||
public IOption setValue(IConfiguration config, String[] value) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IBuildObject#getId()
|
||||
*/
|
||||
public String getId() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IBuildObject#setId(java.lang.String)
|
||||
*/
|
||||
public void setId(String id) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IBuildObject#setName(java.lang.String)
|
||||
*/
|
||||
public void setName(String name) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public boolean references(IOption target) {
|
||||
if (equals(target))
|
||||
// we are the target
|
||||
return true;
|
||||
else if (option instanceof OptionReference)
|
||||
// check the reference we are overriding
|
||||
return ((OptionReference)option).references(target);
|
||||
else
|
||||
// the real reference
|
||||
return option.equals(target);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* 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;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.w3c.dom.Document;
|
||||
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;
|
||||
private Map targetMap;
|
||||
private List targets;
|
||||
|
||||
public ResourceBuildInfo() {
|
||||
targetMap = new HashMap();
|
||||
targets = new ArrayList();
|
||||
}
|
||||
|
||||
public ResourceBuildInfo(IResource owner, Element element) {
|
||||
this();
|
||||
|
||||
Node child = element.getFirstChild();
|
||||
while (child != null) {
|
||||
if (child.getNodeName().equals("target")) {
|
||||
new Target(this, (Element)child);
|
||||
}
|
||||
|
||||
child = child.getNextSibling();
|
||||
}
|
||||
}
|
||||
|
||||
public IResource getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public Target getTarget(String id) {
|
||||
return (Target)targetMap.get(id);
|
||||
}
|
||||
|
||||
public List getTargets() {
|
||||
return targets;
|
||||
}
|
||||
|
||||
public void addTarget(Target target) {
|
||||
targetMap.put(target.getId(), target);
|
||||
targets.add(target);
|
||||
}
|
||||
|
||||
public void serialize(Document doc, Element element) {
|
||||
for (int i = 0; i < targets.size(); ++i) {
|
||||
Element targetElement = doc.createElement("target");
|
||||
element.appendChild(targetElement);
|
||||
((Target)targets.get(i)).serialize(doc, targetElement);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,14 +11,20 @@
|
|||
package org.eclipse.cdt.internal.core.build.managed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.BuildException;
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.ITarget;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.cdt.core.build.managed.ManagedBuildManager;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -28,7 +34,9 @@ public class Target extends BuildObject implements ITarget {
|
|||
private ITarget parent;
|
||||
private IResource owner;
|
||||
private List tools;
|
||||
private Map toolMap;
|
||||
private List configurations;
|
||||
private boolean isAbstract = false;
|
||||
|
||||
private static final IConfiguration[] emptyConfigs = new IConfiguration[0];
|
||||
|
||||
|
@ -37,22 +45,99 @@ public class Target extends BuildObject implements ITarget {
|
|||
}
|
||||
|
||||
/**
|
||||
* Resource is allowed to be null to represent a ISV target def.
|
||||
*
|
||||
* Create a target owned by a resource based on a parent target
|
||||
* @param parent
|
||||
*/
|
||||
public Target(IResource owner, ITarget parent) {
|
||||
this.owner = owner;
|
||||
this(owner);
|
||||
this.parent = parent;
|
||||
|
||||
// Inherit the configs from the parent
|
||||
inheritConfigs();
|
||||
|
||||
// Copy the parent's identity
|
||||
setId(parent.getId());
|
||||
setName(parent.getName());
|
||||
|
||||
// Hook me up
|
||||
ResourceBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(owner, true);
|
||||
buildInfo.addTarget(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* This constructor is called to create a target defined by an extension.
|
||||
*
|
||||
* @param element
|
||||
*/
|
||||
public Target(IConfigurationElement element) {
|
||||
// id
|
||||
setId(element.getAttribute("id"));
|
||||
|
||||
// hook me up
|
||||
ManagedBuildManager.addExtensionTarget(this);
|
||||
|
||||
// name
|
||||
setName(element.getAttribute("name"));
|
||||
|
||||
// parent
|
||||
String parentId = element.getAttribute("parent");
|
||||
if (parentId != null) {
|
||||
parent = ManagedBuildManager.getTarget(null, parentId);
|
||||
|
||||
// Inherit the configs from the parent
|
||||
inheritConfigs();
|
||||
}
|
||||
|
||||
// isAbstract
|
||||
if ("true".equals(element.getAttribute("isAbstract")))
|
||||
isAbstract = true;
|
||||
|
||||
IConfigurationElement[] targetElements = element.getChildren();
|
||||
for (int k = 0; k < targetElements.length; ++k) {
|
||||
IConfigurationElement targetElement = targetElements[k];
|
||||
if (targetElement.getName().equals("tool")) {
|
||||
new Tool(this, targetElement);
|
||||
} else if (targetElement.getName().equals("configuration")) {
|
||||
new Configuration(this, targetElement);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Target(ResourceBuildInfo buildInfo, Element element) {
|
||||
this(buildInfo.getOwner());
|
||||
|
||||
// id
|
||||
setId(element.getAttribute("id"));
|
||||
|
||||
// hook me up
|
||||
buildInfo.addTarget(this);
|
||||
|
||||
// name
|
||||
setName(element.getAttribute("name"));
|
||||
|
||||
// parent
|
||||
String parentId = element.getAttribute("parent");
|
||||
if (parentId != null) {
|
||||
parent = ManagedBuildManager.getTarget(null, parentId);
|
||||
|
||||
// Inherit the configs from the parent
|
||||
inheritConfigs();
|
||||
}
|
||||
|
||||
// isAbstract
|
||||
if ("true".equals(element.getAttribute("isAbstract")))
|
||||
isAbstract = true;
|
||||
|
||||
}
|
||||
private void inheritConfigs() {
|
||||
IConfiguration[] parentConfigs = parent.getConfigurations();
|
||||
if (parentConfigs.length > 0)
|
||||
configurations = new ArrayList(parentConfigs.length);
|
||||
for (int i = 0; i < parentConfigs.length; ++i)
|
||||
configurations.add(new Configuration(parentConfigs[i]));
|
||||
|
||||
}
|
||||
|
||||
|
||||
public String getName() {
|
||||
return (name == null && parent != null) ? parent.getName() : name;
|
||||
}
|
||||
|
@ -91,14 +176,18 @@ public class Target extends BuildObject implements ITarget {
|
|||
return toolArray;
|
||||
}
|
||||
|
||||
public ITool createTool() {
|
||||
ITool tool = new Tool(this);
|
||||
|
||||
if (tools == null)
|
||||
public ITool getTool(String id) {
|
||||
return (ITool)toolMap.get(id);
|
||||
}
|
||||
|
||||
public void addTool(ITool tool) {
|
||||
if (tools == null) {
|
||||
tools = new ArrayList();
|
||||
tools.add(tool);
|
||||
toolMap = new HashMap();
|
||||
}
|
||||
|
||||
return tool;
|
||||
tools.add(tool);
|
||||
toolMap.put(tool.getId(), tool);
|
||||
}
|
||||
|
||||
public IConfiguration[] getConfigurations() {
|
||||
|
@ -108,6 +197,12 @@ public class Target extends BuildObject implements ITarget {
|
|||
return emptyConfigs;
|
||||
}
|
||||
|
||||
public void addConfiguration(IConfiguration configuration) {
|
||||
if (configurations == null)
|
||||
configurations = new ArrayList();
|
||||
configurations.add(configuration);
|
||||
}
|
||||
|
||||
private void addLocalConfiguration(IConfiguration configuration) {
|
||||
if (configurations == null)
|
||||
configurations = new ArrayList();
|
||||
|
@ -143,4 +238,18 @@ public class Target extends BuildObject implements ITarget {
|
|||
return config;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITarget#isAbstract()
|
||||
*/
|
||||
public boolean isAbstract() {
|
||||
return isAbstract;
|
||||
}
|
||||
|
||||
public void serialize(Document doc, Element element) {
|
||||
element.setAttribute("id", getId());
|
||||
element.setAttribute("name", getName());
|
||||
if (parent != null)
|
||||
element.setAttribute("parent", parent.getId());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,12 +11,16 @@
|
|||
package org.eclipse.cdt.internal.core.build.managed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.IOption;
|
||||
import org.eclipse.cdt.core.build.managed.IOptionCategory;
|
||||
import org.eclipse.cdt.core.build.managed.ITarget;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
|
||||
/**
|
||||
* Represents a tool that can be invoked during a build.
|
||||
|
@ -27,8 +31,9 @@ public class Tool extends BuildObject implements ITool, IOptionCategory {
|
|||
|
||||
private ITarget target;
|
||||
private List options;
|
||||
private IOptionCategory topOptionCategory;
|
||||
private Map optionMap;
|
||||
private List childOptionCategories;
|
||||
private Map categoryMap;
|
||||
|
||||
private static IOption[] emptyOptions = new IOption[0];
|
||||
private static IOptionCategory[] emptyCategories = new IOptionCategory[0];
|
||||
|
@ -37,10 +42,52 @@ public class Tool extends BuildObject implements ITool, IOptionCategory {
|
|||
this.target = target;
|
||||
}
|
||||
|
||||
public Tool(Target target, IConfigurationElement element) {
|
||||
this(target);
|
||||
|
||||
// id
|
||||
setId(element.getAttribute("id"));
|
||||
|
||||
// hook me up
|
||||
target.addTool(this);
|
||||
|
||||
// name
|
||||
setName(element.getAttribute("name"));
|
||||
|
||||
// set up the category map
|
||||
categoryMap = new HashMap();
|
||||
addOptionCategory(this);
|
||||
|
||||
// Check for options
|
||||
IConfigurationElement[] toolElements = element.getChildren();
|
||||
for (int l = 0; l < toolElements.length; ++l) {
|
||||
IConfigurationElement toolElement = toolElements[l];
|
||||
if (toolElement.getName().equals("option")) {
|
||||
new Option(this, toolElement);
|
||||
} else if (toolElement.getName().equals("optionCategory")) {
|
||||
new OptionCategory(this, toolElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ITarget getTarget() {
|
||||
return target;
|
||||
}
|
||||
|
||||
public IOptionCategory getOptionCategory(String id) {
|
||||
return (IOptionCategory)categoryMap.get(id);
|
||||
}
|
||||
|
||||
void addOptionCategory(IOptionCategory category) {
|
||||
categoryMap.put(category.getId(), category);
|
||||
}
|
||||
|
||||
void addChildCategory(IOptionCategory category) {
|
||||
if (childOptionCategories == null)
|
||||
childOptionCategories = new ArrayList();
|
||||
childOptionCategories.add(category);
|
||||
}
|
||||
|
||||
public IOption[] getOptions() {
|
||||
if (options != null)
|
||||
return (IOption[])options.toArray(new IOption[options.size()]);
|
||||
|
@ -48,19 +95,12 @@ public class Tool extends BuildObject implements ITool, IOptionCategory {
|
|||
return emptyOptions;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#createOption()
|
||||
*/
|
||||
public IOption createOption() {
|
||||
IOption option = new Option(this);
|
||||
|
||||
public void addOption(Option option) {
|
||||
if (options == null)
|
||||
options = new ArrayList();
|
||||
options.add(option);
|
||||
|
||||
return option;
|
||||
}
|
||||
|
||||
|
||||
public IOptionCategory getTopOptionCategory() {
|
||||
return this;
|
||||
}
|
||||
|
@ -105,17 +145,40 @@ public class Tool extends BuildObject implements ITool, IOptionCategory {
|
|||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptions(org.eclipse.cdt.core.build.managed.ITool)
|
||||
*/
|
||||
public IOption[] getOptions(ITool tool) {
|
||||
List myOptions = new ArrayList();
|
||||
public IOption[] getOptions(IConfiguration configuration) {
|
||||
ITool tool = this;
|
||||
if (configuration != null) {
|
||||
// TODO don't like this much
|
||||
ITool[] tools = configuration.getTools();
|
||||
for (int i = 0; i < tools.length; ++i) {
|
||||
if (tools[i] instanceof ToolReference) {
|
||||
if (((ToolReference)tools[i]).references(tool)) {
|
||||
tool = tools[i];
|
||||
break;
|
||||
}
|
||||
} else if (tools[i].equals(tool))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
IOption[] allOptions = tool.getOptions();
|
||||
|
||||
List myOptions = new ArrayList();
|
||||
|
||||
for (int i = 0; i < allOptions.length; ++i) {
|
||||
IOption option = allOptions[i];
|
||||
if (option.getCategory() == null || option.getCategory().equals(this))
|
||||
if (option.getCategory().equals(this))
|
||||
myOptions.add(option);
|
||||
}
|
||||
|
||||
|
||||
return (IOption[])myOptions.toArray(new IOption[myOptions.size()]);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#getOption(java.lang.String)
|
||||
*/
|
||||
public IOption getOption(String id) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -10,9 +10,160 @@
|
|||
**********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.build.managed;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.IOption;
|
||||
import org.eclipse.cdt.core.build.managed.IOptionCategory;
|
||||
import org.eclipse.cdt.core.build.managed.ITarget;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public class ToolReference {
|
||||
public class ToolReference implements ITool {
|
||||
|
||||
private ITool parent;
|
||||
private IConfiguration owner;
|
||||
private List optionReferences;
|
||||
private Map optionRefMap;
|
||||
|
||||
public ToolReference(ITool parent, IConfiguration owner) {
|
||||
this.parent = parent;
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
public ToolReference(Configuration owner, IConfigurationElement element) {
|
||||
this.owner = owner;
|
||||
|
||||
parent = ((Target)owner.getTarget()).getTool(element.getAttribute("id"));
|
||||
|
||||
owner.addToolReference(this);
|
||||
|
||||
IConfigurationElement[] toolElements = element.getChildren();
|
||||
for (int m = 0; m < toolElements.length; ++m) {
|
||||
IConfigurationElement toolElement = toolElements[m];
|
||||
if (toolElement.getName().equals("optionRef")) {
|
||||
new OptionReference(this, toolElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ITool getTool() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#createOption()
|
||||
*/
|
||||
public IOption createOption() {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#getOptions()
|
||||
*/
|
||||
public IOption[] getOptions() {
|
||||
IOption[] options = parent.getOptions();
|
||||
|
||||
// Replace with our references
|
||||
for (int i = 0; i < options.length; ++i) {
|
||||
OptionReference ref = getOptionReference(options[i]);
|
||||
if (ref != null)
|
||||
options[i] = ref;
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#getTarget()
|
||||
*/
|
||||
public ITarget getTarget() {
|
||||
return owner.getTarget();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#getTopOptionCategory()
|
||||
*/
|
||||
public IOptionCategory getTopOptionCategory() {
|
||||
return parent.getTopOptionCategory();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IBuildObject#getId()
|
||||
*/
|
||||
public String getId() {
|
||||
return parent.getId();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IBuildObject#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
return parent.getName();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.IBuildObject#setId(java.lang.String)
|
||||
*/
|
||||
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
|
||||
return true;
|
||||
else if (parent instanceof ToolReference)
|
||||
// check the reference we are overriding
|
||||
return ((ToolReference)parent).references(target);
|
||||
else
|
||||
// the real reference
|
||||
return parent.equals(target);
|
||||
}
|
||||
|
||||
private OptionReference getOptionReference(IOption option) {
|
||||
if (optionReferences != null)
|
||||
for (int i = 0; i < optionReferences.size(); ++i) {
|
||||
OptionReference optionRef = (OptionReference)optionReferences.get(i);
|
||||
if (optionRef.references(option))
|
||||
return optionRef;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addOptionReference(OptionReference optionRef) {
|
||||
if (optionReferences == null)
|
||||
optionReferences = new ArrayList();
|
||||
optionReferences.add(optionRef);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#getOption(java.lang.String)
|
||||
*/
|
||||
public IOption getOption(String id) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.build.managed.ITool#createOption(org.eclipse.cdt.core.build.managed.IConfiguration)
|
||||
*/
|
||||
public IOption createOption(IConfiguration config) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -14,12 +14,19 @@ import junit.framework.Test;
|
|||
import junit.framework.TestCase;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
import org.eclipse.cdt.core.build.managed.BuildException;
|
||||
import org.eclipse.cdt.core.build.managed.IConfiguration;
|
||||
import org.eclipse.cdt.core.build.managed.IOption;
|
||||
import org.eclipse.cdt.core.build.managed.IOptionCategory;
|
||||
import org.eclipse.cdt.core.build.managed.ITarget;
|
||||
import org.eclipse.cdt.core.build.managed.ITool;
|
||||
import org.eclipse.cdt.core.build.managed.ManagedBuildManager;
|
||||
import org.eclipse.cdt.internal.core.build.managed.ToolReference;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||
import org.eclipse.core.resources.ResourcesPlugin;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -34,6 +41,7 @@ public class AllBuildTests extends TestCase {
|
|||
TestSuite suite = new TestSuite();
|
||||
|
||||
suite.addTest(new AllBuildTests("testExtensions"));
|
||||
suite.addTest(new AllBuildTests("testProject"));
|
||||
|
||||
return suite;
|
||||
}
|
||||
|
@ -59,34 +67,7 @@ public class AllBuildTests extends TestCase {
|
|||
if (target.getName().equals("Test Root")) {
|
||||
testRoot = target;
|
||||
|
||||
// Tools
|
||||
ITool[] tools = testRoot.getTools();
|
||||
// Root Tool
|
||||
ITool rootTool = tools[0];
|
||||
assertEquals("Root Tool", rootTool.getName());
|
||||
// Options
|
||||
IOption[] options = rootTool.getOptions();
|
||||
assertEquals(2, options.length);
|
||||
assertEquals("Option in Top", options[0].getName());
|
||||
assertEquals("Option in Category", options[1].getName());
|
||||
// Option Categories
|
||||
IOptionCategory topCategory = rootTool.getTopOptionCategory();
|
||||
assertEquals("Root Tool", topCategory.getName());
|
||||
options = topCategory.getOptions(rootTool);
|
||||
assertEquals(1, options.length);
|
||||
assertEquals("Option in Top", options[0].getName());
|
||||
IOptionCategory[] categories = topCategory.getChildCategories();
|
||||
assertEquals(1, categories.length);
|
||||
assertEquals("Category", categories[0].getName());
|
||||
options = categories[0].getOptions(rootTool);
|
||||
assertEquals(1, options.length);
|
||||
assertEquals("Option in Category", options[0].getName());
|
||||
|
||||
// Configs
|
||||
IConfiguration[] configs = testRoot.getConfigurations();
|
||||
// Root Config
|
||||
IConfiguration rootConfig = configs[0];
|
||||
assertEquals("Root Config", rootConfig.getName());
|
||||
checkRootTarget(testRoot);
|
||||
|
||||
} else if (target.getName().equals("Test Sub")) {
|
||||
testSub = target;
|
||||
|
@ -105,8 +86,9 @@ public class AllBuildTests extends TestCase {
|
|||
// Root Config
|
||||
IConfiguration rootConfig = configs[0];
|
||||
assertEquals("Root Config", rootConfig.getName());
|
||||
assertEquals("Root Override Config", configs[1].getName());
|
||||
// Sub Config
|
||||
IConfiguration subConfig = configs[1];
|
||||
IConfiguration subConfig = configs[2];
|
||||
assertEquals("Sub Config", subConfig.getName());
|
||||
}
|
||||
}
|
||||
|
@ -114,4 +96,97 @@ public class AllBuildTests extends TestCase {
|
|||
assertNotNull(testRoot);
|
||||
assertNotNull(testSub);
|
||||
}
|
||||
|
||||
public void testProject() throws CoreException, BuildException {
|
||||
// Create new project
|
||||
IProject project = createProject("BuildTest");
|
||||
|
||||
assertEquals(0, ManagedBuildManager.getTargets(project).length);
|
||||
|
||||
// Find the base target definition
|
||||
ITarget targetDef = ManagedBuildManager.getTarget(project, "test.root");
|
||||
assertNotNull(targetDef);
|
||||
|
||||
// Create the target for our project
|
||||
ITarget newTarget = ManagedBuildManager.createTarget(project, targetDef);
|
||||
assertEquals(newTarget.getName(), targetDef.getName());
|
||||
assertFalse(newTarget.equals(targetDef));
|
||||
|
||||
ITarget[] targets = ManagedBuildManager.getTargets(project);
|
||||
assertEquals(1, targets.length);
|
||||
ITarget target = targets[0];
|
||||
assertEquals(target, newTarget);
|
||||
assertFalse(target.equals(targetDef));
|
||||
|
||||
checkRootTarget(target);
|
||||
|
||||
// Save, close, reopen and test again
|
||||
ManagedBuildManager.saveBuildInfo(project);
|
||||
project.close(null);
|
||||
ManagedBuildManager.removeBuildInfo(project);
|
||||
project.open(null);
|
||||
|
||||
targets = ManagedBuildManager.getTargets(project);
|
||||
assertEquals(1, targets.length);
|
||||
checkRootTarget(targets[0]);
|
||||
}
|
||||
|
||||
IProject createProject(String name) throws CoreException {
|
||||
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
|
||||
IProject project = root.getProject(name);
|
||||
if (!project.exists()) {
|
||||
project.create(null);
|
||||
} else {
|
||||
project.refreshLocal(IResource.DEPTH_INFINITE, null);
|
||||
}
|
||||
|
||||
if (!project.isOpen()) {
|
||||
project.open(null);
|
||||
}
|
||||
|
||||
//CCorePlugin.getDefault().convertProjectToC(project, null, CCorePlugin.PLUGIN_ID + ".make", true);
|
||||
|
||||
return project;
|
||||
}
|
||||
|
||||
private void checkRootTarget(ITarget target) {
|
||||
// Tools
|
||||
ITool[] tools = target.getTools();
|
||||
// Root Tool
|
||||
ITool rootTool = tools[0];
|
||||
assertEquals("Root Tool", rootTool.getName());
|
||||
// Options
|
||||
IOption[] options = rootTool.getOptions();
|
||||
assertEquals(2, options.length);
|
||||
assertEquals("Option in Top", options[0].getName());
|
||||
assertEquals("Option in Category", options[1].getName());
|
||||
// Option Categories
|
||||
IOptionCategory topCategory = rootTool.getTopOptionCategory();
|
||||
assertEquals("Root Tool", topCategory.getName());
|
||||
options = topCategory.getOptions(null);
|
||||
assertEquals(1, options.length);
|
||||
assertEquals("Option in Top", options[0].getName());
|
||||
IOptionCategory[] categories = topCategory.getChildCategories();
|
||||
assertEquals(1, categories.length);
|
||||
assertEquals("Category", categories[0].getName());
|
||||
options = categories[0].getOptions(null);
|
||||
assertEquals(1, options.length);
|
||||
assertEquals("Option in Category", options[0].getName());
|
||||
|
||||
// Configs
|
||||
IConfiguration[] configs = target.getConfigurations();
|
||||
// Root Config
|
||||
IConfiguration rootConfig = configs[0];
|
||||
assertEquals("Root Config", rootConfig.getName());
|
||||
// Tools
|
||||
tools = rootConfig.getTools();
|
||||
assertEquals(1, tools.length);
|
||||
assertEquals("Root Tool", tools[0].getName());
|
||||
// Root Override Config
|
||||
assertEquals("Root Override Config", configs[1].getName());
|
||||
tools = configs[1].getTools();
|
||||
assertTrue(tools[0] instanceof ToolReference);
|
||||
options = tools[0].getOptions();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -94,11 +94,8 @@
|
|||
</target>
|
||||
<target
|
||||
name="Test Root"
|
||||
isAbstract="false"
|
||||
id="test.root">
|
||||
<configuration
|
||||
name="Root Config"
|
||||
id="root.config">
|
||||
</configuration>
|
||||
<tool
|
||||
name="Root Tool"
|
||||
id="root.tool">
|
||||
|
@ -117,10 +114,26 @@
|
|||
id="childOption">
|
||||
</option>
|
||||
</tool>
|
||||
<configuration
|
||||
name="Root Config"
|
||||
id="root.config">
|
||||
</configuration>
|
||||
<configuration
|
||||
name="Root Override Config"
|
||||
id="root.override.config">
|
||||
<toolRef
|
||||
id="root.tool">
|
||||
<optionRef
|
||||
value="x"
|
||||
id="topOption">
|
||||
</optionRef>
|
||||
</toolRef>
|
||||
</configuration>
|
||||
</target>
|
||||
<target
|
||||
name="Test Sub"
|
||||
parent="test.root"
|
||||
isAbstract="false"
|
||||
id="test.sub">
|
||||
<configuration
|
||||
name="Sub Config"
|
||||
|
|
Loading…
Add table
Reference in a new issue