mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 22:52:11 +02:00
Apply Bill Hilliard's patch for adding resource specific custom build steps
This commit is contained in:
parent
d3db562481
commit
1eb10a46a0
13 changed files with 1159 additions and 90 deletions
|
@ -418,6 +418,39 @@
|
||||||
</documentation>
|
</documentation>
|
||||||
</annotation>
|
</annotation>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
<attribute name="rcbsApplicability">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
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.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
<simpleType>
|
||||||
|
<restriction base="string">
|
||||||
|
<enumeration value="before">
|
||||||
|
</enumeration>
|
||||||
|
<enumeration value="after">
|
||||||
|
</enumeration>
|
||||||
|
<enumeration value="override">
|
||||||
|
</enumeration>
|
||||||
|
<enumeration value="disable">
|
||||||
|
</enumeration>
|
||||||
|
</restriction>
|
||||||
|
</simpleType>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="toolsToInvoke" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
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.
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
</complexType>
|
</complexType>
|
||||||
</element>
|
</element>
|
||||||
|
|
||||||
|
|
|
@ -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_CONFIGURATION_ELEMENT_NAME = "resourceConfiguration"; //$NON-NLS-1$
|
||||||
public static final String RESOURCE_PATH = "resourcePath"; //$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 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
|
//TODO: Set name and ID in the constructors to be
|
||||||
// configuration-name#resource-path
|
// configuration-name#resource-path
|
||||||
|
@ -54,6 +64,30 @@ public interface IResourceConfiguration extends IBuildObject {
|
||||||
*/
|
*/
|
||||||
public String getResourcePath();
|
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.
|
* Sets the "excluded" flag for the resource.
|
||||||
* If <code>true</code>, the project resource identified by the resoursePath
|
* If <code>true</code>, the project resource identified by the resoursePath
|
||||||
|
@ -99,6 +133,13 @@ public interface IResourceConfiguration extends IBuildObject {
|
||||||
*/
|
*/
|
||||||
public ITool getTool(String id);
|
public ITool getTool(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the Tool from the Tool list and map
|
||||||
|
*
|
||||||
|
* @param Tool
|
||||||
|
*/
|
||||||
|
public void removeTool(ITool tool);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a <code>Tool</code> child for this resource configuration.
|
* Creates a <code>Tool</code> child for this resource configuration.
|
||||||
*
|
*
|
||||||
|
|
|
@ -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
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v0.5
|
* are made available under the terms of the Common Public License v0.5
|
||||||
* which accompanies this distribution, and is available at
|
* 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.Platform;
|
||||||
import org.eclipse.core.runtime.Plugin;
|
import org.eclipse.core.runtime.Plugin;
|
||||||
import org.osgi.framework.BundleContext;
|
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 {
|
public class ManagedBuilderCorePlugin extends Plugin {
|
||||||
|
@ -27,6 +32,10 @@ public class ManagedBuilderCorePlugin extends Plugin {
|
||||||
public static final String COMMANDLINEGEN_ID = "commandlineGenerator"; //$NON-NLS-1$
|
public static final String COMMANDLINEGEN_ID = "commandlineGenerator"; //$NON-NLS-1$
|
||||||
// The unique id for all managed make projects
|
// The unique id for all managed make projects
|
||||||
public static final String MANAGED_MAKE_PROJECT_ID = ManagedBuilderCorePlugin.getUniqueIdentifier() + ".managedMake"; //$NON-NLS-1$
|
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
|
* @param descriptor
|
||||||
|
@ -60,6 +69,31 @@ public class ManagedBuilderCorePlugin extends Plugin {
|
||||||
// Turn on logging for plugin when debugging
|
// Turn on logging for plugin when debugging
|
||||||
super.start(context);
|
super.start(context);
|
||||||
configurePluginDebugOptions();
|
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$
|
private static final String PATH_ENTRY = ManagedBuilderCorePlugin.getUniqueIdentifier() + "/debug/pathEntry"; //$NON-NLS-1$
|
||||||
|
|
|
@ -644,7 +644,9 @@ public class InputType extends BuildObject implements IInputType {
|
||||||
String[] paths = current.getPaths();
|
String[] paths = current.getPaths();
|
||||||
if (paths != null) {
|
if (paths != null) {
|
||||||
for (int i = 0; i < paths.length; i++) {
|
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();
|
String[] paths = current.getPaths();
|
||||||
if (paths != null) {
|
if (paths != null) {
|
||||||
for (int i = 0; i < paths.length; i++) {
|
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]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,8 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi
|
||||||
// Managed Build model attributes
|
// Managed Build model attributes
|
||||||
private String resPath;
|
private String resPath;
|
||||||
private Boolean isExcluded;
|
private Boolean isExcluded;
|
||||||
|
private Integer rcbsApplicability;
|
||||||
|
private String toolsToInvoke;
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
private boolean isExtensionResourceConfig = false;
|
private boolean isExtensionResourceConfig = false;
|
||||||
private boolean isDirty = false;
|
private boolean isDirty = false;
|
||||||
|
@ -124,6 +126,8 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi
|
||||||
resPath = path;
|
resPath = path;
|
||||||
isDirty = false;
|
isDirty = false;
|
||||||
isExcluded = new Boolean(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) {
|
if (cloneConfig.isExcluded != null) {
|
||||||
isExcluded = new Boolean(cloneConfig.isExcluded.booleanValue());
|
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
|
// Clone the resource configuration's tool children
|
||||||
if (cloneConfig.toolList != null) {
|
if (cloneConfig.toolList != null) {
|
||||||
Iterator iter = cloneConfig.getToolList().listIterator();
|
Iterator iter = cloneConfig.getToolList().listIterator();
|
||||||
|
@ -226,6 +236,20 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi
|
||||||
if (excludeStr != null){
|
if (excludeStr != null){
|
||||||
isExcluded = new Boolean("true".equals(excludeStr)); //$NON-NLS-1$
|
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)
|
/* (non-Javadoc)
|
||||||
|
@ -256,6 +280,25 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi
|
||||||
if (element.hasAttribute(IResourceConfiguration.RESOURCE_PATH)) {
|
if (element.hasAttribute(IResourceConfiguration.RESOURCE_PATH)) {
|
||||||
resPath = element.getAttribute(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);
|
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
|
// Serialize my children
|
||||||
List toolElements = getToolList();
|
List toolElements = getToolList();
|
||||||
Iterator iter = toolElements.listIterator();
|
Iterator iter = toolElements.listIterator();
|
||||||
|
@ -361,6 +430,16 @@ public class ResourceConfiguration extends BuildObject implements IResourceConfi
|
||||||
getToolMap().put(tool.getId(), tool);
|
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
|
* 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;
|
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)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.build.managed.IResourceConfiguration#setExclude()
|
* @see org.eclipse.cdt.core.build.managed.IResourceConfiguration#setExclude()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -559,7 +559,7 @@ public class MbsMacroSupplier implements IBuildMacroSupplier {
|
||||||
ITool buildTools[] = null;
|
ITool buildTools[] = null;
|
||||||
IResourceConfiguration rcCfg = cfg.getResourceConfiguration(inputPath.toOSString());
|
IResourceConfiguration rcCfg = cfg.getResourceConfiguration(inputPath.toOSString());
|
||||||
if(rcCfg != null)
|
if(rcCfg != null)
|
||||||
buildTools = rcCfg.getTools();
|
buildTools = rcCfg.getToolsToInvoke();
|
||||||
else
|
else
|
||||||
buildTools = cfg.getFilteredTools();
|
buildTools = cfg.getFilteredTools();
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ public class DefaultGCCDependencyCalculator implements IManagedDependencyGenerat
|
||||||
String outputPrefix = ""; //$NON-NLS-1$
|
String outputPrefix = ""; //$NON-NLS-1$
|
||||||
String outputFile = ""; //$NON-NLS-1$
|
String outputFile = ""; //$NON-NLS-1$
|
||||||
if( resConfig != null) {
|
if( resConfig != null) {
|
||||||
ITool[] tools = resConfig.getTools();
|
ITool[] tools = resConfig.getToolsToInvoke();
|
||||||
String cmd = tools[0].getToolCommand();
|
String cmd = tools[0].getToolCommand();
|
||||||
//try to resolve the build macros in the tool command
|
//try to resolve the build macros in the tool command
|
||||||
try{
|
try{
|
||||||
|
|
|
@ -202,17 +202,23 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
|
|
||||||
// Is this a resource we should even consider
|
// Is this a resource we should even consider
|
||||||
if (proxy.getType() == IResource.FILE) {
|
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();
|
IResource resource = proxy.requestResource();
|
||||||
String ext = resource.getFileExtension();
|
boolean willBuild = false;
|
||||||
if (info.buildsFileType(ext)) {
|
IResourceConfiguration resConfig = config.getResourceConfiguration(resource.getFullPath().toString());
|
||||||
// If this file resource is a generated resource, then it is uninteresting
|
if (resConfig != null) willBuild = true;
|
||||||
if (!generator.isGeneratedResource(resource)) {
|
if (!willBuild) {
|
||||||
// If this file resource is excluded from build, then it is uninteresting
|
String ext = resource.getFileExtension();
|
||||||
IResourceConfiguration resConfig = config.getResourceConfiguration(resource.getFullPath().toString());
|
if (info.buildsFileType(ext) &&
|
||||||
if ((resConfig == null) || (!(resConfig.isExcluded()))) {
|
// If this file resource is a generated resource, then it is uninteresting
|
||||||
generator.appendBuildSubdirectory(resource);
|
!generator.isGeneratedResource(resource)) {
|
||||||
}
|
willBuild = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (willBuild) {
|
||||||
|
if ((resConfig == null) || (!(resConfig.isExcluded()))) {
|
||||||
|
generator.appendBuildSubdirectory(resource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -567,7 +573,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator#getTopBuildDir()
|
* @see org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator#getBuildWorkingDir()
|
||||||
*/
|
*/
|
||||||
public IPath getBuildWorkingDir() {
|
public IPath getBuildWorkingDir() {
|
||||||
if (topBuildDir != null) {
|
if (topBuildDir != null) {
|
||||||
|
@ -1814,7 +1820,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
if( (resConfig != null) && (resConfig.isExcluded()) )
|
if( (resConfig != null) && (resConfig.isExcluded()) )
|
||||||
continue;
|
continue;
|
||||||
addFragmentMakefileEntriesForSource(buildVarToRuleStringMap, ruleBuffer,
|
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 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 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 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
|
* @param varName the build variable to add this invocation's outputs to
|
||||||
* if <code>null</code>, use the file extension to find the name
|
* if <code>null</code>, use the file extension to find the name
|
||||||
* @param generatedSource if <code>true</code>, this file was generated by another tool in the tool-chain
|
* @param generatedSource if <code>true</code>, this file was generated by another tool in the tool-chain
|
||||||
*/
|
*/
|
||||||
protected void addFragmentMakefileEntriesForSource (LinkedHashMap buildVarToRuleStringMap, StringBuffer ruleBuffer,
|
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
|
// Determine which tool, if any, builds files with this extension
|
||||||
String ext = sourceLocation.getFileExtension();
|
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<buildTools.length; j++) {
|
for (int j=0; j<buildTools.length; j++) {
|
||||||
if (buildTools[j].buildsFileType(ext)) {
|
if (buildTools[j].buildsFileType(ext)) {
|
||||||
toolFound = true;
|
if (tool == null) {
|
||||||
ITool tool = buildTools[j];
|
tool = buildTools[j];
|
||||||
|
}
|
||||||
// look for the extension in the map
|
// look for the extension in the map
|
||||||
StringBuffer bufferForExtension = new StringBuffer();
|
StringBuffer bufferForExtension = new StringBuffer();
|
||||||
if (varName == null) {
|
if (varName == null) {
|
||||||
|
@ -1865,58 +1882,78 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
}
|
}
|
||||||
if (!buildVarToRuleStringMap.containsKey(varName)) {
|
if (!buildVarToRuleStringMap.containsKey(varName)) {
|
||||||
// TODO - is this an error?
|
// TODO - is this an error?
|
||||||
continue;
|
} else {
|
||||||
}
|
// Add the resource name to the makefile line that adds resources to the build variable
|
||||||
// Add the resource name to the makefile line that adds resources to the build variable
|
addMacroAdditionFile(buildVarToRuleStringMap, varName, relativePath, sourceLocation, generatedSource);
|
||||||
addMacroAdditionFile(buildVarToRuleStringMap, varName, relativePath, sourceLocation, generatedSource);
|
|
||||||
|
|
||||||
// Generate the rule to build this source file
|
|
||||||
IInputType primaryInputType = tool.getPrimaryInputType();
|
|
||||||
IInputType inputType = tool.getInputType(ext);
|
|
||||||
if ((primaryInputType != null && !primaryInputType.getMultipleOfType()) ||
|
|
||||||
(inputType == null && !(tool == info.getToolFromOutputExtension(buildTargetExt)))) {
|
|
||||||
|
|
||||||
// Try to add the rule for the file
|
|
||||||
StringBuffer generatedDepFile = new StringBuffer();
|
|
||||||
Vector generatedOutputs = new Vector();
|
|
||||||
addRuleForSource(relativePath, ruleBuffer, resource, sourceLocation, generatedSource, generatedDepFile, generatedOutputs);
|
|
||||||
|
|
||||||
// If the rule generates a dependency file, add the file to the DEPS variable
|
|
||||||
if (generatedDepFile.length() > 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<generatedOutputs.size(); k++) {
|
|
||||||
IPath generatedOutput;
|
|
||||||
if (((IPath)generatedOutputs.get(k)).isAbsolute()) {
|
|
||||||
// TODO: Should we use relative paths when possible (e.g., see MbsMacroSupplier.calculateRelPath)
|
|
||||||
generatedOutput = (IPath)generatedOutputs.get(k);
|
|
||||||
} else {
|
|
||||||
generatedOutput = project.getLocation().append(getBuildWorkingDir()).append((IPath)generatedOutputs.get(k));
|
|
||||||
}
|
|
||||||
// If this file has an absolute path, then the generateOutputResource will not be correct
|
|
||||||
// because the file is not under the project. We use this resource in the calls to the dependency generator
|
|
||||||
IResource generateOutputResource = project.getFile(generatedOutput);
|
|
||||||
addFragmentMakefileEntriesForSource(buildVarToRuleStringMap, ruleBuffer,
|
|
||||||
folder, relativePath, generateOutputResource, generatedOutput, buildVariable, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!toolFound) {
|
|
||||||
|
if (tool != null) {
|
||||||
|
// Generate the rule to build this source file
|
||||||
|
IInputType primaryInputType = tool.getPrimaryInputType();
|
||||||
|
IInputType inputType = tool.getInputType(ext);
|
||||||
|
if ((primaryInputType != null && !primaryInputType.getMultipleOfType()) ||
|
||||||
|
(inputType == null && !(tool == info.getToolFromOutputExtension(buildTargetExt)))) {
|
||||||
|
|
||||||
|
// Try to add the rule for the file
|
||||||
|
StringBuffer generatedDepFile = new StringBuffer();
|
||||||
|
Vector generatedOutputs = new Vector();
|
||||||
|
addRuleForSource(relativePath, ruleBuffer, resource, sourceLocation, resConfig, generatedSource, generatedDepFile, generatedOutputs);
|
||||||
|
|
||||||
|
// If the rule generates a dependency file, add the file to the DEPS variable
|
||||||
|
if (generatedDepFile.length() > 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<buildTools.length; j++) {
|
||||||
|
if (buildTools[j].buildsFileType(firstExt)) {
|
||||||
|
String bV = buildTools[j].getPrimaryInputType().getBuildVariable();
|
||||||
|
if (bV.length() > 0) {
|
||||||
|
buildVariable = bV;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buildVariable = outType.getBuildVariable();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For support of pre-CDT 3.0 integrations.
|
||||||
|
buildVariable = OBJS_MACRO;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int k=0; k<generatedOutputs.size(); k++) {
|
||||||
|
IPath generatedOutput;
|
||||||
|
if (((IPath)generatedOutputs.get(k)).isAbsolute()) {
|
||||||
|
// TODO: Should we use relative paths when possible (e.g., see MbsMacroSupplier.calculateRelPath)
|
||||||
|
generatedOutput = (IPath)generatedOutputs.get(k);
|
||||||
|
} else {
|
||||||
|
generatedOutput = project.getLocation().append(getBuildWorkingDir()).append((IPath)generatedOutputs.get(k));
|
||||||
|
}
|
||||||
|
// If this file has an absolute path, then the generateOutputResource will not be correct
|
||||||
|
// because the file is not under the project. We use this resource in the calls to the dependency generator
|
||||||
|
IResource generateOutputResource = project.getFile(generatedOutput);
|
||||||
|
addFragmentMakefileEntriesForSource(buildVarToRuleStringMap, ruleBuffer,
|
||||||
|
folder, relativePath, generateOutputResource, generatedOutput, null, buildVariable, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// If this generated output is identified as a secondary output, add the file to the build variable
|
// If this generated output is identified as a secondary output, add the file to the build variable
|
||||||
if (varName != null) {
|
if (varName != null) {
|
||||||
IOutputType[] secondaryOutputs = config.getToolChain().getSecondaryOutputs();
|
IOutputType[] secondaryOutputs = config.getToolChain().getSecondaryOutputs();
|
||||||
|
@ -1961,26 +1998,23 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
* @param buffer buffer to populate with the build rule
|
* @param buffer buffer to populate with the build rule
|
||||||
* @param resource the source file for this invocation of the tool
|
* @param resource the source file for this invocation of the tool
|
||||||
* @param generatedSource <code>true</code> if the resource is a generated output
|
* @param generatedSource <code>true</code> 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
|
* @param generatedDepFile passed in as an empty string; append the dependency file name
|
||||||
* to it if one is generated by the rule
|
* to it if one is generated by the rule
|
||||||
* @param enumeratedOutputs vector of the filenames that are the output of this rule
|
* @param enumeratedOutputs vector of the filenames that are the output of this rule
|
||||||
*/
|
*/
|
||||||
protected void addRuleForSource(String relativePath, StringBuffer buffer, IResource resource,
|
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 fileName = sourceLocation.removeFileExtension().lastSegment();
|
||||||
String inputExtension = sourceLocation.getFileExtension();
|
String inputExtension = sourceLocation.getFileExtension();
|
||||||
String outputExtension = info.getOutputExtension(inputExtension);
|
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;
|
ITool tool;
|
||||||
if( resConfig != null) {
|
if( resConfig != null) {
|
||||||
ITool[] tools = resConfig.getTools();
|
ITool[] tools = resConfig.getToolsToInvoke();
|
||||||
tool = tools[0];
|
tool = tools[0];
|
||||||
} else {
|
} else {
|
||||||
tool = info.getToolFromInputExtension(inputExtension);
|
tool = info.getToolFromInputExtension(inputExtension);
|
||||||
|
@ -2130,8 +2164,19 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
// Other additional inputs
|
// Other additional inputs
|
||||||
// Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements
|
// Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements
|
||||||
IPath[] addlDepPaths = tool.getAdditionalDependencies();
|
IPath[] addlDepPaths = tool.getAdditionalDependencies();
|
||||||
for (int i=0; i<addlDepPaths.length; i++) {
|
for (int i=0; i<addlDepPaths.length; i++) {
|
||||||
buildRule += WHITESPACE + addlDepPaths[i].toString();
|
// Translate the path from project relative to
|
||||||
|
// build directory relative
|
||||||
|
IPath addlPath = addlDepPaths[i];
|
||||||
|
if (!(addlPath.toString().startsWith("$("))) { //$NON-NLS-1$
|
||||||
|
if (!addlPath.isAbsolute()) {
|
||||||
|
IPath tempPath = project.getLocation().append(addlPath);
|
||||||
|
if (tempPath != null) {
|
||||||
|
addlPath = calculateRelativePath(getTopBuildDir(), tempPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buildRule += WHITESPACE + addlPath.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// No duplicates in a makefile. If we already have this rule, return
|
// No duplicates in a makefile. If we already have this rule, return
|
||||||
|
@ -2169,7 +2214,18 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
// Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements
|
// Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements
|
||||||
IPath[] addlInputPaths = tool.getAdditionalResources();
|
IPath[] addlInputPaths = tool.getAdditionalResources();
|
||||||
for (int i=0; i<addlInputPaths.length; i++) {
|
for (int i=0; i<addlInputPaths.length; i++) {
|
||||||
inputs.add(addlDepPaths[i].toString());
|
// Translate the path from project relative to
|
||||||
|
// build directory relative
|
||||||
|
IPath addlPath = addlInputPaths[i];
|
||||||
|
if (!(addlPath.toString().startsWith("$("))) { //$NON-NLS-1$
|
||||||
|
if (!addlPath.isAbsolute()) {
|
||||||
|
IPath tempPath = project.getLocation().append(addlPath);
|
||||||
|
if (tempPath != null) {
|
||||||
|
addlPath = calculateRelativePath(getTopBuildDir(), tempPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputs.add(addlPath.toString());
|
||||||
}
|
}
|
||||||
// Call the command line generator
|
// Call the command line generator
|
||||||
IManagedCommandLineGenerator cmdLGen = tool.getCommandLineGenerator();
|
IManagedCommandLineGenerator cmdLGen = tool.getCommandLineGenerator();
|
||||||
|
@ -2193,7 +2249,18 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
// Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements
|
// Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements
|
||||||
IPath[] addlInputPaths = tool.getAdditionalResources();
|
IPath[] addlInputPaths = tool.getAdditionalResources();
|
||||||
for (int i=0; i<addlInputPaths.length; i++) {
|
for (int i=0; i<addlInputPaths.length; i++) {
|
||||||
inputs.add(addlDepPaths[i].toString());
|
// Translate the path from project relative to
|
||||||
|
// build directory relative
|
||||||
|
IPath addlPath = addlInputPaths[i];
|
||||||
|
if (!(addlPath.toString().startsWith("$("))) { //$NON-NLS-1$
|
||||||
|
if (!addlPath.isAbsolute()) {
|
||||||
|
IPath tempPath = project.getLocation().append(addlPath);
|
||||||
|
if (tempPath != null) {
|
||||||
|
addlPath = calculateRelativePath(getTopBuildDir(), tempPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputs.add(addlPath.toString());
|
||||||
}
|
}
|
||||||
// Call the command line generator
|
// Call the command line generator
|
||||||
cmdLInfo = info.generateToolCommandLineInfo( inputExtension, flags, outflag, outputPrefix,
|
cmdLInfo = info.generateToolCommandLineInfo( inputExtension, flags, outflag, outputPrefix,
|
||||||
|
@ -3270,4 +3337,43 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the configuration's top build directory
|
||||||
|
*/
|
||||||
|
public IPath getTopBuildDir() {
|
||||||
|
return project.getLocation().append(getBuildWorkingDir());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate a relative path given the full path to a folder and a file
|
||||||
|
*/
|
||||||
|
public IPath calculateRelativePath(IPath container, IPath contents){
|
||||||
|
IPath path = contents;
|
||||||
|
if(container.isPrefixOf(contents)){
|
||||||
|
path = contents.setDevice(null).removeFirstSegments(container.segmentCount());
|
||||||
|
} else {
|
||||||
|
String file = null;
|
||||||
|
container = container.addTrailingSeparator();
|
||||||
|
if(!contents.hasTrailingSeparator()){
|
||||||
|
file = contents.lastSegment();
|
||||||
|
contents = contents.removeLastSegments(1);
|
||||||
|
contents = contents.addTrailingSeparator();
|
||||||
|
}
|
||||||
|
|
||||||
|
IPath prefix = contents;
|
||||||
|
for(;prefix.segmentCount() > 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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -272,8 +272,20 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo {
|
||||||
String[] paths = addlInput.getPaths();
|
String[] paths = addlInput.getPaths();
|
||||||
if (paths != null) {
|
if (paths != null) {
|
||||||
for (int k = 0; k < paths.length; k++) {
|
for (int k = 0; k < paths.length; k++) {
|
||||||
myCommandInputs.add(paths[k]);
|
// Translate the path from project relative to
|
||||||
myEnumeratedInputs.add(paths[k]);
|
// 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();
|
String[] paths = addlInput.getPaths();
|
||||||
if (paths != null) {
|
if (paths != null) {
|
||||||
for (int k = 0; k < paths.length; k++) {
|
for (int k = 0; k < paths.length; k++) {
|
||||||
myCommandDependencies.add(paths[k]);
|
// Translate the path from project relative to
|
||||||
//myEnumeratedInputs.add(pathTokens[k]);
|
// 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.eclipse.ui.help.WorkbenchHelp;
|
||||||
public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
|
|
||||||
private ToolsSettingsBlock toolsSettingsBlock;
|
private ToolsSettingsBlock toolsSettingsBlock;
|
||||||
|
private ResourceCustomBuildStepBlock resCustomBuildStepBlock;
|
||||||
private BuildSettingsBlock buildSettingsBlock;
|
private BuildSettingsBlock buildSettingsBlock;
|
||||||
private BuildStepSettingsBlock buildStepSettingsBlock;
|
private BuildStepSettingsBlock buildStepSettingsBlock;
|
||||||
private ErrorParserBlock errParserBlock;
|
private ErrorParserBlock errParserBlock;
|
||||||
|
@ -81,6 +82,7 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
addTab(macrosBlock = new MacrosSetBlock((BuildPropertyPage) fParent));
|
addTab(macrosBlock = new MacrosSetBlock((BuildPropertyPage) fParent));
|
||||||
} else if (element instanceof IFile) {
|
} else if (element instanceof IFile) {
|
||||||
addTab(toolsSettingsBlock = new ToolsSettingsBlock((ResourceBuildPropertyPage) fParent, element));
|
addTab(toolsSettingsBlock = new ToolsSettingsBlock((ResourceBuildPropertyPage) fParent, element));
|
||||||
|
addTab(resCustomBuildStepBlock = new ResourceCustomBuildStepBlock((ResourceBuildPropertyPage) fParent));
|
||||||
} else if (element instanceof IWorkspace) {
|
} else if (element instanceof IWorkspace) {
|
||||||
addTab(environmentBlock = new EnvironmentSetBlock((BuildPreferencePage) fParent));
|
addTab(environmentBlock = new EnvironmentSetBlock((BuildPreferencePage) fParent));
|
||||||
addTab(macrosBlock = new MacrosSetBlock((BuildPreferencePage) fParent));
|
addTab(macrosBlock = new MacrosSetBlock((BuildPreferencePage) fParent));
|
||||||
|
@ -91,6 +93,10 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
return toolsSettingsBlock;
|
return toolsSettingsBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ResourceCustomBuildStepBlock getResourceCustomBuildStepBlock() {
|
||||||
|
return resCustomBuildStepBlock;
|
||||||
|
}
|
||||||
|
|
||||||
public BuildSettingsBlock getBuildSettingsBlock() {
|
public BuildSettingsBlock getBuildSettingsBlock() {
|
||||||
return buildSettingsBlock;
|
return buildSettingsBlock;
|
||||||
}
|
}
|
||||||
|
@ -135,6 +141,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
if (getToolsSettingsBlock()!= null) {
|
if (getToolsSettingsBlock()!= null) {
|
||||||
getToolsSettingsBlock().initializeValues();
|
getToolsSettingsBlock().initializeValues();
|
||||||
}
|
}
|
||||||
|
if (getResourceCustomBuildStepBlock()!= null) {
|
||||||
|
getResourceCustomBuildStepBlock().initializeValues();
|
||||||
|
}
|
||||||
if (getBuildSettingsBlock()!= null) {
|
if (getBuildSettingsBlock()!= null) {
|
||||||
getBuildSettingsBlock().initializeValues();
|
getBuildSettingsBlock().initializeValues();
|
||||||
}
|
}
|
||||||
|
@ -182,6 +191,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
if (getToolsSettingsBlock() != null) {
|
if (getToolsSettingsBlock() != null) {
|
||||||
getToolsSettingsBlock().updateValues();
|
getToolsSettingsBlock().updateValues();
|
||||||
}
|
}
|
||||||
|
if (getResourceCustomBuildStepBlock() != null) {
|
||||||
|
getResourceCustomBuildStepBlock().updateValues();
|
||||||
|
}
|
||||||
} else if(element instanceof IWorkspace) {
|
} else if(element instanceof IWorkspace) {
|
||||||
if(getCurrentPage() instanceof EnvironmentSetBlock) {
|
if(getCurrentPage() instanceof EnvironmentSetBlock) {
|
||||||
((EnvironmentSetBlock)getCurrentPage()).updateValues();
|
((EnvironmentSetBlock)getCurrentPage()).updateValues();
|
||||||
|
@ -220,6 +232,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
if (getToolsSettingsBlock() != null) {
|
if (getToolsSettingsBlock() != null) {
|
||||||
getToolsSettingsBlock().updateValues();
|
getToolsSettingsBlock().updateValues();
|
||||||
}
|
}
|
||||||
|
if (getResourceCustomBuildStepBlock() != null) {
|
||||||
|
getResourceCustomBuildStepBlock().setValues();
|
||||||
|
}
|
||||||
} else if (element instanceof IWorkspace) {
|
} else if (element instanceof IWorkspace) {
|
||||||
if(getCurrentPage() instanceof EnvironmentSetBlock) {
|
if(getCurrentPage() instanceof EnvironmentSetBlock) {
|
||||||
((EnvironmentSetBlock)getCurrentPage()).updateValues();
|
((EnvironmentSetBlock)getCurrentPage()).updateValues();
|
||||||
|
@ -257,6 +272,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
if (getToolsSettingsBlock()!= null) {
|
if (getToolsSettingsBlock()!= null) {
|
||||||
getToolsSettingsBlock().removeValues(id);
|
getToolsSettingsBlock().removeValues(id);
|
||||||
}
|
}
|
||||||
|
if (getResourceCustomBuildStepBlock() != null) {
|
||||||
|
getResourceCustomBuildStepBlock().removeValues(id);
|
||||||
|
}
|
||||||
} else if (element instanceof IWorkspace) {
|
} else if (element instanceof IWorkspace) {
|
||||||
if(getEnvironmentBlock()!= null) {
|
if(getEnvironmentBlock()!= null) {
|
||||||
}
|
}
|
||||||
|
@ -293,6 +311,9 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
if (getCurrentPage() instanceof ToolsSettingsBlock) {
|
if (getCurrentPage() instanceof ToolsSettingsBlock) {
|
||||||
return toolsSettingsBlock.getPreferenceStore();
|
return toolsSettingsBlock.getPreferenceStore();
|
||||||
}
|
}
|
||||||
|
if (getCurrentPage() instanceof ResourceCustomBuildStepBlock) {
|
||||||
|
return resCustomBuildStepBlock.getPreferenceStore();
|
||||||
|
}
|
||||||
} else if (element instanceof IWorkspace) {
|
} else if (element instanceof IWorkspace) {
|
||||||
if(getCurrentPage() instanceof EnvironmentSetBlock) {
|
if(getCurrentPage() instanceof EnvironmentSetBlock) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -344,6 +365,8 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
ICOptionPage tab = (ICOptionPage)iter.next();
|
ICOptionPage tab = (ICOptionPage)iter.next();
|
||||||
if (tab instanceof BuildSettingsBlock) {
|
if (tab instanceof BuildSettingsBlock) {
|
||||||
((BuildSettingsBlock)tab).setDirty(b);
|
((BuildSettingsBlock)tab).setDirty(b);
|
||||||
|
} else if (tab instanceof ResourceCustomBuildStepBlock) {
|
||||||
|
((ResourceCustomBuildStepBlock)tab).setDirty(b);
|
||||||
} else if (tab instanceof ToolsSettingsBlock) {
|
} else if (tab instanceof ToolsSettingsBlock) {
|
||||||
((ToolsSettingsBlock)tab).setDirty(b);
|
((ToolsSettingsBlock)tab).setDirty(b);
|
||||||
} else if (tab instanceof BuildStepSettingsBlock) {
|
} else if (tab instanceof BuildStepSettingsBlock) {
|
||||||
|
@ -370,6 +393,8 @@ public class ManagedBuildOptionBlock extends TabFolderOptionBlock {
|
||||||
ICOptionPage tab = (ICOptionPage)iter.next();
|
ICOptionPage tab = (ICOptionPage)iter.next();
|
||||||
if (tab instanceof BuildSettingsBlock) {
|
if (tab instanceof BuildSettingsBlock) {
|
||||||
if (((BuildSettingsBlock)tab).isDirty()) return true;
|
if (((BuildSettingsBlock)tab).isDirty()) return true;
|
||||||
|
} else if (tab instanceof ResourceCustomBuildStepBlock) {
|
||||||
|
if (((ResourceCustomBuildStepBlock)tab).isDirty()) return true;
|
||||||
} else if (tab instanceof ToolsSettingsBlock) {
|
} else if (tab instanceof ToolsSettingsBlock) {
|
||||||
if (((ToolsSettingsBlock)tab).isDirty()) return true;
|
if (((ToolsSettingsBlock)tab).isDirty()) return true;
|
||||||
} else if (tab instanceof BuildStepSettingsBlock) {
|
} else if (tab instanceof BuildStepSettingsBlock) {
|
||||||
|
|
|
@ -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.non.build=Managed Build settings for this resource are not available
|
||||||
ResourceBuildPropertyPage.rc.generated=The selected resource is created by the buildfile generator
|
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 -----------
|
# ----------- Entry Dialog -----------
|
||||||
BrowseEntryDialog.error.Folder_name_invalid = Folder name invalid
|
BrowseEntryDialog.error.Folder_name_invalid = Folder name invalid
|
||||||
BrowseEntryDialog.title.file = Select File
|
BrowseEntryDialog.title.file = Select File
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -164,7 +164,7 @@ public class ResourceBuildPropertyPage extends PropertyPage implements
|
||||||
IFile file = (IFile)getElement();
|
IFile file = (IFile)getElement();
|
||||||
if(isGeneratedResource(file))
|
if(isGeneratedResource(file))
|
||||||
error = ManagedBuilderUIMessages.getResourceString(MSG_RC_GENERATED);
|
error = ManagedBuilderUIMessages.getResourceString(MSG_RC_GENERATED);
|
||||||
else if(!isBuildResource(file))
|
else if(file.isDerived())
|
||||||
error = ManagedBuilderUIMessages.getResourceString(MSG_RC_NON_BUILD);
|
error = ManagedBuilderUIMessages.getResourceString(MSG_RC_NON_BUILD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,7 +386,7 @@ public class ResourceBuildPropertyPage extends PropertyPage implements
|
||||||
public boolean isBuildResource(IFile file, IConfiguration cfg){
|
public boolean isBuildResource(IFile file, IConfiguration cfg){
|
||||||
IResourceConfiguration rcCfg = cfg.getResourceConfiguration(file.getFullPath().toOSString());
|
IResourceConfiguration rcCfg = cfg.getResourceConfiguration(file.getFullPath().toOSString());
|
||||||
if(rcCfg != null){
|
if(rcCfg != null){
|
||||||
ITool tools[] = rcCfg.getTools();
|
ITool tools[] = rcCfg.getToolsToInvoke();
|
||||||
if(tools != null && tools.length > 0)
|
if(tools != null && tools.length > 0)
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue