Applied.
Thanks,
Leo
From:
cdt-patch-bounces@xxxxxxxxxxx [mailto:cdt-patch-bounces@xxxxxxxxxxx] On Behalf Of Monteleone, Robert
Sent: Thursday, April 14, 2005
1:52 PM
To: cdt-patch@xxxxxxxxxxx
Subject: [cdt-patch] Discrete
Custom Build Step core support patch
This
is a patch which implements the "core" of the Discrete Custom Build
Support, i.e.
"pre-build"
and "post-build" functionality, in the Managed Build System as
described in the
Custom
Build Step documentation:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=88922.
The
user interface support for this functionality is forthcoming.
Bob Monteleone
Intel Corporation
Nashua Software Lab
603-886-7665
Index: schema/buildDefinitions.exsd
===================================================================
RCS
file:
/home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd,v
retrieving
revision 1.4
diff
-u -r1.4 buildDefinitions.exsd
---
schema/buildDefinitions.exsd 18 Feb
2005 19:35:32 -0000 1.4
+++
schema/buildDefinitions.exsd 11 Apr
2005 19:47:49 -0000
@@
-188,6 +188,34 @@
</documentation>
</annotation>
</attribute>
+
<attribute name="prebuildStep" type="string">
+
<annotation>
+
<documentation>
+
Specifies the pre-build command, which runs prior to the standard MBS build.
+
</documentation>
+
</annotation>
+
</attribute>
+
<attribute name="postbuildStep" type="string">
+
<annotation>
+
<documentation>
+
Specifies the post-build command, which runs after the standard MBS build.
+
</documentation>
+
</annotation>
+
</attribute>
+
<attribute
name="preannouncebuildStep" type="string">
+
<annotation>
+
<documentation>
+
Specifies the string to be displayed when the pre-build command step is run.
+
</documentation>
+
</annotation>
+
</attribute>
+
<attribute name="postannouncebuildStep" type="string">
+
<annotation>
+
<documentation>
+
Specifies the string to be displayed when the post-build command step is run.
+
</documentation>
+
</annotation>
+
</attribute>
</complexType>
</element>
Index:
src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java
===================================================================
RCS
file: /home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java,v
retrieving revision 1.10
diff
-u -r1.10 IConfiguration.java
---
src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java 28 Oct 2004
17:16:53 -0000 1.10
+++
src/org/eclipse/cdt/managedbuilder/core/IConfiguration.java 11 Apr 2005
19:47:49 -0000
@@
-28,6 +28,10 @@
public
interface IConfiguration extends IBuildObject {
public static final String ARTIFACT_NAME =
"artifactName"; //$NON-NLS-1$
public static final String CLEAN_COMMAND =
"cleanCommand"; //$NON-NLS-1$
+
public static final String PREBUILD_STEP =
"prebuildStep"; //$NON-NLS-1$
+
public static final String POSTBUILD_STEP =
"postbuildStep"; //$NON-NLS-1$
+
public static final String PREANNOUNCEBUILD_STEP =
"preannouncebuildStep";
//$NON-NLS-1$
+
public static final String POSTANNOUNCEBUILD_STEP =
"postannouncebuildStep"; //$NON-NLS-1$
// Schema element names
public static final String CONFIGURATION_ELEMENT_NAME =
"configuration";
//$NON-NLS-1$
public static final String ERROR_PARSERS =
"errorParsers"; //$NON-NLS-1$
@@
-83,6 +87,34 @@
public String getBuildCommand();
/**
+
* Returns the prebuild step from this configuration's builder
+
*
+
* @return String
+
*/
+
public String getPrebuildStep();
+
+
/**
+
* Returns the postbuild step from this configuration's builder
+
*
+
* @return String
+
*/
+
public String getPostbuildStep();
+
+
/**
+
* Returns the display string associated with the prebuild step from this
configuration's builder
+
*
+
* @return String
+
*/
+
public String getPreannouncebuildStep();
+
+
/**
+
* Returns the display string associated with the postbuild step from this
configuration's builder
+
*
+
* @return String
+
*/
+
public String getPostannouncebuildStep();
+
+
/**
* Answers the OS-specific command to remove files created by the build
* of this configuration.
*
@@
-266,6 +298,34 @@
public void setBuildCommand(String command);
/**
+
* Sets the prebuild step for the receiver to the value in the argument.
+
*
+
* @param step
+
*/
+
public void setPrebuildStep(String step);
+
+
/**
+
* Sets the postbuild step for the receiver to the value in the argument.
+
*
+
* @param step
+
*/
+
public void setPostbuildStep(String step);
+
+
/**
+
* Sets the prebuild step display string for the receiver to the value in the
argument.
+
*
+
* @param announceStep
+
*/
+
public void setPreannouncebuildStep(String announceStep);
+
+
/**
+
* Sets the postbuild step display string for the receiver to the value in the
argument.
+
*
+
* @param announceStep
+
*/
+
public void setPostannouncebuildStep(String announceStep);
+
+
/**
* Sets the command used to clean the outputs of this configuration.
*
* @param name
Index:
src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java
===================================================================
RCS
file: /home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java,v
retrieving revision 1.15
diff
-u -r1.15 IManagedBuildInfo.java
---
src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java
8 Nov 2004 20:12:37 -0000 1.15
+++
src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java
11 Apr 2005 19:47:50 -0000
@@
-97,6 +97,33 @@
public String getBuildCommand();
/**
+
* Answers the prebuild step for the default configuration
+
*
+
* @return String
+
*/
+
public String getPrebuildStep();
+
+
/**
+
* Answers the postbuild step for the default configuration
+
*
+
* @return String
+
*/
+
public String getPostbuildStep();
+
+
/**
+
* Answers the display string associated with the prebuild step for the default
configuration
+
*
+
* @return String
+
*/
+
public String getPreannouncebuildStep();
+
+
/**
+
* Answers the display string associated with the postbuild step for the default
configuration
+
*
+
* @return String
+
*/
+
public String getPostannouncebuildStep();
+
/**
* Answers the command needed to remove files on the build machine
*
* @return
Index:
src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java
===================================================================
RCS
file:
/home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java,v
retrieving revision 1.21
diff
-u -r1.21 Configuration.java
---
src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java 15 Nov 2004
19:33:07 -0000 1.21
+++
src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java 11 Apr 2005
19:47:52 -0000
@@
-60,6 +60,10 @@
private String cleanCommand;
private String artifactExtension;
private String errorParserIds;
+
private String prebuildStep;
+
private String postbuildStep;
+
private String preannouncebuildStep;
+
private String postannouncebuildStep;
// Miscellaneous
private boolean isExtensionConfig = false;
private boolean isDirty = false;
@@
-225,6 +229,18 @@
if (cloneConfig.errorParserIds !=
null) {
errorParserIds = new
String(cloneConfig.errorParserIds);
}
+
if (cloneConfig.prebuildStep !=
null) {
+
prebuildStep = new
String(cloneConfig.prebuildStep);
+
}
+
if (cloneConfig.postbuildStep !=
null) {
+
postbuildStep = new
String(cloneConfig.postbuildStep);
+
}
+
if (cloneConfig.preannouncebuildStep
!= null) {
+
preannouncebuildStep = new
String(cloneConfig.preannouncebuildStep);
+
}
+
if
(cloneConfig.postannouncebuildStep != null) {
+
postannouncebuildStep = new
String(cloneConfig.postannouncebuildStep);
+
}
// Clone the configuration's
children
// Tool Chain
@@
-316,6 +332,14 @@
// Get the clean command
cleanCommand =
element.getAttribute(CLEAN_COMMAND);
+
+
// Get the pre-build and post-build
commands
+
prebuildStep =
element.getAttribute(PREBUILD_STEP);
+
postbuildStep =
element.getAttribute(POSTBUILD_STEP);
+
+
// Get the pre-build and post-build
announcements
+
preannouncebuildStep =
element.getAttribute(PREANNOUNCEBUILD_STEP);
+
postannouncebuildStep =
element.getAttribute(POSTANNOUNCEBUILD_STEP);
}
/* (non-Javadoc)
@@
-362,6 +386,24 @@
if
(element.hasAttribute(CLEAN_COMMAND)) {
cleanCommand =
element.getAttribute(CLEAN_COMMAND);
}
+
+
// Get the pre-build and post-build
commands
+
if
(element.hasAttribute(PREBUILD_STEP)) {
+
prebuildStep =
element.getAttribute(PREBUILD_STEP);
+
}
+
+
if (element.hasAttribute(POSTBUILD_STEP))
{
+
postbuildStep =
element.getAttribute(POSTBUILD_STEP);
+
}
+
+
// Get the pre-build and post-build
announcements
+
if
(element.hasAttribute(PREANNOUNCEBUILD_STEP)) {
+
preannouncebuildStep =
element.getAttribute(PREANNOUNCEBUILD_STEP);
+
}
+
+
if
(element.hasAttribute(POSTANNOUNCEBUILD_STEP)) {
+
postannouncebuildStep =
element.getAttribute(POSTANNOUNCEBUILD_STEP);
+
}
}
/**
@@
-390,6 +432,18 @@
if (cleanCommand != null)
element.setAttribute(CLEAN_COMMAND,
cleanCommand);
+
+
if (prebuildStep != null)
+
element.setAttribute(PREBUILD_STEP,
prebuildStep);
+
+
if (postbuildStep != null)
+
element.setAttribute(POSTBUILD_STEP,
postbuildStep);
+
+
if (preannouncebuildStep != null)
+
element.setAttribute(PREANNOUNCEBUILD_STEP, preannouncebuildStep);
+
+
if (postannouncebuildStep != null)
+
element.setAttribute(POSTANNOUNCEBUILD_STEP, postannouncebuildStep);
// Serialize my children
Element toolChainElement =
doc.createElement(IToolChain.TOOL_CHAIN_ELEMENT_NAME);
@@
-784,6 +838,74 @@
}
/* (non-Javadoc)
+
* @see org.eclipse.cdt.core.build.managed.IConfiguration#getPrebuildStep()
+
*/
+
public String getPrebuildStep() {
+
if (prebuildStep == null) {
+
// If I have a parent, ask it
+
if (parent != null) {
+
return parent.getPrebuildStep();
+
} else {
+
// I'm it
+
return EMPTY_STRING;
+
}
+
} else {
+
return prebuildStep;
+
}
+
}
+
+
/* (non-Javadoc)
+
* @see org.eclipse.cdt.core.build.managed.IConfiguration#getPostbuildStep()
+
*/
+
public String getPostbuildStep() {
+
if (postbuildStep == null) {
+
// If I have a parent, ask it
+
if (parent != null) {
+
return parent.getPostbuildStep();
+
} else {
+
// I'm it
+
return EMPTY_STRING;
+
}
+
} else {
+
return postbuildStep;
+
}
+
}
+
+
/* (non-Javadoc)
+
* @see
org.eclipse.cdt.core.build.managed.IConfiguration#getPreannouncebuildStep()
+
*/
+
public String getPreannouncebuildStep() {
+
if (preannouncebuildStep == null) {
+
// If I have a parent, ask it
+
if (parent != null) {
+
return
parent.getPreannouncebuildStep();
+
} else {
+
// I'm it
+
return EMPTY_STRING;
+
}
+
} else {
+
return preannouncebuildStep;
+
}
+
}
+
+
/* (non-Javadoc)
+
* @see
org.eclipse.cdt.core.build.managed.IConfiguration#getPostannouncebuildStep()
+
*/
+
public String getPostannouncebuildStep() {
+
if (postannouncebuildStep == null) {
+
// If I have a parent, ask it
+
if (parent != null) {
+
return
parent.getPostannouncebuildStep();
+
} else {
+
// I'm it
+
return EMPTY_STRING;
+
}
+
} else {
+
return postannouncebuildStep;
+
}
+
}
+
+
/* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IConfiguration#getCleanCommand()
*/
public String getCleanCommand() {
@@
-928,8 +1050,56 @@
}
builder.setCommand(command);
}
+
+
/* (non-Javadoc)
+
* @see org.eclipse.cdt.core.build.managed.IConfiguration#setPrebuildStep(java.lang.String)
+
*/
+
public void setPrebuildStep(String step) {
+
if (step == null &&
prebuildStep == null) return;
+
if (prebuildStep == null || step ==
null || !prebuildStep.equals(step)) {
+
prebuildStep = step;
+
setRebuildState(true);
+
isDirty = true;
+
}
+
}
+
+
/* (non-Javadoc)
+
* @see org.eclipse.cdt.core.build.managed.IConfiguration#setPostbuildStep(java.lang.String)
+
*/
+
public void setPostbuildStep(String step) {
+
if (step == null &&
postbuildStep == null) return;
+
if (postbuildStep == null || step ==
null || !postbuildStep.equals(step)) {
+
postbuildStep = step;
+
setRebuildState(true);
+
isDirty = true;
+
}
+
}
+
/* (non-Javadoc)
+
* @see
org.eclipse.cdt.core.build.managed.IConfiguration#setPreannouncebuildStep(java.lang.String)
+
*/
+
public void setPreannouncebuildStep(String announceStep) {
+
if (announceStep == null &&
preannouncebuildStep == null) return;
+
if (preannouncebuildStep == null ||
announceStep == null || !preannouncebuildStep.equals(announceStep)) {
+
preannouncebuildStep = announceStep;
+
setRebuildState(true);
+
isDirty = true;
+
}
+
}
+
+
/* (non-Javadoc)
+
* @see
org.eclipse.cdt.core.build.managed.IConfiguration#setPostannouncebuildStep(java.lang.String)
+
*/
+
public void setPostannouncebuildStep(String announceStep) {
+
if (announceStep == null &&
postannouncebuildStep == null) return;
+
if (postannouncebuildStep == null ||
announceStep == null || !postannouncebuildStep.equals(announceStep)) {
+
postannouncebuildStep =
announceStep;
+
setRebuildState(true);
+
isDirty = true;
+
}
+
}
+
/*
* O B J E C T S T A T E M A I N T E N A N C E
*/
Index:
src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java
===================================================================
RCS
file:
/home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java,v
retrieving revision 1.34
diff
-u -r1.34 GeneratedMakefileBuilder.java
---
src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java
28 Jan 2005 03:35:20 -0000 1.34
+++
src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java
11 Apr 2005 19:47:53 -0000
@@
-29,6 +29,7 @@
import
org.eclipse.cdt.core.model.ICModelMarker;
import
org.eclipse.cdt.core.resources.ACBuilder;
import
org.eclipse.cdt.core.resources.IConsole;
+import
org.eclipse.cdt.managedbuilder.core.IConfiguration;
import
org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
import
org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import
org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator;
@@
-431,6 +432,7 @@
/* (non-javadoc)
* Answers an array of strings with the proper make targets
+
* for a build with no custom prebuild/postbuild steps
*
* @param fullBuild
* @return
@@
-541,9 +543,10 @@
}
/* (non-Javadoc)
-
* @param fullBuild
+
* @param buildType
* @param buildDir
* @param info
+
* @param generator
* @param monitor
*/
protected void invokeMake(int buildType, IPath buildDir, IManagedBuildInfo
info, IManagedBuilderMakefileGenerator generator, IProgressMonitor monitor) {
@@ -606,18 +609,6 @@
// Remove all markers for this
project
removeAllMarkers(currentProject);
-
-
// Get the arguments to be passed to
make from build model
-
ArrayList makeArgs = new ArrayList();
-
String arg =
info.getBuildArguments();
-
if (arg.length() > 0) {
-
String[] args =
arg.split("\\s"); //$NON-NLS-1$
-
for (int i = 0; i < args.length;
++i) {
-
makeArgs.add(args[i]);
-
}
-
}
-
makeArgs.addAll(Arrays.asList(getMakeTargets(buildType)));
-
String[] makeTargets = (String[])
makeArgs.toArray(new String[makeArgs.size()]);
// Get a launcher for the make
command
String errMsg = null;
@@
-646,58 +637,153 @@
OutputStream stdout =
epm.getOutputStream();
OutputStream stderr =
epm.getOutputStream();
-
// Launch make
-
Process proc =
launcher.execute(makeCommand, makeTargets, env, workingDirectory);
-
if (proc != null) {
-
try {
-
// Close the input of the process
since we will never write to it
-
proc.getOutputStream().close();
-
} catch (IOException e) {
+
// Get the arguments to be passed to
make from build model
+
ArrayList makeArgs = new
ArrayList();
+
String arg =
info.getBuildArguments();
+
if (arg.length() > 0) {
+
String[] args =
arg.split("\\s"); //$NON-NLS-1$
+
for (int i = 0; i < args.length;
++i) {
+
makeArgs.add(args[i]);
}
+
}
-
if (launcher.waitAndRead(stdout,
stderr, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)) !=
CommandLauncher.OK) {
-
errMsg = launcher.getErrorMessage();
-
}
+
String[] makeTargets;
+
String prebuildStep =
info.getPrebuildStep();
+
boolean prebuildStepPresent =
(prebuildStep.length() > 0);
+
Process proc = null;
+
boolean
isuptodate = false;
-
// Force a resync of the projects
without allowing the user to cancel.
-
// This is probably unkind, but short of this there is no way to insure
-
// the UI is up-to-date with the
build results
-
monitor.subTask(ManagedMakeMessages.getResourceString(REFRESH));
-
try {
-
currentProject.refreshLocal(IResource.DEPTH_INFINITE,
null);
-
} catch (CoreException e) {
-
monitor.subTask(ManagedMakeMessages.getResourceString(REFRESH_ERROR));
+
if (prebuildStepPresent)
{
+
ArrayList premakeArgs =
(ArrayList)makeArgs.clone();
+
String[] premakeTargets;
+
switch (buildType) {
+
case
INCREMENTAL_BUILD: {
+
// For an incremental build with a
prebuild step:
+
// Check the status of the main build with "make -q main-build"
+
// If up to date:
+
// then: don't invoke the prebuild step, which should be run only if
+
// something needs to be built in the main
build
+
// else: invoke the prebuild step and the main build step
+
boolean quit = false;
+
premakeArgs.add("-q"); //$NON-NLS-1$
+
premakeArgs.add("main-build"); //$NON-NLS-1$
+
premakeTargets = (String[]) premakeArgs.toArray(new String[premakeArgs.size()]);
+
proc = launcher.execute(makeCommand, premakeTargets, env, workingDirectory);
+
if (proc != null) {
+
try {
+
// Close the input of the process
since we will never write to it
+
proc.getOutputStream().close();
+
} catch (IOException e) {
+
}
+
if (launcher.waitAndRead(stdout,
stderr, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)) !=
CommandLauncher.OK) {
+
errMsg = launcher.getErrorMessage();
+
}
+
} else {
+
errMsg = launcher.getErrorMessage();
+
}
+
+
if ((errMsg != null && errMsg.length() > 0) || proc == null) {
+
// Can't tell if the build is
needed, so assume it is, and let any errors be triggered
+
// when the "real" build
is invoked below
+
makeArgs.add("pre-build");
//$NON-NLS-1$
+
makeArgs.add("main-build"); //$NON-NLS-1$
+
} else {
+
// The "make -q" command
launch was successful
+
if (proc.exitValue() == 0) {
+
// If the status value returned from
"make -q" is 0, then the build state is up-to-date
+
isuptodate =
true;
+
// Report that the build was up to
date, and thus nothing needs to be built
+
String uptodateMsg =
ManagedMakeMessages.getFormattedString(NOTHING_BUILT, currentProject.getName());
+
buf.append(uptodateMsg);
+
buf.append(System.getProperty("line.separator",
"\n")); //$NON-NLS-1$//$NON-NLS-2$
+
// Write message on the console
+
consoleOutStream.write(buf.toString().getBytes());
+
consoleOutStream.flush();
+
consoleOutStream.close();
+
stdout.close();
+
stderr.close();
+
} else {
+
// The status value was other than
0, so press on with the build process
+
makeArgs.add("pre-build");
//$NON-NLS-1$
+
makeArgs.add("main-build"); //$NON-NLS-1$
+
}
+
}
+
break;
+
}
+
case FULL_BUILD:
{
+
makeArgs.add("clean");
//$NON-NLS-1$
+
makeArgs.add("pre-build");
//$NON-NLS-1$
+
makeArgs.add("main-build"); //$NON-NLS-1$
+
break;
+
}
+
case CLEAN_BUILD:
{
+
makeArgs.add("clean"); //$NON-NLS-1$
+
break;
+
}
}
+
} else {
-
errMsg = launcher.getErrorMessage();
+
// No prebuild step
+
//
+
makeArgs.addAll(Arrays.asList(getMakeTargets(buildType)));
}
+
+
makeTargets = (String[])
makeArgs.toArray(new String[makeArgs.size()]);
-
// Report either the success or
failure of our mission
-
buf = new StringBuffer();
-
if (errMsg != null &&
errMsg.length() > 0) {
-
String errorDesc =
ManagedMakeMessages.getResourceString(BUILD_ERROR);
-
buf.append(errorDesc);
-
buf.append(System.getProperty("line.separator",
"\n")); //$NON-NLS-1$//$NON-NLS-2$
-
buf.append("(").append(errMsg).append(")"); //$NON-NLS-1$
//$NON-NLS-2$
-
} else {
-
// Report a successful build
-
String successMsg = ManagedMakeMessages.getFormattedString(BUILD_FINISHED,
currentProject.getName());
-
buf.append(successMsg);
-
buf.append(System.getProperty("line.separator",
"\n")); //$NON-NLS-1$//$NON-NLS-2$
-
}
-
-
// Write message on the console
-
consoleOutStream.write(buf.toString().getBytes());
-
consoleOutStream.flush();
-
stdout.close();
-
stderr.close();
-
-
// Generate any error markers that
the build has discovered
-
monitor.subTask(ManagedMakeMessages.getResourceString(MARKERS));
-
addBuilderMarkers(epm);
-
epm.reportProblems();
-
consoleOutStream.close();
-
}
+
// Launch make - main invocation
+
if (!isuptodate) {
+
proc = launcher.execute(makeCommand,
makeTargets, env, workingDirectory);
+
if (proc != null) {
+
try {
+
// Close the input of the process since we will never write to it
+
proc.getOutputStream().close();
+
} catch (IOException e) {
+
}
+
+
if (launcher.waitAndRead(stdout,
stderr, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)) !=
CommandLauncher.OK) {
+
errMsg = launcher.getErrorMessage();
+
}
+
+
// Force a resync of the projects
without allowing the user to cancel.
+
// This is probably unkind, but
short of this there is no way to insure
+
// the UI is up-to-date with the
build results
+
monitor.subTask(ManagedMakeMessages.getResourceString(REFRESH));
+
try {
+
currentProject.refreshLocal(IResource.DEPTH_INFINITE, null);
+
} catch (CoreException e) {
+
monitor.subTask(ManagedMakeMessages.getResourceString(REFRESH_ERROR));
+
}
+
} else {
+
errMsg = launcher.getErrorMessage();
+
}
+
+
// Report either the success or
failure of our mission
+
buf = new StringBuffer();
+
if (errMsg != null &&
errMsg.length() > 0) {
+
String errorDesc =
ManagedMakeMessages.getResourceString(BUILD_ERROR);
+
buf.append(errorDesc);
+
buf.append(System.getProperty("line.separator",
"\n")); //$NON-NLS-1$//$NON-NLS-2$
+
buf.append("(").append(errMsg).append(")");
//$NON-NLS-1$ //$NON-NLS-2$
+
} else {
+
// Report a successful build
+
String successMsg =
ManagedMakeMessages.getFormattedString(BUILD_FINISHED,
currentProject.getName());
+
buf.append(successMsg);
+
buf.append(System.getProperty("line.separator",
"\n")); //$NON-NLS-1$//$NON-NLS-2$
+
}
+
+
// Write message on the console
+
consoleOutStream.write(buf.toString().getBytes());
+
consoleOutStream.flush();
+
stdout.close();
+
stderr.close();
+
+
// Generate any error markers that
the build has discovered
+
monitor.subTask(ManagedMakeMessages.getResourceString(MARKERS));
+
addBuilderMarkers(epm);
+
epm.reportProblems();
+
consoleOutStream.close();
+
}
+
}
} catch (Exception e) {
forgetLastBuiltState();
} finally {
Index:
src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java
===================================================================
RCS
file:
/home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java,v
retrieving revision 1.32
diff
-u -r1.32 ManagedBuildInfo.java
---
src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java
28 Jan 2005 03:36:33 -0000 1.32
+++
src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java
11 Apr 2005 19:47:56 -0000
@@
-515,6 +515,58 @@
}
/* (non-Javadoc)
+
* @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getPrebuildStep()
+
*/
+
public String getPrebuildStep() {
+
// Get the default configuration and
use its value
+
String name = new String();
+
IConfiguration config =
getDefaultConfiguration();
+
if (config != null) {
+
name = config.getPrebuildStep();
+
}
+
return name;
+
}
+
+
/* (non-Javadoc)
+
* @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getPostbuildStep()
+
*/
+
public String getPostbuildStep() {
+
// Get the default configuration and
use its value
+
String name = new String();
+
IConfiguration config =
getDefaultConfiguration();
+
if (config != null) {
+
name = config.getPostbuildStep();
+
}
+
return name;
+
}
+
+
/* (non-Javadoc)
+
* @see
org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getPreannouncebuildStep()
+
*/
+
public String getPreannouncebuildStep() {
+
// Get the default configuration and
use its value
+
String name = new String();
+
IConfiguration config =
getDefaultConfiguration();
+
if (config != null) {
+
name =
config.getPreannouncebuildStep();
+
}
+
return name;
+
}
+
+
/* (non-Javadoc)
+
* @see
org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getPostannouncebuildStep()
+
*/
+
public String getPostannouncebuildStep() {
+
// Get the default configuration and
use its value
+
String name = new String();
+
IConfiguration config =
getDefaultConfiguration();
+
if (config != null) {
+
name =
config.getPostannouncebuildStep();
+
}
+
return name;
+
}
+
+
/* (non-Javadoc)
* @see
org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getOutputExtension(java.lang.String)
*/
public String getOutputExtension(String resourceExtension) {
Index:
src/org/eclipse/cdt/managedbuilder/makegen/IManagedBuilderMakefileGenerator.java
===================================================================
RCS
file: /home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/IManagedBuilderMakefileGenerator.java,v
retrieving revision 1.5
diff
-u -r1.5 IManagedBuilderMakefileGenerator.java
---
src/org/eclipse/cdt/managedbuilder/makegen/IManagedBuilderMakefileGenerator.java
26 Jun 2004 21:13:07 -0000 1.5
+++
src/org/eclipse/cdt/managedbuilder/makegen/IManagedBuilderMakefileGenerator.java
11 Apr 2005 19:47:57 -0000
@@
-28,9 +28,11 @@
public final String COLON = ":";
//$NON-NLS-1$
public final int COLS_PER_LINE = 80;
public final String COMMENT_SYMBOL =
"#"; //$NON-NLS-1$
+
public final String DOLLAR_SYMBOL =
"$"; //$NON-NLS-1$
public final String DEP_EXT = "d";
//$NON-NLS-1$
public final String DEPFILE_NAME =
"subdir.dep"; //$NON-NLS-1$
public final String DOT = "."; //$NON-NLS-1$
+
public final String DASH = "-"; //$NON-NLS-1$
public final String ECHO = "echo";
//$NON-NLS-1$
public final String IN_MACRO = "$<";
//$NON-NLS-1$
public final String LINEBREAK = "\\\n";
//$NON-NLS-1$
@@
-39,6 +41,8 @@
public final String MAKEFILE_INIT = "makefile.init"; //$NON-NLS-1$
public final String MAKEFILE_NAME = "makefile"; //$NON-NLS-1$
public final String MAKEFILE_TARGETS = "makefile.targets";
//$NON-NLS-1$
+
public final String MAKE = "$(MAKE)"; //$NON-NLS-1$
+
public final String NO_PRINT_DIR =
"--no-print-directory"; //$NON-NLS-1$
public final String MODFILE_NAME = "subdir.mk"; //$NON-NLS-1$
public final String NEWLINE =
System.getProperty("line.separator");
//$NON-NLS-1$
Index:
src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java
===================================================================
RCS
file:
/home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java,v
retrieving revision 1.30
diff
-u -r1.30 GnuMakefileGenerator.java
---
src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java
28 Jan 2005 20:44:37 -0000 1.30
+++
src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java
11 Apr 2005 19:47:59 -0000
@@
-601,6 +601,15 @@
String flags =
info.getFlagsForConfiguration(extension);
String outflag = info.getOutputFlag(extension);
String outputPrefix =
info.getOutputPrefix(extension);
+
String prebuildStep =
info.getPrebuildStep();
+
prebuildStep.trim(); // Remove leading and trailing
whitespace (and control characters)
+
String postbuildStep =
info.getPostbuildStep();
+
postbuildStep.trim(); //
Remove leading and trailing whitespace (and control characters)
+
String preannouncebuildStep =
info.getPreannouncebuildStep();
+
String postannouncebuildStep =
info.getPostannouncebuildStep();
+
String prebuild =
"pre-build"; //$NON-NLS-1$
+
String mainbuild =
"main-build"; //$NON-NLS-1$
+
String postbuild =
"post-build"; //$NON-NLS-1$
String targets = rebuild ?
"clean all" : "all"; //$NON-NLS-1$ //$NON-NLS-2$
// Get all the projects the build
target depends on
@@
-612,9 +621,30 @@
// and neither conditions apply if
we are building for it ....
}
-
// Write out the all target first in
case someone just runs make
-
// all:
targ_<target_name>
+
// If a prebuild step exists,
redefine the all target to be
+
// all: {pre-build} main-build
+
// and then reset the
"traditional" all target to main-build
+
// This will allow something
meaningful to happen if the generated makefile is
+
// extracted and run standalone via
"make all"
+
//
String defaultTarget =
"all:"; //$NON-NLS-1$
+
if (prebuildStep.length() > 0) {
+
+
buffer.append(defaultTarget +
WHITESPACE);
+
buffer.append(prebuild +
WHITESPACE);
+
+
// Reset defaultTarget for now and
for subsequent use, below
+
defaultTarget = mainbuild;
+
buffer.append(defaultTarget);
+
+
// Update the defaultTarget,
main-build, by adding a colon, which is needed below
+
defaultTarget =
defaultTarget.concat(COLON);
+
buffer.append(NEWLINE + NEWLINE);
+
}
+
+
// Write out the all target first in
case someone just runs make
+
// all: <target_name> or
mainbuild: <target_name>
+
buffer.append(defaultTarget +
WHITESPACE + outputPrefix + buildTargetName);
if (extension.length() > 0) {
buffer.append(DOT + extension);
@@
-671,7 +701,7 @@
*
@echo 'Building target: $@'
*
$(BUILD_TOOL) $(FLAGS)
$(OUTPUT_FLAG)$@ $(OBJS) $(USER_OBJS) $(LIB_DEPS)
*
@echo 'Finished building: $@'
-
*
@echo
+
*
$(MAKE) --no-print-directory
post-build //if postbuild step present
*/
buffer.append(outputPrefix +
buildTargetName);
if (extension.length() > 0) {
@@
-685,7 +715,17 @@
buffer.append(NEWLINE);
buffer.append(TAB + AT + ECHO +
WHITESPACE + SINGLE_QUOTE + MESSAGE_START_BUILD + WHITESPACE + OUT_MACRO +
SINGLE_QUOTE + NEWLINE);
buffer.append(TAB + cmd + WHITESPACE
+ flags + WHITESPACE + outflag + WHITESPACE + OUT_MACRO + WHITESPACE +
"$(OBJS) $(USER_OBJS) $(LIBS)" + NEWLINE); //$NON-NLS-1$
-
buffer.append(TAB + AT + ECHO +
WHITESPACE + SINGLE_QUOTE + MESSAGE_FINISH_FILE + WHITESPACE + OUT_MACRO +
SINGLE_QUOTE + NEWLINE + NEWLINE);
+
buffer.append(TAB + AT + ECHO +
WHITESPACE + SINGLE_QUOTE + MESSAGE_FINISH_FILE + WHITESPACE + OUT_MACRO +
SINGLE_QUOTE + NEWLINE);
+
+
// If there is a post build step,
then add a recursive invocation of MAKE to invoke it after the main build
+
// Note that $(MAKE) will
instantiate in the recusive invocation to the make command that was used to
invoke
+
// the makefile originally
+
if (postbuildStep.length() > 0) {
+
buffer.append(TAB + AT + ECHO +
WHITESPACE + SINGLE_QUOTE + WHITESPACE + SINGLE_QUOTE + NEWLINE);
+
buffer.append(TAB + MAKE +
WHITESPACE + NO_PRINT_DIR + WHITESPACE + postbuild +
NEWLINE);
+
}
+
+
buffer.append(NEWLINE);
// Always add a clean target
buffer.append("clean:" +
NEWLINE); //$NON-NLS-1$
@@
-693,10 +733,38 @@
if (extension.length() > 0) {
buffer.append(DOT + extension);
}
-
buffer.append(NEWLINE + NEWLINE);
+
buffer.append(NEWLINE);
+
buffer.append(TAB + DASH + AT + ECHO
+ WHITESPACE + SINGLE_QUOTE + WHITESPACE + SINGLE_QUOTE + NEWLINE + NEWLINE);
+
// Add the prebuild step target, if
specified
+
if (prebuildStep.length() > 0) {
+
buffer.append(prebuild + COLON + NEWLINE);
+
if (preannouncebuildStep.length()
> 0) {
+
buffer.append(TAB + DASH + AT + ECHO
+ WHITESPACE + SINGLE_QUOTE + preannouncebuildStep + SINGLE_QUOTE + NEWLINE);
+
}
+
buffer.append(TAB + DASH +
prebuildStep + NEWLINE);
+
buffer.append(TAB + DASH + AT + ECHO
+ WHITESPACE + SINGLE_QUOTE + WHITESPACE + SINGLE_QUOTE + NEWLINE + NEWLINE);
+
}
+
+
// Add the postbuild step, if
specified
+
if (postbuildStep.length() > 0) {
+
buffer.append(postbuild + COLON + NEWLINE);
+
if (postannouncebuildStep.length()
> 0) {
+
buffer.append(TAB + DASH + AT + ECHO + WHITESPACE + SINGLE_QUOTE +
postannouncebuildStep + SINGLE_QUOTE + NEWLINE);
+
}
+
buffer.append(TAB + DASH +
postbuildStep + NEWLINE);
+
buffer.append(TAB + DASH + AT + ECHO
+ WHITESPACE + SINGLE_QUOTE + WHITESPACE + SINGLE_QUOTE + NEWLINE + NEWLINE);
+
}
+
// Add all the eneded dummy and
phony targets
-
buffer.append(".PHONY: all
clean dependents" + NEWLINE); //$NON-NLS-1$
+
buffer.append(".PHONY: all
clean dependents"); //$NON-NLS-1$
+
if (prebuildStep.length() > 0) {
+
buffer.append(WHITESPACE + mainbuild
+ WHITESPACE + prebuild);
+
}
+
if (postbuildStep.length() > 0) {
+
buffer.append(WHITESPACE +
postbuild);
+
}
+
buffer.append (NEWLINE);
refIter =
managedProjectOutputs.listIterator();
while(refIter.hasNext()) {
buffer.append((String)refIter.next()
+ COLON + NEWLINE);