diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd index a309483eeab..f5b38ce889e 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd +++ b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd @@ -418,6 +418,39 @@ + + + + Identifies how the user desires to apply a resource custom build step: + 1. Apply rcbs tool before any other tools defined for the resource. + 2. Apply rcbs tool after any other tools defined for the resource. + 3. Apply rcbs tool overriding any other tools defined for the resource. + 4. Disable (don't apply) the rcbs tool. + + + + + + + + + + + + + + + + + + + Identifies which tools to invoke by a semicolon separated list of child tool ids. Applies as follows: + 1. Defaults to all tools in the order found + 2. Use specified ordered list of children to invoke + 3. If empty string, treat as if no resource configuration existed, i.e., use project level tool. + + + diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IResourceConfiguration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IResourceConfiguration.java index a26ba57a70b..9ae489ba75f 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IResourceConfiguration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IResourceConfiguration.java @@ -26,6 +26,16 @@ public interface IResourceConfiguration extends IBuildObject { public static final String RESOURCE_CONFIGURATION_ELEMENT_NAME = "resourceConfiguration"; //$NON-NLS-1$ public static final String RESOURCE_PATH = "resourcePath"; //$NON-NLS-1$ public static final String EXCLUDE = "exclude"; //$NON-NLS-1$ + public static final String RCBS_APPLICABILITY = "rcbsApplicability"; //$NON-NLS-1$ + public static final String TOOLS_TO_INVOKE = "toolsToInvoke"; //$NON-NLS-1$ + public static final String APPLY_RCBS_TOOL_AS_OVERRIDE = "override"; //$NON-NLS-1$ + public static final int KIND_APPLY_RCBS_TOOL_AS_OVERRIDE = 1; + public static final String APPLY_RCBS_TOOL_BEFORE = "before"; //$NON-NLS-1$ + public static final int KIND_APPLY_RCBS_TOOL_BEFORE = 2; + public static final String APPLY_RCBS_TOOL_AFTER = "after"; //$NON-NLS-1$ + public static final int KIND_APPLY_RCBS_TOOL_AFTER = 3; + public static final String DISABLE_RCBS_TOOL = "disable"; //$NON-NLS-1$ + public static final int KIND_DISABLE_RCBS_TOOL = 4; //TODO: Set name and ID in the constructors to be // configuration-name#resource-path @@ -54,6 +64,30 @@ public interface IResourceConfiguration extends IBuildObject { */ public String getResourcePath(); + /** + * Returns an integer constant representing the users desire for ordering the application of + * a resource custom build step tool. + * + * @return int + */ + public int getRcbsApplicability(); + + /** + * Returns the list of tools currently defined for the project resource that + * this element references. Updates the String attribute toolsToInvoke. + * + * @return String + */ + public ITool[] getToolsToInvoke(); + + /** + * Sets the new value representing the users desire for ordering the application of + * a resource custom build step tool. + * + * @param int + */ + public void setRcbsApplicability(int value); + /** * Sets the "excluded" flag for the resource. * If true, the project resource identified by the resoursePath @@ -99,6 +133,13 @@ public interface IResourceConfiguration extends IBuildObject { */ public ITool getTool(String id); + /** + * Removes the Tool from the Tool list and map + * + * @param Tool + */ + public void removeTool(ITool tool); + /** * Creates a Tool child for this resource configuration. * diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java index 3f5f96cb6eb..c88e226d496 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuilderCorePlugin.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2003, 2004 IBM Corporation and others. + * Copyright (c) 2003, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v0.5 * which accompanies this distribution, and is available at @@ -16,6 +16,11 @@ import org.eclipse.cdt.managedbuilder.internal.scannerconfig.ManagedBuildPathEnt import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.osgi.framework.BundleContext; +// NOTE: The code below is for tracking resource renaming and deleting. This is needed to keep +// ResourceConfiguration elements up to date. It may also be needed by AdditionalInput +// elements +//import org.eclipse.cdt.managedbuilder.internal.core.ResourceChangeHandler; +//import org.eclipse.core.resources.*; public class ManagedBuilderCorePlugin extends Plugin { @@ -27,6 +32,10 @@ public class ManagedBuilderCorePlugin extends Plugin { public static final String COMMANDLINEGEN_ID = "commandlineGenerator"; //$NON-NLS-1$ // The unique id for all managed make projects public static final String MANAGED_MAKE_PROJECT_ID = ManagedBuilderCorePlugin.getUniqueIdentifier() + ".managedMake"; //$NON-NLS-1$ + // NOTE: The code below is for tracking resource renaming and deleting. This is needed to keep + // ResourceConfiguration elements up to date. It may also be needed by AdditionalInput + // elements + //private static ResourceChangeHandler listener; /** * @param descriptor @@ -60,6 +69,31 @@ public class ManagedBuilderCorePlugin extends Plugin { // Turn on logging for plugin when debugging super.start(context); configurePluginDebugOptions(); + + // NOTE: The code below is for tracking resource renaming and deleting. This is needed to keep + // ResourceConfiguration elements up to date. It may also be needed by AdditionalInput + // elements + + // Set up a listener for resource change events + //listener = new ResourceChangeHandler(); + //ResourcesPlugin.getWorkspace().addResourceChangeListener( + // listener, IResourceChangeEvent.POST_CHANGE /*| IResourceChangeEvent.POST_BUILD*/); + //ISavedState lastState = + // ResourcesPlugin.getWorkspace().addSaveParticipant(plugin, listener); + //if (lastState != null) { + // lastState.processResourceChangeEvents(listener); + //} + + } + + /* (non-Javadoc) + * @see org.eclipse.core.runtime.Plugin#start(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + // NOTE: The code below is for tracking resource renaming and deleting. This is needed to keep + // ResourceConfiguration elements up to date. It may also be needed by AdditionalInput + // elements + //ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener); } private static final String PATH_ENTRY = ManagedBuilderCorePlugin.getUniqueIdentifier() + "/debug/pathEntry"; //$NON-NLS-1$ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java index 4b1f8094a1a..753f1fac141 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java @@ -644,7 +644,9 @@ public class InputType extends BuildObject implements IInputType { String[] paths = current.getPaths(); if (paths != null) { for (int i = 0; i < paths.length; i++) { - deps.add(Path.fromOSString(paths[i])); + if (paths[i].length() > 0) { + deps.add(Path.fromOSString(paths[i])); + } } } } @@ -666,7 +668,9 @@ public class InputType extends BuildObject implements IInputType { String[] paths = current.getPaths(); if (paths != null) { for (int i = 0; i < paths.length; i++) { - ins.add(Path.fromOSString(paths[i])); + if (paths[i].length() > 0) { + ins.add(Path.fromOSString(paths[i])); + } } } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java index 88e9731dadb..9122d805cd2 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java @@ -46,6 +46,8 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi // Managed Build model attributes private String resPath; private Boolean isExcluded; + private Integer rcbsApplicability; + private String toolsToInvoke; // Miscellaneous private boolean isExtensionResourceConfig = false; private boolean isDirty = false; @@ -124,6 +126,8 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi resPath = path; isDirty = false; isExcluded = new Boolean(false); + toolsToInvoke = EMPTY_STRING; + rcbsApplicability = new Integer(KIND_DISABLE_RCBS_TOOL); } /** @@ -148,7 +152,13 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi if (cloneConfig.isExcluded != null) { isExcluded = new Boolean(cloneConfig.isExcluded.booleanValue()); } - + if (cloneConfig.toolsToInvoke != null) { + toolsToInvoke = new String(cloneConfig.toolsToInvoke); + } + if (cloneConfig.rcbsApplicability != null) { + rcbsApplicability = new Integer(cloneConfig.rcbsApplicability.intValue()); + } + // Clone the resource configuration's tool children if (cloneConfig.toolList != null) { Iterator iter = cloneConfig.getToolList().listIterator(); @@ -226,6 +236,20 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi if (excludeStr != null){ isExcluded = new Boolean("true".equals(excludeStr)); //$NON-NLS-1$ } + // toolsToInvoke + toolsToInvoke = element.getAttribute(IResourceConfiguration.TOOLS_TO_INVOKE); + + // rcbsApplicability + String rcbsApplicabilityStr = element.getAttribute(IResourceConfiguration.RCBS_APPLICABILITY); + if (rcbsApplicabilityStr == null || rcbsApplicabilityStr.equals(DISABLE_RCBS_TOOL)) { + rcbsApplicability = new Integer(KIND_DISABLE_RCBS_TOOL); + } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_BEFORE)) { + rcbsApplicability = new Integer(KIND_APPLY_RCBS_TOOL_BEFORE); + } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AFTER)) { + rcbsApplicability = new Integer(KIND_APPLY_RCBS_TOOL_AFTER); + } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AS_OVERRIDE)) { + rcbsApplicability = new Integer(KIND_APPLY_RCBS_TOOL_AS_OVERRIDE); + } } /* (non-Javadoc) @@ -256,6 +280,25 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi if (element.hasAttribute(IResourceConfiguration.RESOURCE_PATH)) { resPath = element.getAttribute(IResourceConfiguration.RESOURCE_PATH); } + + // toolsToInvoke + if (element.hasAttribute(IResourceConfiguration.TOOLS_TO_INVOKE)) { + toolsToInvoke = element.getAttribute(IResourceConfiguration.TOOLS_TO_INVOKE); + } + + // rcbsApplicability + if (element.hasAttribute(IResourceConfiguration.RCBS_APPLICABILITY)) { + String rcbsApplicabilityStr = element.getAttribute(IResourceConfiguration.RCBS_APPLICABILITY); + if (rcbsApplicabilityStr == null || rcbsApplicabilityStr.equals(DISABLE_RCBS_TOOL)) { + rcbsApplicability = new Integer(KIND_DISABLE_RCBS_TOOL); + } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_BEFORE)) { + rcbsApplicability = new Integer(KIND_APPLY_RCBS_TOOL_BEFORE); + } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AFTER)) { + rcbsApplicability = new Integer(KIND_APPLY_RCBS_TOOL_AFTER); + } else if (rcbsApplicabilityStr.equals(APPLY_RCBS_TOOL_AS_OVERRIDE)) { + rcbsApplicability = new Integer(KIND_APPLY_RCBS_TOOL_AS_OVERRIDE); + } + } } /** @@ -280,6 +323,32 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi element.setAttribute(IResourceConfiguration.RESOURCE_PATH, resPath); } + if (toolsToInvoke != null) { + element.setAttribute(IResourceConfiguration.TOOLS_TO_INVOKE, toolsToInvoke); + } + + if (rcbsApplicability != null) { + String str; + switch (getRcbsApplicability()) { + case KIND_APPLY_RCBS_TOOL_BEFORE: + str = APPLY_RCBS_TOOL_BEFORE; + break; + case KIND_APPLY_RCBS_TOOL_AFTER: + str = APPLY_RCBS_TOOL_AFTER; + break; + case KIND_APPLY_RCBS_TOOL_AS_OVERRIDE: + str = APPLY_RCBS_TOOL_AS_OVERRIDE; + break; + case KIND_DISABLE_RCBS_TOOL: + str = DISABLE_RCBS_TOOL; + break; + default: + str = DISABLE_RCBS_TOOL; + break; + } + element.setAttribute(IResourceConfiguration.RCBS_APPLICABILITY, str); + } + // Serialize my children List toolElements = getToolList(); Iterator iter = toolElements.listIterator(); @@ -361,6 +430,16 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi getToolMap().put(tool.getId(), tool); } + /* (non-Javadoc) + * Removes the Tool from the Tool list and map + * + * @param Tool + */ + public void removeTool(ITool tool) { + getToolList().remove(tool); + getToolMap().remove(tool); + } + /* * M O D E L A T T R I B U T E A C C E S S O R S */ @@ -386,6 +465,180 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi return path; } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getRcbsApplicability() + */ + public int getRcbsApplicability() { + /* + * rcbsApplicability is an integer constant that represents how the user wants to + * order the application of a resource custom build step tool. + * Defaults to disable rcbs tool. + * Choices are before, after, or override other tools, or disable rcbs tool. + */ + if (rcbsApplicability == null) { + return KIND_DISABLE_RCBS_TOOL; + } + return rcbsApplicability.intValue(); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getToolsToInvoke() + */ + public ITool[] getToolsToInvoke() { + /* + * toolsToInvoke is an ordered list of tool ids for the currently defined tools in + * the resource configuration. + * Defaults to all tools in the order found. + * Modified by the presence of an rcbs tool and the currently assigned applicability of that tool. + * The attribute is implemented as a String of a semicolon separated list of tool ids. + * An empty string implies treat as if no resource configuration, i.e., use project level tool. + * This getter routine returns an ITool[] to consumers (i.e., the makefile generator). + */ + String t_ToolsToInvoke = EMPTY_STRING; + ITool[] resConfigTools; + ITool[] tools; + String id; + String rcbsToolId = EMPTY_STRING; + int len; + int j; + int rcbsToolIdx=-1; + resConfigTools = getTools(); + + /* + * Evaluate the tools currently defined in the resource configuration. + * Update the current state of the toolsToInvoke attribute. + * Build and return an ITool[] for consumers. + */ + + /* + * If no tools are currently defined, return a zero lengh array of ITool. + */ + if (resConfigTools.length == 0) { + toolsToInvoke = EMPTY_STRING; + tools = new ITool[0]; + return tools; + } + + /* + * See if there is an rcbs tool defined. There should only be one at most. + */ + for ( int i = 0; i < resConfigTools.length; i++ ){ + if (resConfigTools[i].getCustomBuildStep() && !resConfigTools[i].isExtensionElement()) { + rcbsToolId = resConfigTools[i].getId(); + rcbsToolIdx = i; + break; + } + } + if (!rcbsToolId.equals(EMPTY_STRING)){ + /* + * Here if an rcbs tool is defined. + * Apply the tools according to the current rcbsApplicability setting. + */ + switch(rcbsApplicability.intValue()){ + case KIND_APPLY_RCBS_TOOL_AS_OVERRIDE: + toolsToInvoke = rcbsToolId; + tools = new ITool[1]; + tools[0] = resConfigTools[rcbsToolIdx]; + break; + case KIND_APPLY_RCBS_TOOL_AFTER: + j = 0; + tools = new ITool[resConfigTools.length]; + for ( int i = 0; i < resConfigTools.length; i++ ){ + if (resConfigTools[i].getId() != rcbsToolId) { + t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ + tools[j++] = resConfigTools[i]; + } + } + t_ToolsToInvoke += rcbsToolId; + tools[j++] = resConfigTools[rcbsToolIdx]; + toolsToInvoke = t_ToolsToInvoke; + break; + case KIND_APPLY_RCBS_TOOL_BEFORE: + j = 0; + tools = new ITool[resConfigTools.length]; + t_ToolsToInvoke = rcbsToolId + ";"; //$NON-NLS-1$ + tools[j++] = resConfigTools[rcbsToolIdx]; + for ( int i = 0; i < resConfigTools.length; i++ ){ + if (resConfigTools[i].getId() != rcbsToolId) { + t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ + tools[j++] = resConfigTools[i]; + } + } + len = t_ToolsToInvoke.length(); + t_ToolsToInvoke = t_ToolsToInvoke.substring(0,len-1); + toolsToInvoke = t_ToolsToInvoke; + break; + case KIND_DISABLE_RCBS_TOOL: + /* + * If the rcbs tool is the only tool and the user has disabled it, + * there are no tools to invoke in the resource configuration. + */ + if(resConfigTools.length == 1){ + tools = new ITool[0]; + toolsToInvoke = EMPTY_STRING; + break; + } + j = 0; + tools = new ITool[resConfigTools.length-1]; + for ( int i = 0; i < resConfigTools.length; i++ ){ + if (resConfigTools[i].getId() != rcbsToolId) { + t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ + tools[j++] = resConfigTools[i]; + } + } + len = t_ToolsToInvoke.length(); + t_ToolsToInvoke = t_ToolsToInvoke.substring(0,len-1); + toolsToInvoke = t_ToolsToInvoke; + break; + default: + /* + * If we get an unexpected value, apply all tools in the order found. + */ + tools = new ITool[resConfigTools.length]; + for ( int i = 0; i < resConfigTools.length; i++ ){ + t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ + tools[i] = resConfigTools[i]; + } + len = t_ToolsToInvoke.length(); + t_ToolsToInvoke = t_ToolsToInvoke.substring(0,len-1); + toolsToInvoke = t_ToolsToInvoke; + break; + } + } + else { + /* + * Here if no rcbs tool is defined, but there are other tools in the resource configuration. + * Specify all tools in the order found. + */ + tools = new ITool[resConfigTools.length]; + for ( int i = 0; i < resConfigTools.length; i++ ){ + t_ToolsToInvoke += resConfigTools[i].getId() + ";"; //$NON-NLS-1$ + tools[i] = resConfigTools[i]; + } + len = t_ToolsToInvoke.length(); + t_ToolsToInvoke = t_ToolsToInvoke.substring(0,len-1); + toolsToInvoke = t_ToolsToInvoke; + } + return tools; + } + + + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IResourceConfiguration#getRcbsApplicability() + */ + public void setRcbsApplicability(int newValue) { + /* + * rcbsApplicability is an integer constant that represents how the user wants to + * order the application of a resource custom build step tool. + * Defaults to override all other tools. + * Choices are before, after, or override other tools, or disable rcbs tool. + */ + if (rcbsApplicability == null || !(rcbsApplicability.intValue() == newValue)) { + rcbsApplicability = new Integer(newValue); + isDirty = true; + } + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IResourceConfiguration#setExclude() */ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/macros/MbsMacroSupplier.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/macros/MbsMacroSupplier.java index 2fea7ee20a4..58b1f2b2695 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/macros/MbsMacroSupplier.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/macros/MbsMacroSupplier.java @@ -559,7 +559,7 @@ public class MbsMacroSupplier implements IBuildMacroSupplier { ITool buildTools[] = null; IResourceConfiguration rcCfg = cfg.getResourceConfiguration(inputPath.toOSString()); if(rcCfg != null) - buildTools = rcCfg.getTools(); + buildTools = rcCfg.getToolsToInvoke(); else buildTools = cfg.getFilteredTools(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java index d914272c940..0a91d25a821 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java @@ -114,7 +114,7 @@ public class DefaultGCCDependencyCalculator implements IManagedDependencyGenerat String outputPrefix = ""; //$NON-NLS-1$ String outputFile = ""; //$NON-NLS-1$ if( resConfig != null) { - ITool[] tools = resConfig.getTools(); + ITool[] tools = resConfig.getToolsToInvoke(); String cmd = tools[0].getToolCommand(); //try to resolve the build macros in the tool command try{ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java index c4d74d09f4a..1ee2a17d853 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java @@ -202,17 +202,23 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // Is this a resource we should even consider if (proxy.getType() == IResource.FILE) { - // Check extension to see if build model should build this file + // If this resource has a Resource Configuration and is not excluded or + // if it has a file extension that one of the tools builds, add the sudirectory to the list IResource resource = proxy.requestResource(); - String ext = resource.getFileExtension(); - if (info.buildsFileType(ext)) { - // If this file resource is a generated resource, then it is uninteresting - if (!generator.isGeneratedResource(resource)) { - // If this file resource is excluded from build, then it is uninteresting - IResourceConfiguration resConfig = config.getResourceConfiguration(resource.getFullPath().toString()); - if ((resConfig == null) || (!(resConfig.isExcluded()))) { - generator.appendBuildSubdirectory(resource); - } + boolean willBuild = false; + IResourceConfiguration resConfig = config.getResourceConfiguration(resource.getFullPath().toString()); + if (resConfig != null) willBuild = true; + if (!willBuild) { + String ext = resource.getFileExtension(); + if (info.buildsFileType(ext) && + // If this file resource is a generated resource, then it is uninteresting + !generator.isGeneratedResource(resource)) { + willBuild = true; + } + } + if (willBuild) { + if ((resConfig == null) || (!(resConfig.isExcluded()))) { + generator.appendBuildSubdirectory(resource); } } return false; @@ -567,7 +573,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } /* (non-Javadoc) - * @see org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator#getTopBuildDir() + * @see org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator#getBuildWorkingDir() */ public IPath getBuildWorkingDir() { if (topBuildDir != null) { @@ -1814,7 +1820,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { if( (resConfig != null) && (resConfig.isExcluded()) ) continue; addFragmentMakefileEntriesForSource(buildVarToRuleStringMap, ruleBuffer, - folder, relativePath, resource, resource.getLocation(), null, false); + folder, relativePath, resource, resource.getLocation(), resConfig, null, false); } } @@ -1832,19 +1838,30 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { * @param relativePath build output directory relative path of the current output directory * @param resource the source file for this invocation of the tool - this may be null for a generated output * @param sourceLocation the full path of the source + * @param resConfig the IResourceConfiguration associated with this file or null * @param varName the build variable to add this invocation's outputs to * if null, use the file extension to find the name * @param generatedSource if true, this file was generated by another tool in the tool-chain */ protected void addFragmentMakefileEntriesForSource (LinkedHashMap buildVarToRuleStringMap, StringBuffer ruleBuffer, - IFolder folder, String relativePath, IResource resource, IPath sourceLocation, String varName, boolean generatedSource) { + IFolder folder, String relativePath, IResource resource, IPath sourceLocation, IResourceConfiguration resConfig, + String varName, boolean generatedSource) { // Determine which tool, if any, builds files with this extension String ext = sourceLocation.getFileExtension(); - boolean toolFound = false; + ITool tool = null; + + // Use the tool from the resource configuration if there is one + if (resConfig != null) { + ITool[] tools = resConfig.getToolsToInvoke(); + if (tools != null && tools.length > 0) { + tool = tools[0]; + } + } for (int j=0; j 0) { - addMacroAdditionFile(buildVarToRuleStringMap, DEPS_MACRO, generatedDepFile.toString()); - } - - // If the generated outputs of this tool are input to another tool, - // 1. add the output to the appropriate macro - // 2. If the tool does not have multipleOfType input, generate the rule. - - IOutputType outType = tool.getPrimaryOutputType(); - String buildVariable = null; - if (outType != null) { - buildVariable = outType.getBuildVariable(); - } else { - // For support of pre-CDT 3.0 integrations. - buildVariable = OBJS_MACRO; - } - - for (int k=0; k 0) { + addMacroAdditionFile(buildVarToRuleStringMap, DEPS_MACRO, generatedDepFile.toString()); + } + + // If the generated outputs of this tool are input to another tool, + // 1. add the output to the appropriate macro + // 2. If the tool does not have multipleOfType input, generate the rule. + + IOutputType outType = tool.getPrimaryOutputType(); + String buildVariable = null; + if (outType != null) { + if (tool.getCustomBuildStep()) { + // TODO: This is somewhat of a hack since a custom build step + // tool does not currently define a build variable + if (generatedOutputs.size() > 0) { + IPath firstOutput = (IPath)generatedOutputs.get(0); + String firstExt = firstOutput.getFileExtension(); + for (int j=0; j 0) { + buildVariable = bV; + break; + } + } + } + } + } else { + buildVariable = outType.getBuildVariable(); + } + } else { + // For support of pre-CDT 3.0 integrations. + buildVariable = OBJS_MACRO; + } + + for (int k=0; ktrue if the resource is a generated output + * @param sourceLocation the full path of the source + * @param resConfig the IResourceConfiguration associated with this file or null * @param generatedDepFile passed in as an empty string; append the dependency file name * to it if one is generated by the rule * @param enumeratedOutputs vector of the filenames that are the output of this rule */ protected void addRuleForSource(String relativePath, StringBuffer buffer, IResource resource, - IPath sourceLocation, boolean generatedSource, StringBuffer generatedDepFile, Vector enumeratedOutputs) { + IPath sourceLocation, IResourceConfiguration resConfig, + boolean generatedSource, StringBuffer generatedDepFile, Vector enumeratedOutputs) { String fileName = sourceLocation.removeFileExtension().lastSegment(); String inputExtension = sourceLocation.getFileExtension(); String outputExtension = info.getOutputExtension(inputExtension); - // We need to check whether we have any resource specific build information. - IResourceConfiguration resConfig = null; - if( !generatedSource && config != null ) { - resConfig = config.getResourceConfiguration(resource.getFullPath().toString()); - } - ITool tool; if( resConfig != null) { - ITool[] tools = resConfig.getTools(); + ITool[] tools = resConfig.getToolsToInvoke(); tool = tools[0]; } else { tool = info.getToolFromInputExtension(inputExtension); @@ -2130,8 +2164,19 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // Other additional inputs // Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements IPath[] addlDepPaths = tool.getAdditionalDependencies(); - for (int i=0; i 0 && !prefix.isPrefixOf(container);prefix = prefix.removeLastSegments(1)){ + } + if(prefix.segmentCount() > 0){ + int diff = container.segmentCount() - prefix.segmentCount(); + StringBuffer buff = new StringBuffer(); + while(diff-- > 0) + buff.append("../"); //$NON-NLS-1$ + path = new Path(buff.toString()).append(contents.removeFirstSegments(prefix.segmentCount())); + if(file != null) + path = path.append(file); + } + } + return path; + } + } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java index bc75cfad967..ccdb97805cf 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java @@ -272,8 +272,20 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { String[] paths = addlInput.getPaths(); if (paths != null) { for (int k = 0; k < paths.length; k++) { - myCommandInputs.add(paths[k]); - myEnumeratedInputs.add(paths[k]); + // Translate the path from project relative to + // build directory relative + String path = paths[k]; + if (!(path.startsWith("$("))) { //$NON-NLS-1$ + IResource addlResource = project.getFile(path); + if (addlResource != null) { + IPath addlPath = addlResource.getLocation(); + if (addlPath != null) { + path = makeGen.calculateRelativePath(makeGen.getTopBuildDir(), addlPath).toString(); + } + } + } + myCommandInputs.add(path); + myEnumeratedInputs.add(path); } } } @@ -635,8 +647,20 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { String[] paths = addlInput.getPaths(); if (paths != null) { for (int k = 0; k < paths.length; k++) { - myCommandDependencies.add(paths[k]); - //myEnumeratedInputs.add(pathTokens[k]); + // Translate the path from project relative to + // build directory relative + String path = paths[k]; + if (!(path.startsWith("$("))) { //$NON-NLS-1$ + IResource addlResource = project.getFile(path); + if (addlResource != null) { + IPath addlPath = addlResource.getLocation(); + if (addlPath != null) { + path = makeGen.calculateRelativePath(makeGen.getTopBuildDir(), addlPath).toString(); + } + } + } + myCommandDependencies.add(path); + //myEnumeratedInputs.add(path); } } } diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ManagedBuildOptionBlock.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ManagedBuildOptionBlock.java index 8d96890f359..60e14510c37 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ManagedBuildOptionBlock.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ManagedBuildOptionBlock.java @@ -31,6 +31,7 @@ import org.eclipse.ui.help.WorkbenchHelp; public class ManagedBuildOptionBlock extends TabFolderOptionBlock { private ToolsSettingsBlock toolsSettingsBlock; + private ResourceCustomBuildStepBlock resCustomBuildStepBlock; private BuildSettingsBlock buildSettingsBlock; private BuildStepSettingsBlock buildStepSettingsBlock; private ErrorParserBlock errParserBlock; @@ -81,6 +82,7 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { addTab(macrosBlock = new MacrosSetBlock((BuildPropertyPage) fParent)); } else if (element instanceof IFile) { addTab(toolsSettingsBlock = new ToolsSettingsBlock((ResourceBuildPropertyPage) fParent, element)); + addTab(resCustomBuildStepBlock = new ResourceCustomBuildStepBlock((ResourceBuildPropertyPage) fParent)); } else if (element instanceof IWorkspace) { addTab(environmentBlock = new EnvironmentSetBlock((BuildPreferencePage) fParent)); addTab(macrosBlock = new MacrosSetBlock((BuildPreferencePage) fParent)); @@ -91,6 +93,10 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { return toolsSettingsBlock; } + public ResourceCustomBuildStepBlock getResourceCustomBuildStepBlock() { + return resCustomBuildStepBlock; + } + public BuildSettingsBlock getBuildSettingsBlock() { return buildSettingsBlock; } @@ -135,6 +141,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { if (getToolsSettingsBlock()!= null) { getToolsSettingsBlock().initializeValues(); } + if (getResourceCustomBuildStepBlock()!= null) { + getResourceCustomBuildStepBlock().initializeValues(); + } if (getBuildSettingsBlock()!= null) { getBuildSettingsBlock().initializeValues(); } @@ -182,6 +191,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { if (getToolsSettingsBlock() != null) { getToolsSettingsBlock().updateValues(); } + if (getResourceCustomBuildStepBlock() != null) { + getResourceCustomBuildStepBlock().updateValues(); + } } else if(element instanceof IWorkspace) { if(getCurrentPage() instanceof EnvironmentSetBlock) { ((EnvironmentSetBlock)getCurrentPage()).updateValues(); @@ -220,6 +232,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { if (getToolsSettingsBlock() != null) { getToolsSettingsBlock().updateValues(); } + if (getResourceCustomBuildStepBlock() != null) { + getResourceCustomBuildStepBlock().setValues(); + } } else if (element instanceof IWorkspace) { if(getCurrentPage() instanceof EnvironmentSetBlock) { ((EnvironmentSetBlock)getCurrentPage()).updateValues(); @@ -257,6 +272,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { if (getToolsSettingsBlock()!= null) { getToolsSettingsBlock().removeValues(id); } + if (getResourceCustomBuildStepBlock() != null) { + getResourceCustomBuildStepBlock().removeValues(id); + } } else if (element instanceof IWorkspace) { if(getEnvironmentBlock()!= null) { } @@ -293,6 +311,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { if (getCurrentPage() instanceof ToolsSettingsBlock) { return toolsSettingsBlock.getPreferenceStore(); } + if (getCurrentPage() instanceof ResourceCustomBuildStepBlock) { + return resCustomBuildStepBlock.getPreferenceStore(); + } } else if (element instanceof IWorkspace) { if(getCurrentPage() instanceof EnvironmentSetBlock) { return null; @@ -344,6 +365,8 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { ICOptionPage tab = (ICOptionPage)iter.next(); if (tab instanceof BuildSettingsBlock) { ((BuildSettingsBlock)tab).setDirty(b); + } else if (tab instanceof ResourceCustomBuildStepBlock) { + ((ResourceCustomBuildStepBlock)tab).setDirty(b); } else if (tab instanceof ToolsSettingsBlock) { ((ToolsSettingsBlock)tab).setDirty(b); } else if (tab instanceof BuildStepSettingsBlock) { @@ -370,6 +393,8 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock { ICOptionPage tab = (ICOptionPage)iter.next(); if (tab instanceof BuildSettingsBlock) { if (((BuildSettingsBlock)tab).isDirty()) return true; + } else if (tab instanceof ResourceCustomBuildStepBlock) { + if (((ResourceCustomBuildStepBlock)tab).isDirty()) return true; } else if (tab instanceof ToolsSettingsBlock) { if (((ToolsSettingsBlock)tab).isDirty()) return true; } else if (tab instanceof BuildStepSettingsBlock) { diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/PluginResources.properties b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/PluginResources.properties index 53059528da1..0ddc652d4d7 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/PluginResources.properties +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/PluginResources.properties @@ -221,6 +221,26 @@ ResourceBuildPropertyPage.config.notselected=No configurations selected ResourceBuildPropertyPage.rc.non.build=Managed Build settings for this resource are not available ResourceBuildPropertyPage.rc.generated=The selected resource is created by the buildfile generator +# ----------- Resource Custom Build Step Block ----------- +ResourceCustomBuildStepBlock.label.settings=Custom Build Steps +ResourceCustomBuildStepBlock.label.tool.group=Resource Custom Build Step +ResourceCustomBuildStepBlock.label.applicability=Custom Build Step Applicability +ResourceCustomBuildStepBlock.label.applicability.rule.before=Apply Custom Build Step Before Other Tools +ResourceCustomBuildStepBlock.label.applicability.rule.after=Apply Custom Build Step After Other Tools +ResourceCustomBuildStepBlock.label.applicability.rule.override=Apply Custom Build Step Overriding Other Tools +ResourceCustomBuildStepBlock.label.applicability.rule.disable=Disable Custom Build Step +ResourceCustomBuildStepBlock.label.input.filenames=Additional Input file name(s): +ResourceCustomBuildStepBlock.label.output.filenames=Output file name(s): +ResourceCustomBuildStepBlock.label.command.cmd=Command: +ResourceCustomBuildStepBlock.label.description.desc=Description: +ResourceCustomBuildStepBlock.tip.applicability=specifies how to apply the custom build step with respect to other resource configuration tools +ResourceCustomBuildStepBlock.tip.inputs=a semicolon separated list of additional input files for this build step. Paths are interpreted as relative to the Project directory. +ResourceCustomBuildStepBlock.tip.outputs=a semicolon separated list of the output files produced by this build step. Paths are interpreted as relative to the Build directory. +ResourceCustomBuildStepBlock.tip.command=a semicolon separated list of commands or a single command to be executed by this build step. Paths are interpreted as relative to the Build directory. +ResourceCustomBuildStepBlock.tip.announcement=a message to be output in the build log upon execution of this build step +ResourceCustomBuildStepBlock.defaults.title=Reset Resource Custom Build Step +ResourceCustomBuildStepBlock.defaults.message=This action will reset the resource custom build step to the default settings.\n\nDo you want to proceed? + # ----------- Entry Dialog ----------- BrowseEntryDialog.error.Folder_name_invalid = Folder name invalid BrowseEntryDialog.title.file = Select File diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ResourceCustomBuildStepBlock.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ResourceCustomBuildStepBlock.java new file mode 100644 index 00000000000..b3fde64ad5f --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ResourceCustomBuildStepBlock.java @@ -0,0 +1,529 @@ +/********************************************************************** + * Copyright (c) 2005 Intel Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Intel Corporation - Initial API and implementation + **********************************************************************/ +package org.eclipse.cdt.managedbuilder.internal.ui; + +import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage; +import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration; +import org.eclipse.cdt.managedbuilder.core.ITool; +import org.eclipse.cdt.managedbuilder.core.IInputType; +import org.eclipse.cdt.managedbuilder.core.IAdditionalInput; +import org.eclipse.cdt.managedbuilder.core.IOutputType; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.ui.properties.ResourceBuildPropertyPage; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.swt.SWT; +import org.eclipse.swt.accessibility.AccessibleAdapter; +import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Label; + + +public class ResourceCustomBuildStepBlock extends AbstractCOptionPage { + + /* + * String constants + */ + private static final String PREFIX = "ResourceCustomBuildStepBlock"; //$NON-NLS-1$ + private static final String TIP = PREFIX + ".tip"; //$NON-NLS-1$ + private static final String LABEL = PREFIX + ".label"; //$NON-NLS-1$ + private static final String SETTINGS_LABEL = LABEL + ".settings"; //$NON-NLS-1$ + private static final String RCBS_TOOL_GROUP = LABEL + ".tool.group"; //$NON-NLS-1$ + private static final String RCBS_APPLICABILITY = LABEL + ".applicability"; //$NON-NLS-1$ + private static final String RCBS_BEFORE = LABEL + ".applicability.rule.before"; //$NON-NLS-1$ + private static final String RCBS_AFTER = LABEL + ".applicability.rule.after"; //$NON-NLS-1$ + private static final String RCBS_OVERRIDE = LABEL + ".applicability.rule.override"; //$NON-NLS-1$ + private static final String RCBS_DISABLE = LABEL + ".applicability.rule.disable"; //$NON-NLS-1$ + private static final String INPUT_FILENAMES = LABEL + ".input.filenames"; //$NON-NLS-1$ + private static final String OUTPUT_FILENAMES = LABEL + ".output.filenames"; //$NON-NLS-1$ + private static final String COMMAND_CMD = LABEL + ".command.cmd"; //$NON-NLS-1$ + private static final String DESCRIPTION_DESC = LABEL + ".description.desc"; //$NON-NLS-1$ + private static final String APPLICABILITY_TIP = TIP + ".applicability"; //$NON-NLS-1$ + private static final String INPUTS_TIP = TIP + ".inputs"; //$NON-NLS-1$ + private static final String OUTPUTS_TIP = TIP + ".outputs"; //$NON-NLS-1$ + private static final String COMMAND_TIP = TIP + ".command"; //$NON-NLS-1$ + private static final String ANNOUNCEMENT_TIP = TIP + ".announcement"; //$NON-NLS-1$ + private static final String CONFIRM_DEFAULT_TITLE = PREFIX + ".defaults.title"; //$NON-NLS-1$ + private static final String CONFIRM_DEFAULT_MESSAGE = PREFIX + ".defaults.message"; //$NON-NLS-1$ + + /* + * TODO: Currently, the makefile generator code would need significant work to support + * the concept of ordering multiple tools. For CDT 3.0, we will implement the ability to + * apply a resource custom build tool as an override to other tools or to be disabled. + * When there is more time to enhance the makefile generator code, the RCBS_BEFORE and RCBS_AFTER + * entries in this array can be uncommented again. + */ + private static final String[] rcbsApplicabilityRules = { + new String(ManagedBuilderUIMessages.getResourceString(RCBS_OVERRIDE)), +// new String(ManagedBuilderUIMessages.getResourceString(RCBS_BEFORE)), +// new String(ManagedBuilderUIMessages.getResourceString(RCBS_AFTER)), + new String(ManagedBuilderUIMessages.getResourceString(RCBS_DISABLE)), + }; + private static final String EMPTY_STRING = new String(); + + private static final String rcbsToolId = new String("org.eclipse.cdt.managedbuilder.ui.rcbs"); //$NON-NLS-1$ + private static final String rcbsToolName = new String("Resource Custom Build Step"); //$NON-NLS-1$ + private static final String rcbsToolInputTypeId = new String("org.eclipse.cdt.managedbuilder.ui.rcbs.inputtype"); //$NON-NLS-1$ + private static final String rcbsToolInputTypeName = new String("Resource Custom Build Step Input Type"); //$NON-NLS-1$ + private static final String rcbsToolOutputTypeId = new String("org.eclipse.cdt.managedbuilder.ui.rcbs.outputtype"); //$NON-NLS-1$ + private static final String rcbsToolOutputTypeName = new String("Resource Custom Build Step Output Type"); //$NON-NLS-1$ + + /* + * Dialog widgets + */ + protected Combo rcbsApplicabilitySelector; + protected Text buildInputs; + protected Text buildOutputs; + protected Text buildCommand; + protected Text buildDescription; + + /* + * Bookeeping variables + */ + private ResourceBuildPropertyPage resParent; + private String resBuildInputs; + private String resBuildOutputs; + private String resBuildAnnouncement; + private String resBuildCommand; + // Has the page been changed? + private boolean dirty = false; + + private ModifyListener widgetModified = new ModifyListener() { + public void modifyText(ModifyEvent e) { + setDirty(true); + } + }; + + + /* + * Constructor + */ + public ResourceCustomBuildStepBlock(ResourceBuildPropertyPage resParent) + { + super(ManagedBuilderUIMessages.getResourceString(SETTINGS_LABEL)); + super.setContainer(resParent); + this.resParent = resParent; + } + + public void createControl(Composite resParent) { + Composite comp = new Composite(resParent, SWT.NULL); + comp.setFont(resParent.getFont()); + comp.setLayout(new GridLayout(1, true)); + comp.setLayoutData(new GridData(GridData.FILL_BOTH)); + setControl(comp); + + // Create a group to present the controls that make up the rcbs tool + final Group rcbsToolGroup = new Group(comp, SWT.NONE); + rcbsToolGroup.setFont(resParent.getFont()); + rcbsToolGroup.setText(ManagedBuilderUIMessages.getResourceString(RCBS_TOOL_GROUP)); + rcbsToolGroup.setLayout(new GridLayout(1, false)); + rcbsToolGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // Create a control for the rcbs Applicability combo and label + createRcbsApplicabilityControl(rcbsToolGroup); + + // Create controls for the rcbs Additional Build Input Files Text and Label + createBuildInputControl(rcbsToolGroup); + + // Create controls for the rcbs Additional Build Output Files Text and Label + createBuildOutputControl(rcbsToolGroup); + + // Create controls for the rcbs Build Command Text and Label + createBuildCommandControl(rcbsToolGroup); + + // Create controls for the rcbs Command Description (Announcement) Text and Label + createCommandDescriptionControl(rcbsToolGroup); + + } + + /* (non-Javadoc) + * Creates the group that contains the rcbs applicability combo. + */ + private void createRcbsApplicabilityControl(Group rcbsApplicabilityGroup) { + // One label + final Label applicabilityLabel = new Label(rcbsApplicabilityGroup, SWT.LEFT); + applicabilityLabel.setFont(rcbsApplicabilityGroup.getFont()); + applicabilityLabel.setText(ManagedBuilderUIMessages.getResourceString(RCBS_APPLICABILITY)); + applicabilityLabel.setToolTipText(ManagedBuilderUIMessages.getResourceString(APPLICABILITY_TIP)); + applicabilityLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + rcbsApplicabilitySelector = new Combo(rcbsApplicabilityGroup, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER); + rcbsApplicabilitySelector.setFont(rcbsApplicabilityGroup.getFont()); + rcbsApplicabilitySelector.setItems(rcbsApplicabilityRules); + int idx = rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_OVERRIDE)); + rcbsApplicabilitySelector.select(idx); + GridData gd1 = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL); + gd1.horizontalSpan = 1; + gd1.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; + rcbsApplicabilitySelector.setLayoutData(gd1); + } + + /* (non-Javadoc) + * Creates the controls for the rcbs additional build input file names text and label. + */ + private void createBuildInputControl(Group inputGroup) { + // One label + final Label inputLabel = new Label(inputGroup, SWT.LEFT); + inputLabel.setFont(inputGroup.getFont()); + inputLabel.setText(ManagedBuilderUIMessages.getResourceString(INPUT_FILENAMES)); + inputLabel.setToolTipText(ManagedBuilderUIMessages.getResourceString(INPUTS_TIP)); + inputLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // Now we need one text widget + buildInputs = new Text(inputGroup, SWT.SINGLE | SWT.BORDER); + buildInputs.setFont(inputGroup.getFont()); + GridData gd2 = new GridData(GridData.FILL_HORIZONTAL); + buildInputs.setLayoutData(gd2); + buildInputs.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent event) { + buildInputs = null; + } + }); + buildInputs.getAccessible().addAccessibleListener(new AccessibleAdapter(){ + public void getName(AccessibleEvent e) { + e.result = ManagedBuilderUIMessages.getResourceString(INPUT_FILENAMES); + } + }); + buildInputs.addModifyListener(widgetModified); + } + + /* (non-Javadoc) + * Creates the controls for the rcbs additional build output file names text and label. + */ + private void createBuildOutputControl(Group outputGroup) { + // One label + final Label outputLabel = new Label(outputGroup, SWT.LEFT); + outputLabel.setFont(outputGroup.getFont()); + outputLabel.setText(ManagedBuilderUIMessages.getResourceString(OUTPUT_FILENAMES)); + outputLabel.setToolTipText(ManagedBuilderUIMessages.getResourceString(OUTPUTS_TIP)); + outputLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // Now we need one text widget + buildOutputs = new Text(outputGroup, SWT.SINGLE | SWT.BORDER); + buildOutputs.setFont(outputGroup.getFont()); + GridData gd3 = new GridData(GridData.FILL_HORIZONTAL); + buildOutputs.setLayoutData(gd3); + buildOutputs.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent event) { + buildOutputs = null; + } + }); + buildOutputs.getAccessible().addAccessibleListener(new AccessibleAdapter(){ + public void getName(AccessibleEvent e) { + e.result = ManagedBuilderUIMessages.getResourceString(OUTPUT_FILENAMES); + } + }); + buildOutputs.addModifyListener(widgetModified); + } + + /* (non-Javadoc) + * Creates the controls for the rcbs build command text and label. + */ + private void createBuildCommandControl(Group commandGroup) { + // One label + final Label commandLabel = new Label(commandGroup, SWT.LEFT); + commandLabel.setFont(commandGroup.getFont()); + commandLabel.setText(ManagedBuilderUIMessages.getResourceString(COMMAND_CMD)); + commandLabel.setToolTipText(ManagedBuilderUIMessages.getResourceString(COMMAND_TIP)); + commandLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // Now we need one text widget + buildCommand = new Text(commandGroup, SWT.SINGLE | SWT.BORDER); + buildCommand.setFont(commandGroup.getFont()); + GridData gd4 = new GridData(GridData.FILL_HORIZONTAL); + buildCommand.setLayoutData(gd4); + buildCommand.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent event) { + buildCommand = null; + } + }); + buildCommand.getAccessible().addAccessibleListener(new AccessibleAdapter(){ + public void getName(AccessibleEvent e) { + e.result = ManagedBuilderUIMessages.getResourceString(COMMAND_CMD); + } + }); + buildCommand.addModifyListener(widgetModified); + } + + /* (non-Javadoc) + * Creates the controls for the rcbs build command description (announcement) text and label. + */ + private void createCommandDescriptionControl(Group descriptionGroup) { + // One label + final Label descriptionLabel = new Label(descriptionGroup, SWT.LEFT); + descriptionLabel.setFont(descriptionGroup.getFont()); + descriptionLabel.setText(ManagedBuilderUIMessages.getResourceString(DESCRIPTION_DESC)); + descriptionLabel.setToolTipText(ManagedBuilderUIMessages.getResourceString(ANNOUNCEMENT_TIP)); + descriptionLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + // Now we need one text widget + buildDescription = new Text(descriptionGroup, SWT.SINGLE | SWT.BORDER); + buildDescription.setFont(descriptionGroup.getFont()); + GridData gd5 = new GridData(GridData.FILL_HORIZONTAL); + buildDescription.setLayoutData(gd5); + buildDescription.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent event) { + buildDescription = null; + } + }); + buildDescription.getAccessible().addAccessibleListener(new AccessibleAdapter(){ + public void getName(AccessibleEvent e) { + e.result = ManagedBuilderUIMessages.getResourceString(DESCRIPTION_DESC); + } + }); + buildDescription.addModifyListener(widgetModified); + } + + protected void initializeValues() { + setValues(); + } + + public void updateValues() { + setValues(); + } + + protected void setValues() { + IResourceConfiguration resConfig; + String[] buildInputsPaths; + String[] buildOutputsPaths; + boolean foundRcbsTool = false; + int idx; + /* + * Examine the tools defined for the resource configuration. + * There should be at most one tool defined for a custom build step which was not an + * extension element (not defined by a tool integrator in a manifest). + * If the rcbs tool has been defined, set the field values from the defined tool. + * If the rcbs tool has not been defined yet, clear the field values. + * Finally, set the rcbsApplicability selector from the current value in the resource configuration. + */ + resConfig = resParent.getCurrentResourceConfig(); + ITool [] tools = resConfig.getTools(); + for (int i = 0; i < tools.length; i++) { + ITool tool = tools[i]; + if (tool.getCustomBuildStep() && !tool.isExtensionElement()) { + buildInputsPaths = tool.getInputTypes()[0].getAdditionalInputs()[0].getPaths(); + resBuildInputs = ""; //$NON-NLS-1$ + for ( int j = 0; j < buildInputsPaths.length; j++ ){ + resBuildInputs += buildInputsPaths[j] + ";"; //$NON-NLS-1$ + } + int len = resBuildInputs.length(); + resBuildInputs = resBuildInputs.substring(0,len-1); + buildInputs.setText(resBuildInputs); + + buildOutputsPaths = tool.getOutputTypes()[0].getOutputNames(); + resBuildOutputs = ""; //$NON-NLS-1$ + for ( int j = 0; j < buildOutputsPaths.length; j++ ){ + resBuildOutputs += buildOutputsPaths[j] + ";"; //$NON-NLS-1$ + } + len = resBuildOutputs.length(); + resBuildOutputs = resBuildOutputs.substring(0,len-1); + buildOutputs.setText(resBuildOutputs); + + resBuildCommand = tool.getToolCommand(); + buildCommand.setText(resBuildCommand); + + resBuildAnnouncement = tool.getAnnouncement(); + buildDescription.setText(resBuildAnnouncement); + + foundRcbsTool = true; + break; + } + } + + /* + * If an rcbs tool has not been created yet, just blank the fields. + */ + if(!foundRcbsTool) { + buildInputs.setText(""); //$NON-NLS-1$ + buildOutputs.setText(""); //$NON-NLS-1$ + buildCommand.setText(""); //$NON-NLS-1$ + buildDescription.setText(""); //$NON-NLS-1$ + } + + /* + * Set the state of the rcbs applicability selector. + */ + switch(resConfig.getRcbsApplicability()){ + case IResourceConfiguration.KIND_APPLY_RCBS_TOOL_AS_OVERRIDE: + idx = rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_OVERRIDE)); + break; + case IResourceConfiguration.KIND_APPLY_RCBS_TOOL_AFTER: + idx = rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_AFTER)); + break; + case IResourceConfiguration.KIND_APPLY_RCBS_TOOL_BEFORE: + idx = rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_BEFORE)); + break; + case IResourceConfiguration.KIND_DISABLE_RCBS_TOOL: + idx = rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_DISABLE)); + break; + default: + /* + * If we get an unexpected value, use the normal default of override. + */ + idx = rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_OVERRIDE)); + break; + } + rcbsApplicabilitySelector.select(idx); + + setDirty(false); + } + + public void removeValues(String id) { + // Nothing to do... + } + + /* + * (non-Javadoc) + * @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults() + */ + public void performDefaults() { + IResourceConfiguration resConfig; + + // Display a "Confirm" dialog box, since: + // 1. The defaults are immediately applied + // 2. The action cannot be undone + Shell shell = ManagedBuilderUIPlugin.getDefault().getShell(); + boolean shouldDefault = MessageDialog.openConfirm(shell, + ManagedBuilderUIMessages.getResourceString(CONFIRM_DEFAULT_TITLE), + ManagedBuilderUIMessages.getResourceString(CONFIRM_DEFAULT_MESSAGE)); + if (!shouldDefault) return; + + /* + * Examine the tools defined for the resource configuration. + * There should be at most one tool defined for a custom build step which was not an + * extension element (not defined by a tool integrator in a manifest). + * If the rcbs tool has been defined, remove the tool from the resource configuration. + * Set the rcbsApplicability in the resource configuration to "disabled" by default. + * Update the field values. + */ + resConfig = resParent.getCurrentResourceConfig(); + ITool [] tools = resConfig.getTools(); + for (int i = 0; i < tools.length; i++) { + ITool tool = tools[i]; + if (tool.getCustomBuildStep() && !tool.isExtensionElement()) { + resConfig.removeTool(tool); + break; + } + } + resConfig.setRcbsApplicability(IResourceConfiguration.KIND_DISABLE_RCBS_TOOL); + setValues(); + setDirty(false); + } + + /* + * (non-Javadoc) + * @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(IProgressMonitor) + */ + public void performApply(IProgressMonitor monitor) throws CoreException { + IResourceConfiguration resConfig; + boolean foundRcbsTool = false; + int idx; + + /* + * Gather the users input. + * Examine the tools defined for the resource configuration. + * There should be at most one tool defined for a custom build step which was not an + * extension element (not defined by a tool integrator in a manifest). + * If the rcbs tool has been defined, set the tool values from the user supplied values. + * If the rcbs tool has not been defined yet, create the tool and set the tool values. + * No validity checking of the users input is performed. The user is responsible for providing + * proper input. + * Finally, set the rcbsApplicability attribute in the resource configuration according to the user's + * selection. + */ + + resBuildInputs = buildInputs.getText().trim(); + resBuildOutputs = buildOutputs.getText().trim(); + resBuildCommand = buildCommand.getText().trim(); + resBuildAnnouncement = buildDescription.getText().trim(); + + resConfig = resParent.getCurrentResourceConfig(); + ITool [] tools = resConfig.getTools(); + for (int i = 0; i < tools.length; i++) { + ITool tool = tools[i]; + if (tool.getCustomBuildStep() && !tool.isExtensionElement()) { + tool.getInputTypes()[0].getAdditionalInputs()[0].setPaths(resBuildInputs); + tool.getOutputTypes()[0].setOutputNames(resBuildOutputs); + tool.setToolCommand(resBuildCommand); + tool.setAnnouncement(resBuildAnnouncement); + foundRcbsTool = true; + break; + } + } + if(!foundRcbsTool) { + ITool rcbsTool; + IInputType rcbsToolInputType; + IAdditionalInput rcbsToolInputTypeAdditionalInput; + IOutputType rcbsToolOutputType; + + rcbsTool = resConfig.createTool(null,rcbsToolId + "." + ManagedBuildManager.getRandomNumber(),rcbsToolName,false); //$NON-NLS-1$ + rcbsToolInputType = rcbsTool.createInputType(null,rcbsToolInputTypeId + "." + ManagedBuildManager.getRandomNumber(),rcbsToolInputTypeName,false); //$NON-NLS-1$ + rcbsToolInputTypeAdditionalInput = rcbsToolInputType.createAdditionalInput(resBuildInputs); + rcbsToolInputTypeAdditionalInput.setKind(IAdditionalInput.KIND_ADDITIONAL_INPUT_DEPENDENCY); + rcbsToolOutputType = rcbsTool.createOutputType(null,rcbsToolOutputTypeId + "." + ManagedBuildManager.getRandomNumber(),rcbsToolOutputTypeName,false); //$NON-NLS-1$ + rcbsToolOutputType.setOutputNames(resBuildOutputs); + rcbsTool.setCustomBuildStep(true); + rcbsTool.setToolCommand(resBuildCommand); + rcbsTool.setAnnouncement(resBuildAnnouncement); + } + + /* + * Get the state of the rcbs applicability selector and set the rcbsApplicability attribute in the + * resource configuration. + */ + idx = rcbsApplicabilitySelector.getSelectionIndex(); + if(idx == rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_AFTER))) { + resConfig.setRcbsApplicability(IResourceConfiguration.KIND_APPLY_RCBS_TOOL_AFTER); + } else + if(idx == rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_BEFORE))) { + resConfig.setRcbsApplicability(IResourceConfiguration.KIND_APPLY_RCBS_TOOL_BEFORE); + } else + if (idx == rcbsApplicabilitySelector.indexOf(ManagedBuilderUIMessages.getResourceString(RCBS_DISABLE))) { + resConfig.setRcbsApplicability(IResourceConfiguration.KIND_DISABLE_RCBS_TOOL); + } else { + resConfig.setRcbsApplicability(IResourceConfiguration.KIND_APPLY_RCBS_TOOL_AS_OVERRIDE); + } + + setDirty(false); + } + + public IPreferenceStore getPreferenceStore() { + return null; + } + + /* + * Sets the "dirty" state + */ + public void setDirty(boolean b) { + dirty = b; + } + + /* + * Returns the "dirty" state + */ + public boolean isDirty() { + return dirty; + } + +} diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ResourceBuildPropertyPage.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ResourceBuildPropertyPage.java index 1a8ddb41665..068af2e1bca 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ResourceBuildPropertyPage.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/ResourceBuildPropertyPage.java @@ -164,7 +164,7 @@ public class ResourceBuildPropertyPage extends PropertyPage implements IFile file = (IFile)getElement(); if(isGeneratedResource(file)) error = ManagedBuilderUIMessages.getResourceString(MSG_RC_GENERATED); - else if(!isBuildResource(file)) + else if(file.isDerived()) error = ManagedBuilderUIMessages.getResourceString(MSG_RC_NON_BUILD); } @@ -386,7 +386,7 @@ public class ResourceBuildPropertyPage extends PropertyPage implements public boolean isBuildResource(IFile file, IConfiguration cfg){ IResourceConfiguration rcCfg = cfg.getResourceConfiguration(file.getFullPath().toOSString()); if(rcCfg != null){ - ITool tools[] = rcCfg.getTools(); + ITool tools[] = rcCfg.getToolsToInvoke(); if(tools != null && tools.length > 0) return true; } else {