diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/BuildException.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/BuildException.java new file mode 100644 index 00000000000..4ba6c708d71 --- /dev/null +++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/BuildException.java @@ -0,0 +1,21 @@ +/* + * Created on Apr 9, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package org.eclipse.cdt.core.build.managed; + +/** + * @author dschaefe + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class BuildException extends Exception { + + public BuildException(String msg) { + super(msg); + } + +} diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IConfiguration.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IConfiguration.java index baf60b73276..9fef24e56bf 100644 --- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IConfiguration.java +++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IConfiguration.java @@ -10,7 +10,7 @@ **********************************************************************/ package org.eclipse.cdt.core.build.managed; -import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; /** * @@ -31,11 +31,10 @@ public interface IConfiguration { public ITarget getTarget(); /** - * Returns the project owning this configuration - * or null if this configuration is not associated with a project. + * Returns the resource that owns the target that owns the configuration. * @return */ - public IProject getProject(); + public IResource getOwner(); /** * Returns the configuration from which this configuration inherits diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IOptionCategory.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IOptionCategory.java index 99f429c17ba..8d66327e806 100644 --- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IOptionCategory.java +++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IOptionCategory.java @@ -15,6 +15,13 @@ package org.eclipse.cdt.core.build.managed; */ public interface IOptionCategory { + /** + * Returns the name of the option category. + * + * @return + */ + public String getName(); + /** * Returns the options that have been assigned to this category. * @@ -29,4 +36,7 @@ public interface IOptionCategory { */ public IOptionCategory[] getChildCategories(); + public IOptionCategory getOwner(); + + public ITool getTool(); } diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ITarget.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ITarget.java index ab668de4683..eb4f682ac52 100644 --- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ITarget.java +++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ITarget.java @@ -10,7 +10,7 @@ **********************************************************************/ package org.eclipse.cdt.core.build.managed; -import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; /** * This class represents targets for the managed build process. A target @@ -32,6 +32,13 @@ public interface ITarget { */ public ITarget getParent(); + /** + * Gets the resource that this target is applied to. + * + * @return + */ + public IResource getOwner(); + /** * Returns the list of platform specific tools associated with this * platform. @@ -44,6 +51,24 @@ public interface ITarget { * Returns all of the configurations defined by this target. * @return */ - public IConfiguration[] getAvailableConfigurations(IProject project); + public IConfiguration[] getConfigurations(); + + /** + * Creates a new configuration for the given resource. + * + * @param resource + * @return + */ + public IConfiguration addConfiguration(IResource resource) + throws BuildException; + + /** + * Creates a new configuration for the given resource based on the parent config + * @param resource + * @param parentConfig + * @return + */ + public IConfiguration addConfiguration(IResource resource, IConfiguration parentConfig) + throws BuildException; } diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java index d5928218037..ec0c2fae021 100644 --- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java +++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java @@ -17,7 +17,6 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.internal.core.build.managed.Configuration; 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; @@ -32,84 +31,113 @@ import org.eclipse.core.runtime.QualifiedName; */ public class ManagedBuildManager { - private static final QualifiedName configProperty - = new QualifiedName(CCorePlugin.PLUGIN_ID, "config"); - + 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 ITarget[] emptyTargets = new ITarget[0]; + /** - * Returns the list of targets that are available to be used in - * conjunction with the given project. Generally this will include - * targets defined by extensions as well as targets defined by - * the project and all projects this project reference. + * Returns the list of targets that are defined by this project, + * projects referenced by this project, and by the extensions. * * @param project * @return */ - public static ITarget[] getTargets(IProject project) { + public static ITarget[] getDefinedTargets(IProject project) { // Make sure the extensions are loaded loadExtensions(); // 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) { + } + } + // Create the array and copy the elements over - ITarget[] targets = new ITarget[extensionTargets.size()]; + int size = extensionTargets.size() + + (definedTargets != null ? definedTargets.size() : 0); + + ITarget[] targets = new ITarget[size]; + int n = 0; for (int i = 0; i < extensionTargets.size(); ++i) - targets[i] = (ITarget)extensionTargets.get(i); - + targets[n++] = (ITarget)extensionTargets.get(i); + + if (definedTargets != null) + for (int i = 0; i < definedTargets.size(); ++i) + targets[n++] = (ITarget)definedTargets.get(i); + return targets; } /** - * Returns the list of configurations associated with the given project. + * Returns the targets owned by this project. If none are owned, + * an empty array is returned. * * @param project * @return */ - public static IConfiguration[] getConfigurations(IProject project) { - return getResourceConfigs(project); - } - - /** - * Returns the list of configurations associated with a given file. - * - * @param file - * @return - */ - public static IConfiguration[] getConfigurations(IFile file) { - // TODO not ready for prime time... - return getResourceConfigs(file); - } - - /** - * Adds a configuration containing the tools defined by the target to - * the given project. - * - * @param target - * @param project - * @return - */ - public static IConfiguration addConfiguration(IProject project, ITarget target) { - Configuration config = new Configuration(project, target); - return null; - } - - /** - * Adds a configuration inheriting from the given configuration. - * - * @param origConfig - * @param resource - * @return - */ - public static IConfiguration addConfiguration(IProject project, IConfiguration parentConfig) { - if (parentConfig.getProject() != null) - // Can only inherit from target configs - return null; + public static ITarget[] getTargets(IResource resource) { + List targets = getOwnedTargetsProperty(resource); - Configuration config = new Configuration(project, parentConfig); - addResourceConfig(project, config); - return config; + if (targets != null) { + return (ITarget[])targets.toArray(new ITarget[targets.size()]); + } else { + return emptyTargets; + } } + /** + * Adds a new target to the resource based on the parentTarget. + * + * @param resource + * @param parentTarget + * @return + * @throws BuildException + */ + public static ITarget addTarget(IResource resource, ITarget parentTarget) + throws BuildException + { + IResource owner = parentTarget.getOwner(); + + if (owner != null && owner.equals(resource)) + // Already added + return parentTarget; + + if (resource instanceof IProject) { + // Owner must be null + if (owner != null) + throw new BuildException("addTarget: owner not null"); + } else { + // Owner must be owned by the project containing this resource + if (owner == null) + throw new BuildException("addTarget: null owner"); + if (!owner.equals(resource.getProject())) + throw new BuildException("addTarget: owner not project"); + } + + // 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; + } + // Private stuff private static List extensionTargets; @@ -129,59 +157,29 @@ public class ManagedBuildManager { for (int j = 0; j < elements.length; ++j) { IConfigurationElement element = elements[j]; if (element.getName().equals("target")) { - Target target = new Target(element.getAttribute("name")); + Target target = new Target(null); + target.setName(element.getAttribute("name")); extensionTargets.add(target); - List configs = null; IConfigurationElement[] targetElements = element.getChildren(); for (int k = 0; k < targetElements.length; ++k) { IConfigurationElement targetElement = targetElements[k]; if (targetElement.getName().equals("tool")) { Tool tool = new Tool(targetElement.getAttribute("name"), target); } else if (targetElement.getName().equals("configuration")) { - if (configs == null) - configs = new ArrayList(); - configs.add(new Configuration(target)); + target.addConfiguration(new Configuration(target)); } } - - if (configs != null) { - IConfiguration[] configArray = new IConfiguration[configs.size()]; - configArray = (IConfiguration[])configs.toArray(configArray); - target.setConfigurations(configArray); - } } } } } - private static final IConfiguration[] emptyConfigs = new IConfiguration[0]; - - private static IConfiguration[] getResourceConfigs(IResource resource) { - IConfiguration[] configs = null; - + private static List getOwnedTargetsProperty(IResource resource) { try { - configs = (IConfiguration[])resource.getSessionProperty(configProperty); + return (List)resource.getSessionProperty(ownedTargetsProperty); } catch (CoreException e) { + return null; } - - return (configs != null) ? configs : emptyConfigs; } - - private static void addResourceConfig(IResource resource, IConfiguration config) { - IConfiguration[] configs = getResourceConfigs(resource); - - IConfiguration[] newConfigs = new IConfiguration[configs.length + 1]; - for (int i = 0; i < configs.length; ++i) - newConfigs[i] = configs[i]; - newConfigs[configs.length] = config; - - try { - resource.setSessionProperty(configProperty, newConfigs); - } catch (CoreException e) { - } - - // TODO save the config info to the project build file - } - } 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 42bfe0313c4..5835b12b698 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 @@ -15,7 +15,7 @@ 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.IProject; +import org.eclipse.core.resources.IResource; /** * @@ -24,7 +24,6 @@ public class Configuration implements IConfiguration { private String name; private ITarget target; - private IProject project; private IConfiguration parent; private List toolReference; @@ -32,13 +31,7 @@ public class Configuration implements IConfiguration { this.target = target; } - public Configuration(IProject project, ITarget target) { - this.project = project; - this.target = target; - } - - public Configuration(IProject project, IConfiguration parent) { - this.project = project; + public Configuration(IConfiguration parent) { this.parent = parent; } @@ -79,10 +72,10 @@ public class Configuration implements IConfiguration { } /* (non-Javadoc) - * @see org.eclipse.cdt.core.build.managed.IConfiguration#getProject() + * @see org.eclipse.cdt.core.build.managed.IConfiguration#getOwner() */ - public IProject getProject() { - return (project == null && parent != null) ? parent.getProject() : project; + public IResource getOwner() { + return getTarget().getOwner(); } } diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java index e54de59d0e2..300fade816d 100644 --- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java +++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java @@ -10,10 +10,16 @@ **********************************************************************/ 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.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; /** * @@ -21,21 +27,34 @@ import org.eclipse.core.resources.IProject; public class Target implements ITarget { private String name; - private Target parent; - private ITool[] tools; - private IConfiguration[] configurations; + private ITarget parent; + private IResource owner; + private List tools; + private List configurations; - public Target(String name) { - this.name = name; + public Target(IResource owner) { + this.owner = owner; } - public Target(String name, Target parent) { - this(name); + /** + * Resource is allowed to be null to represent a ISV target def. + * + * @param parent + */ + public Target(IResource owner, ITarget parent) { + this.owner = owner; this.parent = parent; + + // Inherit the configs from the parent + 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; + return (name == null && parent != null) ? parent.getName() : name; } public ITarget getParent() { @@ -46,21 +65,25 @@ public class Target implements ITarget { this.name = name; } + public IResource getOwner() { + return owner; + } + private int getNumTools() { - int n = (tools == null) ? 0 : tools.length; + int n = (tools == null) ? 0 : tools.size(); if (parent != null) - n += parent.getNumTools(); + n += ((Target)parent).getNumTools(); return n; } private int addToolsToArray(ITool[] toolArray, int start) { int n = start; if (parent != null) - n = parent.addToolsToArray(toolArray, start); + n = ((Target)parent).addToolsToArray(toolArray, start); if (tools != null) { - for (int i = 0; i < tools.length; ++i) - toolArray[n++] = (ITool)tools[i]; + for (int i = 0; i < tools.size(); ++i) + toolArray[n++] = (ITool)tools.get(i); } return n; @@ -72,17 +95,54 @@ public class Target implements ITarget { return toolArray; } - public void setTools(ITool[] tools) { - this.tools = tools; + public void addTool(ITool tool){ + if (tools == null) + tools = new ArrayList(); + tools.add(tool); } - public void setConfigurations(IConfiguration [] configurations) { - this.configurations = configurations; + public IConfiguration[] getConfigurations() { + return (IConfiguration[])configurations.toArray(new IConfiguration[configurations.size()]); + } + + public void addConfiguration(IConfiguration configuration) { + if (configurations == null) + configurations = new ArrayList(); + configurations.add(configuration); } - public IConfiguration[] getAvailableConfigurations(IProject project) { - // TODO Auto-generated method stub + /* (non-Javadoc) + * @see org.eclipse.cdt.core.build.managed.ITarget#addConfiguration(org.eclipse.core.resources.IResource) + */ + public IConfiguration addConfiguration(IResource resource) + throws BuildException + { + Target target = (Target)ManagedBuildManager.addTarget(resource, this); + IConfiguration config = new Configuration(target); + target.addConfiguration(config); return null; } + public IConfiguration addConfiguration(IResource resource, IConfiguration parentConfig) + throws BuildException + { + IResource parentOwner = parentConfig.getOwner(); + + if (resource instanceof IProject) { + // parent must be owned by the same project + if (!resource.equals(parentOwner)) + throw new BuildException("addConfiguration: parent must be in same project"); + } else { + // parent must be owned by the project + if (!resource.getProject().equals(parentOwner)) + throw new BuildException("addConfiguration: parent must be in owning project"); + } + + // Validation passed + Target target = (Target)ManagedBuildManager.addTarget(resource, this); + IConfiguration config = new Configuration(parentConfig); + target.addConfiguration(config); + return config; + } + } 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 262f7f212d4..b53451b2028 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 @@ -15,7 +15,6 @@ import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.cdt.core.build.managed.ITarget; -import org.eclipse.cdt.core.build.managed.ITool; import org.eclipse.cdt.core.build.managed.ManagedBuildManager; /** @@ -44,13 +43,19 @@ public class AllBuildTests extends TestCase { * defined in this plugin */ public void testExtensions() { + boolean testRootFound = false; + // Note secret null parameter which means just extensions - ITarget[] targets = ManagedBuildManager.getTargets(null); + ITarget[] targets = ManagedBuildManager.getDefinedTargets(null); - ITarget target = targets[0]; - assertEquals(target.getName(), "Linux"); - ITool[] tools = target.getTools(); - ITool tool = tools[0]; - assertEquals(tool.getName(), "Compiler"); + for (int i = 0; i < targets.length; ++i) { + ITarget target = targets[i]; + + if (target.getName().equals("Test Root")) { + testRootFound = true; + } + } + + assertTrue(testRootFound); } } diff --git a/core/org.eclipse.cdt.ui.tests/plugin.xml b/core/org.eclipse.cdt.ui.tests/plugin.xml index dc93b91ed01..ebc14a6db37 100644 --- a/core/org.eclipse.cdt.ui.tests/plugin.xml +++ b/core/org.eclipse.cdt.ui.tests/plugin.xml @@ -91,6 +91,10 @@ id="org.eclipse.cdt.ui.tests.tool.linux.ar"> + +