Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Schaefer2010-08-15 20:53:27 +0000
committerDoug Schaefer2010-08-15 20:53:27 +0000
commitb45080a6f77fda171236cd6cffcab0cb9330005b (patch)
treead65614cfcc1dbe24e7d9a8b2e8e7ebae51c9780 /build/org.eclipse.cdt.managedbuilder.core
parent927fba2490473211ae2ccac93fe6867d8056c8a3 (diff)
downloadorg.eclipse.cdt-b45080a6f77fda171236cd6cffcab0cb9330005b.tar.gz
org.eclipse.cdt-b45080a6f77fda171236cd6cffcab0cb9330005b.tar.xz
org.eclipse.cdt-b45080a6f77fda171236cd6cffcab0cb9330005b.zip
Bug 322458 - Implemented extension to allow the CommonBuilder.invokeBuilder method to be overriden.
Diffstat (limited to 'build/org.eclipse.cdt.managedbuilder.core')
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd12
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java389
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuildRunner.java43
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java15
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java242
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java34
-rw-r--r--build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java805
7 files changed, 761 insertions, 779 deletions
diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd
index fecae0db712..b6fc59f54b8 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd
+++ b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd
@@ -1316,7 +1316,7 @@ Additional special types exist to flag options of special relevance to the build
<attribute name="browseFilterExtensions" type="string">
<annotation>
<documentation>
- An optional value that specifies a comma-separated string of file-extension filters for the underlying file browse-dialog. For filters with multiple extensions, use semicolon as a separator - eg. "*.lib;*.a;*.cmd,*.*". This attribute only applies when user chooses to browse the file-system, and only when browseType is 'file'.
+ An optional value that specifies a comma-separated string of file-extension filters for the underlying file browse-dialog. For filters with multiple extensions, use semicolon as a separator - eg. &quot;*.lib;*.a;*.cmd,*.*&quot;. This attribute only applies when user chooses to browse the file-system, and only when browseType is &apos;file&apos;.
</documentation>
</annotation>
</attribute>
@@ -1741,6 +1741,16 @@ If the builder supports specifying custom number of parallel jobs, the option de
</appInfo>
</annotation>
</attribute>
+ <attribute name="buildRunner" type="string">
+ <annotation>
+ <documentation>
+ A runner for the build. Overrides or extends the built-in external and internal build runners.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.cdt.managedbuilder.core.IBuildRunner"/>
+ </appInfo>
+ </annotation>
+ </attribute>
</complexType>
</element>
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java
new file mode 100644
index 00000000000..7b8594c20bd
--- /dev/null
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ExternalBuildRunner.java
@@ -0,0 +1,389 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.managedbuilder.core;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.cdt.build.core.scannerconfig.CfgInfoContext;
+import org.eclipse.cdt.build.core.scannerconfig.ICfgScannerConfigBuilderInfo2Set;
+import org.eclipse.cdt.build.internal.core.scannerconfig2.CfgScannerConfigProfileManager;
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.ErrorParserManager;
+import org.eclipse.cdt.core.ICommandLauncher;
+import org.eclipse.cdt.core.IMarkerGenerator;
+import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
+import org.eclipse.cdt.core.envvar.IEnvironmentVariableManager;
+import org.eclipse.cdt.core.model.ICModelMarker;
+import org.eclipse.cdt.core.resources.IConsole;
+import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
+import org.eclipse.cdt.internal.core.ConsoleOutputSniffer;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
+import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
+import org.eclipse.cdt.make.core.scannerconfig.InfoContext;
+import org.eclipse.cdt.make.internal.core.scannerconfig2.SCProfileInstance;
+import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfile;
+import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
+import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
+import org.eclipse.cdt.managedbuilder.macros.BuildMacroException;
+import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider;
+import org.eclipse.cdt.newmake.internal.core.StreamMonitor;
+import org.eclipse.cdt.utils.CommandLineUtil;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+
+/**
+ * @author dschaefer
+ * @since 8.0
+ */
+public class ExternalBuildRunner implements IBuildRunner {
+
+ private static final String TYPE_CLEAN = "ManagedMakeBuilder.type.clean"; //$NON-NLS-1$
+ private static final String TYPE_INC = "ManagedMakeBuider.type.incremental"; //$NON-NLS-1$
+ private static final String CONSOLE_HEADER = "ManagedMakeBuilder.message.console.header"; //$NON-NLS-1$
+ private static final String WARNING_UNSUPPORTED_CONFIGURATION = "ManagedMakeBuilder.warning.unsupported.configuration"; //$NON-NLS-1$
+
+ public boolean invokeBuild(int kind, IProject project, IConfiguration configuration,
+ IBuilder builder, IConsole console, IMarkerGenerator markerGenerator,
+ IncrementalProjectBuilder projectBuilder, IProgressMonitor monitor) throws CoreException {
+ return invokeExternalBuild(kind, project, configuration, builder, console,
+ markerGenerator, projectBuilder, monitor);
+ }
+
+ protected boolean invokeExternalBuild(int kind, IProject project, IConfiguration configuration,
+ IBuilder builder, IConsole console, IMarkerGenerator markerGenerator,
+ IncrementalProjectBuilder projectBuilder, IProgressMonitor monitor) throws CoreException {
+ boolean isClean = false;
+
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+ monitor.beginTask(ManagedMakeMessages.getResourceString("MakeBuilder.Invoking_Make_Builder") + project.getName(), 100); //$NON-NLS-1$
+
+ try {
+ IPath buildCommand = builder.getBuildCommand();
+ if (buildCommand != null) {
+ OutputStream cos = console.getOutputStream();
+ StringBuffer buf = new StringBuffer();
+
+ String[] consoleHeader = new String[3];
+ switch (kind) {
+ case IncrementalProjectBuilder.FULL_BUILD:
+ case IncrementalProjectBuilder.INCREMENTAL_BUILD:
+ case IncrementalProjectBuilder.AUTO_BUILD:
+ consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_INC);
+ break;
+ case IncrementalProjectBuilder.CLEAN_BUILD:
+ consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_CLEAN);
+ break;
+ }
+
+ consoleHeader[1] = configuration.getName();
+ consoleHeader[2] = project.getName();
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader));
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ if(!configuration.isSupported()){
+ buf.append(ManagedMakeMessages.getFormattedString(WARNING_UNSUPPORTED_CONFIGURATION,
+ new String[] { configuration.getName(), configuration.getToolChain().getName() }));
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ cos.write(buf.toString().getBytes());
+ cos.flush();
+
+ // remove all markers for this project
+ IWorkspace workspace = project.getWorkspace();
+ IMarker[] markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
+ if (markers != null)
+ workspace.deleteMarkers(markers);
+
+ IPath workingDirectory = ManagedBuildManager.getBuildLocation(configuration, builder);
+ URI workingDirectoryURI = ManagedBuildManager.getBuildLocationURI(configuration, builder);
+
+ String[] targets = getTargets(kind, builder);
+ if (targets.length != 0 && targets[targets.length - 1].equals(builder.getCleanBuildTarget()))
+ isClean = true;
+
+ String errMsg = null;
+ ICommandLauncher launcher = builder.getCommandLauncher();
+ launcher.setProject(project);
+ // Print the command for visual interaction.
+ launcher.showCommand(true);
+
+ // Set the environment
+ String[] env = getEnvStrings(getEnvironment(builder));
+ String[] buildArguments = targets;
+
+ String[] newArgs = CommandLineUtil.argumentsToArray(builder.getBuildArguments());
+ buildArguments = new String[targets.length + newArgs.length];
+ System.arraycopy(newArgs, 0, buildArguments, 0, newArgs.length);
+ System.arraycopy(targets, 0, buildArguments, newArgs.length, targets.length);
+
+ QualifiedName qName = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "progressMonitor"); //$NON-NLS-1$
+ Integer last = (Integer)project.getSessionProperty(qName);
+ if (last == null) {
+ last = new Integer(100);
+ }
+ ErrorParserManager epm = new ErrorParserManager(project, workingDirectoryURI, markerGenerator, builder.getErrorParsers());
+ epm.setOutputStream(cos);
+ StreamMonitor streamMon = new StreamMonitor(new SubProgressMonitor(monitor, 100), epm, last.intValue());
+ OutputStream stdout = streamMon;
+ OutputStream stderr = streamMon;
+
+ // Sniff console output for scanner info
+ ConsoleOutputSniffer sniffer = createBuildOutputSniffer(stdout, stderr, project, configuration, workingDirectory, markerGenerator, null);
+ OutputStream consoleOut = (sniffer == null ? stdout : sniffer.getOutputStream());
+ OutputStream consoleErr = (sniffer == null ? stderr : sniffer.getErrorStream());
+ Process p = launcher.execute(buildCommand, buildArguments, env, workingDirectory, monitor);
+ if (p != null) {
+ try {
+ // Close the input of the Process explicitly.
+ // We will never write to it.
+ p.getOutputStream().close();
+ } catch (IOException e) {
+ }
+ // Before launching give visual cues via the monitor
+ monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Invoking_Command") + launcher.getCommandLine()); //$NON-NLS-1$
+ if (launcher.waitAndRead(consoleOut, consoleErr, new SubProgressMonitor(monitor, 0))
+ != ICommandLauncher.OK)
+ errMsg = launcher.getErrorMessage();
+ monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Updating_project")); //$NON-NLS-1$
+
+ try {
+ // Do not allow the cancel of the refresh, since the builder is external
+ // to Eclipse, files may have been created/modified and we will be out-of-sync.
+ // The caveat is for hugue projects, it may take sometimes at every build.
+
+ // TODO should only refresh output folders
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+ } catch (CoreException e) {
+ }
+ } else {
+ errMsg = launcher.getErrorMessage();
+ }
+ project.setSessionProperty(qName, !monitor.isCanceled() && !isClean ? new Integer(streamMon.getWorkDone()) : null);
+
+ if (errMsg != null) {
+ buf = new StringBuffer(buildCommand.toString() + " "); //$NON-NLS-1$
+ for (String arg : buildArguments) {
+ buf.append(arg);
+ buf.append(' ');
+ }
+
+ String errorDesc = ManagedMakeMessages.getFormattedString("MakeBuilder.buildError", buf.toString()); //$NON-NLS-1$
+ buf = new StringBuffer(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$
+ cos.write(buf.toString().getBytes());
+ cos.flush();
+ }
+
+ stdout.close();
+ stderr.close();
+
+ monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Creating_Markers")); //$NON-NLS-1$
+ consoleOut.close();
+ consoleErr.close();
+ cos.close();
+ }
+ } catch (Exception e) {
+ ManagedBuilderCorePlugin.log(e);
+ throw new CoreException(new Status(IStatus.ERROR,
+ ManagedBuilderCorePlugin.getUniqueIdentifier(),
+ e.getLocalizedMessage(),
+ e));
+ } finally {
+ monitor.done();
+ }
+ return (isClean);
+ }
+
+ protected String[] getTargets(int kind, IBuilder builder) {
+ String targetsArray[] = null;
+
+ if(kind != IncrementalProjectBuilder.CLEAN_BUILD && !builder.isCustomBuilder() && builder.isManagedBuildOn()){
+ IConfiguration cfg = builder.getParent().getParent();
+ String preBuildStep = cfg.getPrebuildStep();
+ try {
+ preBuildStep = ManagedBuildManager.getBuildMacroProvider().resolveValueToMakefileFormat(
+ preBuildStep,
+ "", //$NON-NLS-1$
+ " ", //$NON-NLS-1$
+ IBuildMacroProvider.CONTEXT_CONFIGURATION,
+ cfg);
+ } catch (BuildMacroException e) {
+ }
+
+ if(preBuildStep != null && preBuildStep.length() != 0){
+ targetsArray = new String[]{"pre-build", "main-build"}; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ if(targetsArray == null){
+ String targets = ""; //$NON-NLS-1$
+ switch (kind) {
+ case IncrementalProjectBuilder.AUTO_BUILD :
+ targets = builder.getAutoBuildTarget();
+ break;
+ case IncrementalProjectBuilder.INCREMENTAL_BUILD : // now treated as the same!
+ case IncrementalProjectBuilder.FULL_BUILD :
+ targets = builder.getIncrementalBuildTarget();
+ break;
+ case IncrementalProjectBuilder.CLEAN_BUILD :
+ targets = builder.getCleanBuildTarget();
+ break;
+ }
+
+ targetsArray = CommandLineUtil.argumentsToArray(targets);
+ }
+
+ return targetsArray;
+ }
+
+ protected Map<String, String> getEnvironment(IBuilder builder) throws CoreException {
+ Map<String, String> envMap = new HashMap<String, String>();
+ if (builder.appendEnvironment()) {
+ ICConfigurationDescription cfgDes = ManagedBuildManager.getDescriptionForConfiguration(builder.getParent().getParent());
+ IEnvironmentVariableManager mngr = CCorePlugin.getDefault().getBuildEnvironmentManager();
+ IEnvironmentVariable[] vars = mngr.getVariables(cfgDes, true);
+ for (IEnvironmentVariable var : vars) {
+ envMap.put(var.getName(), var.getValue());
+ }
+ }
+
+ // Add variables from build info
+ Map<String, String> builderEnv = builder.getExpandedEnvironment();
+ if (builderEnv != null)
+ envMap.putAll(builderEnv);
+
+ return envMap;
+ }
+
+ protected static String[] getEnvStrings(Map<String, String> env) {
+ // Convert into env strings
+ List<String> strings= new ArrayList<String>(env.size());
+ for (Entry<String, String> entry : env.entrySet()) {
+ StringBuffer buffer= new StringBuffer(entry.getKey());
+ buffer.append('=').append(entry.getValue());
+ strings.add(buffer.toString());
+ }
+
+ return strings.toArray(new String[strings.size()]);
+ }
+
+ private ConsoleOutputSniffer createBuildOutputSniffer(OutputStream outputStream,
+ OutputStream errorStream,
+ IProject project,
+ IConfiguration cfg,
+ IPath workingDirectory,
+ IMarkerGenerator markerGenerator,
+ IScannerInfoCollector collector){
+ ICfgScannerConfigBuilderInfo2Set container = CfgScannerConfigProfileManager.getCfgScannerConfigBuildInfo(cfg);
+ Map<CfgInfoContext, IScannerConfigBuilderInfo2> map = container.getInfoMap();
+ List<IScannerInfoConsoleParser> clParserList = new ArrayList<IScannerInfoConsoleParser>();
+
+ if(container.isPerRcTypeDiscovery()){
+ for (IResourceInfo rcInfo : cfg.getResourceInfos()) {
+ ITool tools[];
+ if(rcInfo instanceof IFileInfo){
+ tools = ((IFileInfo)rcInfo).getToolsToInvoke();
+ } else {
+ tools = ((IFolderInfo)rcInfo).getFilteredTools();
+ }
+ for (ITool tool : tools) {
+ IInputType[] types = tool.getInputTypes();
+
+ if(types.length != 0){
+ for (IInputType type : types) {
+ CfgInfoContext c = new CfgInfoContext(rcInfo, tool, type);
+ contributeToConsoleParserList(project, map, c, workingDirectory, markerGenerator, collector, clParserList);
+ }
+ } else {
+ CfgInfoContext c = new CfgInfoContext(rcInfo, tool, null);
+ contributeToConsoleParserList(project, map, c, workingDirectory, markerGenerator, collector, clParserList);
+ }
+ }
+ }
+ }
+
+ if(clParserList.size() == 0){
+ contributeToConsoleParserList(project, map, new CfgInfoContext(cfg), workingDirectory, markerGenerator, collector, clParserList);
+ }
+
+ if(clParserList.size() != 0){
+ return new ConsoleOutputSniffer(outputStream, errorStream,
+ clParserList.toArray(new IScannerInfoConsoleParser[clParserList.size()]));
+ }
+
+ return null;
+ }
+
+ private boolean contributeToConsoleParserList(
+ IProject project,
+ Map<CfgInfoContext, IScannerConfigBuilderInfo2> map,
+ CfgInfoContext context,
+ IPath workingDirectory,
+ IMarkerGenerator markerGenerator,
+ IScannerInfoCollector collector,
+ List<IScannerInfoConsoleParser> parserList){
+ IScannerConfigBuilderInfo2 info = map.get(context);
+ InfoContext ic = context.toInfoContext();
+ boolean added = false;
+ if (info != null &&
+ info.isAutoDiscoveryEnabled() &&
+ info.isBuildOutputParserEnabled()) {
+
+ String id = info.getSelectedProfileId();
+ ScannerConfigProfile profile = ScannerConfigProfileManager.getInstance().getSCProfileConfiguration(id);
+ if(profile.getBuildOutputProviderElement() != null){
+ // get the make builder console parser
+ SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance().
+ getSCProfileInstance(project, ic, id);
+
+ IScannerInfoConsoleParser clParser = profileInstance.createBuildOutputParser();
+ if (collector == null) {
+ collector = profileInstance.getScannerInfoCollector();
+ }
+ if(clParser != null){
+ clParser.startup(project, workingDirectory, collector,
+ info.isProblemReportingEnabled() ? markerGenerator : null);
+ parserList.add(clParser);
+ added = true;
+ }
+
+ }
+ }
+
+ return added;
+ }
+
+}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuildRunner.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuildRunner.java
new file mode 100644
index 00000000000..643ed642bdf
--- /dev/null
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuildRunner.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.managedbuilder.core;
+
+import org.eclipse.cdt.core.IMarkerGenerator;
+import org.eclipse.cdt.core.resources.IConsole;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Interface implemented by toolchain integrators to perform the actual build.
+ *
+ * @author Doug Schaefer
+ * @since 8.0
+ */
+public interface IBuildRunner {
+
+ /**
+ * Perform the build.
+ *
+ * @param kind kind from the IncrementalProjectBuilder
+ * @param project project being built
+ * @param configuration configuration being built
+ * @param console console to use for build output
+ * @param markerGenerator generator to add markers for build problems
+ * @param monitor progress monitor
+ * @throws CoreException standard core exception of something goes wrong
+ */
+ public boolean invokeBuild(int kind, IProject project, IConfiguration configuration,
+ IBuilder builder, IConsole console, IMarkerGenerator markerGenerator,
+ IncrementalProjectBuilder projectBuilder, IProgressMonitor monitor) throws CoreException;
+
+}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java
index d60995e093e..b191202f479 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java
@@ -16,6 +16,7 @@ import org.eclipse.cdt.managedbuilder.macros.IFileContextBuildMacroValues;
import org.eclipse.cdt.managedbuilder.macros.IReservedMacroNameSupplier;
import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator;
import org.eclipse.cdt.newmake.core.IMakeBuilderInfo;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
/**
@@ -95,6 +96,11 @@ public interface IBuilder extends IBuildObject, IMakeBuilderInfo {
* @since 6.0
*/
static final String ATTRIBUTE_COMMAND_LAUNCHER = "commandLauncher"; //$NON-NLS-1$
+
+ /**
+ * @since 8.0
+ */
+ static final String ATTRIBUTE_BUILD_RUNNER = "buildRunner"; //$NON-NLS-1$
/**
* Returns the command line arguments to pass to the build/make utility used
@@ -319,4 +325,13 @@ public interface IBuilder extends IBuildObject, IMakeBuilderInfo {
* @since 6.0
*/
public ICommandLauncher getCommandLauncher();
+
+ /**
+ * Returns the build runner for this builder.
+ *
+ * @return build runner
+ * @since 8.0
+ */
+ public IBuildRunner getBuildRunner() throws CoreException;
+
}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java
new file mode 100644
index 00000000000..8c3c2df24df
--- /dev/null
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/InternalBuildRunner.java
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Wind River Systems and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.managedbuilder.core;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.cdt.core.ConsoleOutputStream;
+import org.eclipse.cdt.core.ErrorParserManager;
+import org.eclipse.cdt.core.IMarkerGenerator;
+import org.eclipse.cdt.core.model.ICModelMarker;
+import org.eclipse.cdt.core.resources.IConsole;
+import org.eclipse.cdt.managedbuilder.buildmodel.BuildDescriptionManager;
+import org.eclipse.cdt.managedbuilder.buildmodel.IBuildDescription;
+import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStateManager;
+import org.eclipse.cdt.managedbuilder.internal.buildmodel.DescriptionBuilder;
+import org.eclipse.cdt.managedbuilder.internal.buildmodel.IBuildModelBuilder;
+import org.eclipse.cdt.managedbuilder.internal.buildmodel.IConfigurationBuildState;
+import org.eclipse.cdt.managedbuilder.internal.buildmodel.IProjectBuildState;
+import org.eclipse.cdt.managedbuilder.internal.buildmodel.ParallelBuilder;
+import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+/**
+ * The build runner for the internal builder.
+ *
+ * @author dschaefer
+ * @since 8.0
+ */
+public class InternalBuildRunner implements IBuildRunner {
+
+ private static final String INTERNAL_BUILDER = "ManagedMakeBuilder.message.internal.builder"; //$NON-NLS-1$
+ private static final String TYPE_INC = "ManagedMakeBuider.type.incremental"; //$NON-NLS-1$
+ private static final String TYPE_REBUILD = "ManagedMakeBuider.type.rebuild"; //$NON-NLS-1$
+ private static final String CONSOLE_HEADER = "ManagedMakeBuilder.message.console.header"; //$NON-NLS-1$
+ private static final String INTERNAL_BUILDER_HEADER_NOTE = "ManagedMakeBuilder.message.internal.builder.header.note"; //$NON-NLS-1$
+ private static final String WARNING_UNSUPPORTED_CONFIGURATION = "ManagedMakeBuilder.warning.unsupported.configuration"; //$NON-NLS-1$
+ private static final String BUILD_FINISHED = "ManagedMakeBuilder.message.finished"; //$NON-NLS-1$
+ private static final String BUILD_CANCELLED = "ManagedMakeBuilder.message.cancelled"; //$NON-NLS-1$
+ private static final String BUILD_FINISHED_WITH_ERRS = "ManagedMakeBuilder.message.finished.with.errs"; //$NON-NLS-1$
+ private static final String BUILD_STOPPED_ERR = "ManagedMakeBuilder.message.stopped.error"; //$NON-NLS-1$
+ private static final String BUILD_FAILED_ERR = "ManagedMakeBuilder.message.internal.builder.error"; //$NON-NLS-1$
+ private static final String MARKERS = "ManagedMakeBuilder.message.creating.markers"; //$NON-NLS-1$
+ private static final String NOTHING_BUILT = "ManagedMakeBuilder.message.no.build"; //$NON-NLS-1$
+ private static final String BUILD_ERROR = "ManagedMakeBuilder.message.error"; //$NON-NLS-1$
+
+ public boolean invokeBuild(int kind, IProject project, IConfiguration configuration,
+ IBuilder builder, IConsole console, IMarkerGenerator markerGenerator,
+ IncrementalProjectBuilder projectBuilder, IProgressMonitor monitor) throws CoreException {
+ boolean isParallel = builder.isParallelBuildOn() && builder.getParallelizationNum() > 1;
+// boolean buildIncrementaly = true;
+ boolean resumeOnErr = !builder.isStopOnError();
+
+ // Get the project and make sure there's a monitor to cancel the build
+ if (monitor == null) {
+ monitor = new NullProgressMonitor();
+ }
+
+ String[] msgs = new String[2];
+ msgs[0] = ManagedMakeMessages.getResourceString(INTERNAL_BUILDER);
+ msgs[1] = project.getName();
+
+ ConsoleOutputStream consoleOutStream = null;
+ OutputStream epmOutputStream = null;
+ try {
+ int flags = 0;
+ IResourceDelta delta = projectBuilder.getDelta(project);
+ BuildStateManager bsMngr = BuildStateManager.getInstance();
+ IProjectBuildState pBS = bsMngr.getProjectBuildState(project);
+ IConfigurationBuildState cBS = pBS.getConfigurationBuildState(configuration.getId(), true);
+
+// if(delta != null){
+ flags = BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS;
+// delta = getDelta(currentProject);
+// }
+
+ boolean buildIncrementaly = delta != null;
+
+ // Get a build console for the project
+ StringBuffer buf = new StringBuffer();
+ consoleOutStream = console.getOutputStream();
+ String[] consoleHeader = new String[3];
+ if(buildIncrementaly)
+ consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_INC);
+ else
+ consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_REBUILD);
+
+ consoleHeader[1] = configuration.getName();
+ consoleHeader[2] = project.getName();
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader));
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ buf.append(ManagedMakeMessages.getResourceString(INTERNAL_BUILDER_HEADER_NOTE));
+ buf.append("\n"); //$NON-NLS-1$
+
+ if(!configuration.isSupported()){
+ buf.append(ManagedMakeMessages.getFormattedString(WARNING_UNSUPPORTED_CONFIGURATION,
+ new String[] { configuration.getName(), configuration.getToolChain().getName()}));
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ consoleOutStream.write(buf.toString().getBytes());
+ consoleOutStream.flush();
+
+ IBuildDescription des = BuildDescriptionManager.createBuildDescription(configuration, cBS, delta, flags);
+
+ DescriptionBuilder dBuilder = null;
+ if (!isParallel)
+ dBuilder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr, cBS);
+
+ if(isParallel || dBuilder.getNumCommands() > 0) {
+ // Remove all markers for this project
+ IWorkspace workspace = project.getWorkspace();
+ IMarker[] markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
+ if (markers != null)
+ workspace.deleteMarkers(markers);
+
+ // Hook up an error parser manager
+ String[] errorParsers = builder.getErrorParsers();
+ ErrorParserManager epm = new ErrorParserManager(project, des.getDefaultBuildDirLocationURI(), markerGenerator, errorParsers);
+ epm.setOutputStream(consoleOutStream);
+ // This variable is necessary to ensure that the EPM stream stay open
+ // until we explicitly close it. See bug#123302.
+ epmOutputStream = epm.getOutputStream();
+
+ int status = 0;
+
+ long t1 = System.currentTimeMillis();
+ if (isParallel)
+ status = ParallelBuilder.build(des, null, null, epmOutputStream, epmOutputStream, monitor, resumeOnErr, buildIncrementaly);
+ else
+ status = dBuilder.build(epmOutputStream, epmOutputStream, monitor);
+ long t2 = System.currentTimeMillis();
+
+ // Report either the success or failure of our mission
+ buf = new StringBuffer();
+
+ switch(status){
+ case IBuildModelBuilder.STATUS_OK:
+ buf.append(ManagedMakeMessages
+ .getFormattedString(BUILD_FINISHED,
+ project.getName()));
+ break;
+ case IBuildModelBuilder.STATUS_CANCELLED:
+ buf.append(ManagedMakeMessages
+ .getResourceString(BUILD_CANCELLED));
+ break;
+ case IBuildModelBuilder.STATUS_ERROR_BUILD:
+ String msg = resumeOnErr ?
+ ManagedMakeMessages.getResourceString(BUILD_FINISHED_WITH_ERRS) :
+ ManagedMakeMessages.getResourceString(BUILD_STOPPED_ERR);
+ buf.append(msg);
+ break;
+ case IBuildModelBuilder.STATUS_ERROR_LAUNCH:
+ default:
+ buf.append(ManagedMakeMessages
+ .getResourceString(BUILD_FAILED_ERR));
+ break;
+ }
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
+
+ // Report time and number of threads used
+ buf.append(ManagedMakeMessages.getFormattedString("CommonBuilder.6", Integer.toString((int)(t2 - t1)))); //$NON-NLS-1$
+// buf.append(t2 - t1);
+// buf.append(" ms. ");
+ if (isParallel) {
+ buf.append(ManagedMakeMessages.getFormattedString("CommonBuilder.7", Integer.toString(ParallelBuilder.lastThreadsUsed))); //$NON-NLS-1$
+// buf.append(ParallelBuilder.lastThreadsUsed);
+ }
+ 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();
+ epmOutputStream.close();
+ epmOutputStream = null;
+ // Generate any error markers that the build has discovered
+ monitor.subTask(ManagedMakeMessages
+ .getResourceString(MARKERS));
+
+ bsMngr.setProjectBuildState(project, pBS);
+ } else {
+ buf = new StringBuffer();
+ buf.append(ManagedMakeMessages.getFormattedString(NOTHING_BUILT, project.getName()));
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
+ consoleOutStream.write(buf.toString().getBytes());
+ consoleOutStream.flush();
+ }
+
+ } catch (Exception e) {
+ if(consoleOutStream != null){
+ StringBuffer buf = new StringBuffer();
+ String errorDesc = ManagedMakeMessages
+ .getResourceString(BUILD_ERROR);
+ buf.append(errorDesc);
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
+ buf.append(e.getLocalizedMessage());
+ buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
+
+ try {
+ consoleOutStream.write(buf.toString().getBytes());
+ consoleOutStream.flush();
+ } catch (IOException e1) {
+ }
+ }
+ projectBuilder.forgetLastBuiltState();
+ } finally {
+ if(epmOutputStream != null){
+ try {
+ epmOutputStream.close();
+ } catch (IOException e) {
+ }
+ }
+ if(consoleOutStream != null){
+ try {
+ consoleOutStream.close();
+ } catch (IOException e) {
+ }
+ }
+ monitor.done();
+ }
+ return false;
+ }
+
+}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java
index 2a99c3f0607..1e62408bed3 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java
@@ -37,13 +37,16 @@ import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.core.settings.model.extension.CBuildData;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.core.settings.model.util.LanguageSettingEntriesSerializer;
+import org.eclipse.cdt.managedbuilder.core.ExternalBuildRunner;
import org.eclipse.cdt.managedbuilder.core.IBuildObject;
+import org.eclipse.cdt.managedbuilder.core.IBuildRunner;
import org.eclipse.cdt.managedbuilder.core.IBuilder;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement;
import org.eclipse.cdt.managedbuilder.core.IManagedProject;
import org.eclipse.cdt.managedbuilder.core.IProjectType;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
+import org.eclipse.cdt.managedbuilder.core.InternalBuildRunner;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildBuildData;
@@ -137,6 +140,9 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider,
private ICommandLauncher fCommandLauncher = null;
private IConfigurationElement fCommandLauncherElement = null;
+ private IBuildRunner fBuildRunner = null;
+ private IConfigurationElement fBuildRunnerElement = null;
+
/*
* C O N S T R U C T O R S
*/
@@ -326,6 +332,9 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider,
fCommandLauncher = builder.fCommandLauncher;
fCommandLauncherElement = builder.fCommandLauncherElement;
+
+ fBuildRunner = builder.fBuildRunner;
+ fBuildRunnerElement = builder.fBuildRunnerElement;
}
public void copySettings(Builder builder, boolean allBuildSettings){
@@ -577,6 +586,9 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider,
fCommandLauncherElement = ((DefaultManagedConfigElement)element).getConfigurationElement();
}
+ String buildRunner = element.getAttribute(ATTRIBUTE_BUILD_RUNNER);
+ if (buildRunner != null && element instanceof DefaultManagedConfigElement)
+ fBuildRunnerElement = ((DefaultManagedConfigElement)element).getConfigurationElement();
}
/* (non-Javadoc)
@@ -2745,4 +2757,26 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider,
return fCommandLauncher;
}
+ public IBuildRunner getBuildRunner() throws CoreException {
+ // Already defined
+ if (fBuildRunner != null)
+ return fBuildRunner;
+
+ // Instantiate from model
+ if (fBuildRunnerElement != null) {
+ fBuildRunner = (IBuildRunner)fBuildRunnerElement.createExecutableExtension(ATTRIBUTE_BUILD_RUNNER);
+ return fBuildRunner;
+ }
+
+ // Check with superClass
+ if (superClass != null)
+ return superClass.getBuildRunner();
+
+ // Default internal or external builder
+ if (isInternalBuilder())
+ return new InternalBuildRunner();
+
+ return new ExternalBuildRunner();
+ }
+
}
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java
index adecbdfb768..c5b25610fa0 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java
@@ -15,73 +15,42 @@
package org.eclipse.cdt.managedbuilder.internal.core;
import java.io.IOException;
-import java.io.OutputStream;
-import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
-import org.eclipse.cdt.build.core.scannerconfig.CfgInfoContext;
-import org.eclipse.cdt.build.core.scannerconfig.ICfgScannerConfigBuilderInfo2Set;
-import org.eclipse.cdt.build.internal.core.scannerconfig2.CfgScannerConfigProfileManager;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ConsoleOutputStream;
-import org.eclipse.cdt.core.ErrorParserManager;
-import org.eclipse.cdt.core.ICommandLauncher;
-import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.ProblemMarkerInfo;
-import org.eclipse.cdt.core.envvar.IEnvironmentVariable;
-import org.eclipse.cdt.core.envvar.IEnvironmentVariableManager;
import org.eclipse.cdt.core.model.CoreModel;
-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.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.util.ListComparator;
-import org.eclipse.cdt.internal.core.ConsoleOutputSniffer;
-import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
-import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
-import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
-import org.eclipse.cdt.make.core.scannerconfig.InfoContext;
-import org.eclipse.cdt.make.internal.core.scannerconfig2.SCProfileInstance;
-import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfile;
-import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
import org.eclipse.cdt.managedbuilder.buildmodel.BuildDescriptionManager;
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildDescription;
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildStep;
import org.eclipse.cdt.managedbuilder.core.IBuilder;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
-import org.eclipse.cdt.managedbuilder.core.IFileInfo;
-import org.eclipse.cdt.managedbuilder.core.IFolderInfo;
-import org.eclipse.cdt.managedbuilder.core.IInputType;
import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
-import org.eclipse.cdt.managedbuilder.core.IResourceInfo;
-import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildDescription;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStateManager;
-import org.eclipse.cdt.managedbuilder.internal.buildmodel.DescriptionBuilder;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.IBuildModelBuilder;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.IConfigurationBuildState;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.IProjectBuildState;
-import org.eclipse.cdt.managedbuilder.internal.buildmodel.ParallelBuilder;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.StepBuilder;
import org.eclipse.cdt.managedbuilder.macros.BuildMacroException;
import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider;
import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator;
import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator2;
import org.eclipse.cdt.newmake.core.IMakeBuilderInfo;
-import org.eclipse.cdt.newmake.internal.core.StreamMonitor;
-import org.eclipse.cdt.utils.CommandLineUtil;
import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
@@ -99,7 +68,6 @@ import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
@@ -108,25 +76,14 @@ import org.eclipse.core.runtime.jobs.Job;
public class CommonBuilder extends ACBuilder {
public final static String BUILDER_ID = ManagedBuilderCorePlugin.getUniqueIdentifier() + ".genmakebuilder"; //$NON-NLS-1$
- private static final String BUILD_ERROR = "ManagedMakeBuilder.message.error"; //$NON-NLS-1$
private static final String BUILD_FINISHED = "ManagedMakeBuilder.message.finished"; //$NON-NLS-1$
private static final String CONSOLE_HEADER = "ManagedMakeBuilder.message.console.header"; //$NON-NLS-1$
private static final String ERROR_HEADER = "GeneratedmakefileBuilder error ["; //$NON-NLS-1$
- private static final String MARKERS = "ManagedMakeBuilder.message.creating.markers"; //$NON-NLS-1$
private static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$
- private static final String NOTHING_BUILT = "ManagedMakeBuilder.message.no.build"; //$NON-NLS-1$
private static final String TRACE_FOOTER = "]: "; //$NON-NLS-1$
private static final String TRACE_HEADER = "GeneratedmakefileBuilder trace ["; //$NON-NLS-1$
private static final String TYPE_CLEAN = "ManagedMakeBuilder.type.clean"; //$NON-NLS-1$
private static final String TYPE_INC = "ManagedMakeBuider.type.incremental"; //$NON-NLS-1$
- private static final String WARNING_UNSUPPORTED_CONFIGURATION = "ManagedMakeBuilder.warning.unsupported.configuration"; //$NON-NLS-1$
- private static final String BUILD_CANCELLED = "ManagedMakeBuilder.message.cancelled"; //$NON-NLS-1$
- private static final String BUILD_FINISHED_WITH_ERRS = "ManagedMakeBuilder.message.finished.with.errs"; //$NON-NLS-1$
- private static final String BUILD_FAILED_ERR = "ManagedMakeBuilder.message.internal.builder.error"; //$NON-NLS-1$
- private static final String BUILD_STOPPED_ERR = "ManagedMakeBuilder.message.stopped.error"; //$NON-NLS-1$
- private static final String INTERNAL_BUILDER_HEADER_NOTE = "ManagedMakeBuilder.message.internal.builder.header.note"; //$NON-NLS-1$
- private static final String TYPE_REBUILD = "ManagedMakeBuider.type.rebuild"; //$NON-NLS-1$
- private static final String INTERNAL_BUILDER = "ManagedMakeBuilder.message.internal.builder"; //$NON-NLS-1$
public static boolean VERBOSE = false;
private static CfgBuildSet fBuildSet = new CfgBuildSet();
@@ -781,7 +738,15 @@ public class CommonBuilder extends ACBuilder {
if(status.isBuild()){
try {
- boolean isClean = invokeBuilder(kind, bInfo, monitor);
+ boolean isClean = builder.getBuildRunner().invokeBuild(
+ kind,
+ bInfo.getProject(),
+ bInfo.getConfiguration(),
+ builder,
+ bInfo.getConsole(),
+ this,
+ this,
+ monitor);
if (isClean) {
forgetLastBuiltState();
cfg.setRebuildState(true);
@@ -868,424 +833,6 @@ public class CommonBuilder extends ACBuilder {
}
}
-// private IConsole getConsole(IProject project, boolean bg){
-// IConsole console = CCorePlugin.getDefault().getConsole();
-// console.start(project);
-// return console;
-// }
- /**
- * called to invoke the MBS Internal Builder for building the given configuration
- *
- * @param monitor monitor
- */
- protected boolean invokeInternalBuilder(int kind, CfgBuildInfo bInfo,
- IProgressMonitor monitor) {
-
- IBuilder builder = bInfo.getBuilder();
- IConfiguration cfg = bInfo.getConfiguration();
- boolean isParallel = builder.isParallelBuildOn() && builder.getParallelizationNum() > 1;
-// boolean buildIncrementaly = true;
- boolean resumeOnErr = !builder.isStopOnError();
-
- // Get the project and make sure there's a monitor to cancel the build
- IProject currentProject = bInfo.getProject();
- if (monitor == null) {
- monitor = new NullProgressMonitor();
- }
-
- String[] msgs = new String[2];
- msgs[0] = ManagedMakeMessages.getResourceString(INTERNAL_BUILDER);
- msgs[1] = currentProject.getName();
-
- ConsoleOutputStream consoleOutStream = null;
- IConsole console = null;
- OutputStream epmOutputStream = null;
- try {
- int flags = 0;
- IResourceDelta delta = getDelta(currentProject);
- BuildStateManager bsMngr = BuildStateManager.getInstance();
- IProjectBuildState pBS = bsMngr.getProjectBuildState(currentProject);
- IConfigurationBuildState cBS = pBS.getConfigurationBuildState(cfg.getId(), true);
-
-// if(delta != null){
- flags = BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS;
-// delta = getDelta(currentProject);
-// }
-
- boolean buildIncrementaly = delta != null;
-
- // Get a build console for the project
- StringBuffer buf = new StringBuffer();
-// console = CCorePlugin.getDefault().getConsole();
-// console.start(currentProject);
- console = bInfo.getConsole();
- consoleOutStream = console.getOutputStream();
- String[] consoleHeader = new String[3];
- if(buildIncrementaly)
- consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_INC);
- else
- consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_REBUILD);
-
- consoleHeader[1] = cfg.getName();
- consoleHeader[2] = currentProject.getName();
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader));
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
-
- buf.append(ManagedMakeMessages.getResourceString(INTERNAL_BUILDER_HEADER_NOTE));
- buf.append("\n"); //$NON-NLS-1$
-
- if(!cfg.isSupported()){
- buf.append(ManagedMakeMessages.getFormattedString(WARNING_UNSUPPORTED_CONFIGURATION,new String[] {cfg.getName(),cfg.getToolChain().getName()}));
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- }
- consoleOutStream.write(buf.toString().getBytes());
- consoleOutStream.flush();
-
- IBuildDescription des = BuildDescriptionManager.createBuildDescription(cfg, cBS, delta, flags);
-
- DescriptionBuilder dBuilder = null;
- if (!isParallel)
- dBuilder = new DescriptionBuilder(des, buildIncrementaly, resumeOnErr, cBS);
-
- if(isParallel || dBuilder.getNumCommands() > 0) {
- // Remove all markers for this project
- removeAllMarkers(currentProject);
-
- // Hook up an error parser manager
- String[] errorParsers = builder.getErrorParsers();
- ErrorParserManager epm = new ErrorParserManager(currentProject, des.getDefaultBuildDirLocationURI(), this, errorParsers);
- epm.setOutputStream(consoleOutStream);
- // This variable is necessary to ensure that the EPM stream stay open
- // until we explicitly close it. See bug#123302.
- epmOutputStream = epm.getOutputStream();
-
- int status = 0;
-
- long t1 = System.currentTimeMillis();
- if (isParallel)
- status = ParallelBuilder.build(des, null, null, epmOutputStream, epmOutputStream, monitor, resumeOnErr, buildIncrementaly);
- else
- status = dBuilder.build(epmOutputStream, epmOutputStream, monitor);
- long t2 = System.currentTimeMillis();
-
- // Report either the success or failure of our mission
- buf = new StringBuffer();
-
- switch(status){
- case IBuildModelBuilder.STATUS_OK:
- buf.append(ManagedMakeMessages
- .getFormattedString(BUILD_FINISHED,
- currentProject.getName()));
- break;
- case IBuildModelBuilder.STATUS_CANCELLED:
- buf.append(ManagedMakeMessages
- .getResourceString(BUILD_CANCELLED));
- break;
- case IBuildModelBuilder.STATUS_ERROR_BUILD:
- String msg = resumeOnErr ?
- ManagedMakeMessages.getResourceString(BUILD_FINISHED_WITH_ERRS) :
- ManagedMakeMessages.getResourceString(BUILD_STOPPED_ERR);
- buf.append(msg);
- break;
- case IBuildModelBuilder.STATUS_ERROR_LAUNCH:
- default:
- buf.append(ManagedMakeMessages
- .getResourceString(BUILD_FAILED_ERR));
- break;
- }
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
-
- // Report time and number of threads used
- buf.append(ManagedMakeMessages.getFormattedString("CommonBuilder.6", Integer.toString((int)(t2 - t1)))); //$NON-NLS-1$
-// buf.append(t2 - t1);
-// buf.append(" ms. ");
- if (isParallel) {
- buf.append(ManagedMakeMessages.getFormattedString("CommonBuilder.7", Integer.toString(ParallelBuilder.lastThreadsUsed))); //$NON-NLS-1$
-// buf.append(ParallelBuilder.lastThreadsUsed);
- }
- 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();
- epmOutputStream.close();
- epmOutputStream = null;
- // Generate any error markers that the build has discovered
- monitor.subTask(ManagedMakeMessages
- .getResourceString(MARKERS));
-
- bsMngr.setProjectBuildState(currentProject, pBS);
- } else {
- buf = new StringBuffer();
- buf.append(ManagedMakeMessages.getFormattedString(NOTHING_BUILT, currentProject.getName()));
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
- consoleOutStream.write(buf.toString().getBytes());
- consoleOutStream.flush();
- }
-
- } catch (Exception e) {
- if(consoleOutStream != null){
- StringBuffer buf = new StringBuffer();
- String errorDesc = ManagedMakeMessages
- .getResourceString(BUILD_ERROR);
- buf.append(errorDesc);
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
- buf.append(e.getLocalizedMessage());
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
-
- try {
- consoleOutStream.write(buf.toString().getBytes());
- consoleOutStream.flush();
- } catch (IOException e1) {
- }
- }
- forgetLastBuiltState();
- } finally {
- if(epmOutputStream != null){
- try {
- epmOutputStream.close();
- } catch (IOException e) {
- }
- }
- if(consoleOutStream != null){
- try {
- consoleOutStream.close();
- } catch (IOException e) {
- }
- }
- monitor.done();
- }
- return false;
- }
-
- protected String[] calcEnvironment(IBuilder builder) throws CoreException{
- HashMap<String, String> envMap = new HashMap<String, String>();
- if (builder.appendEnvironment()) {
- ICConfigurationDescription cfgDes = ManagedBuildManager.getDescriptionForConfiguration(builder.getParent().getParent());
- IEnvironmentVariableManager mngr = CCorePlugin.getDefault().getBuildEnvironmentManager();
- IEnvironmentVariable[] vars = mngr.getVariables(cfgDes, true);
- for (IEnvironmentVariable var : vars) {
- envMap.put(var.getName(), var.getValue());
- }
- }
- // Add variables from build info
- Map<String, String> builderEnv = builder.getExpandedEnvironment();
- if(builderEnv != null)
- envMap.putAll(builderEnv);
- List<String> strings= new ArrayList<String>(envMap.size());
- for (Entry<String, String> entry : envMap.entrySet()) {
- StringBuffer buffer= new StringBuffer(entry.getKey());
- buffer.append('=').append(entry.getValue());
- strings.add(buffer.toString());
- }
- return strings.toArray(new String[strings.size()]);
- }
-
-
-// /**
-// * Called to invoke the MBS Internal Builder for building the given resources in
-// * the given configuration
-// *
-// * This method is considered experimental. Clients implementing this API should expect
-// * possible changes in the API.
-// *
-// * @param cfg configuration to be built
-// * @param buildIncrementaly if true, incremental build will be performed,
-// * only files that need rebuild will be built.
-// * If false, full rebuild will be performed
-// * @param resumeOnErr if true, build will continue in case of error while building.
-// * If false the build will stop on the first error
-// * @param monitor Progress monitor. For every resource built this monitor will consume one unit of work.
-// */
-// private void invokeInternalBuilder(IResource[] resourcesToBuild, CfgBuildInfo bInfo,
-// boolean buildIncrementaly,
-// boolean resumeOnErr,
-// boolean initNewConsole,
-// boolean printFinishedMessage,
-// IProgressMonitor monitor) {
-// // Get the project and make sure there's a monitor to cancel the build
-//
-// IProject currentProject = bInfo.getProject();
-// IConfiguration cfg = bInfo.getConfiguration();
-//
-// if (monitor == null) {
-// monitor = new NullProgressMonitor();
-// }
-//
-// try {
-// int flags = 0;
-// IResourceDelta delta = null;
-//
-// if(buildIncrementaly){
-// flags = BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS;
-// delta = getDelta(currentProject);
-// }
-//
-//
-// String[] msgs = new String[2];
-// msgs[0] = ManagedMakeMessages.getResourceString(INTERNAL_BUILDER);
-// msgs[1] = currentProject.getName();
-//
-//// IConsole console = CCorePlugin.getDefault().getConsole();
-//// console.start(currentProject);
-// IConsole console = bInfo.getConsole();
-// ConsoleOutputStream consoleOutStream = console.getOutputStream();
-//
-// StringBuffer buf = new StringBuffer();
-//
-// if (initNewConsole) {
-// if (buildIncrementaly)
-// buf.append(ManagedMakeMessages.getResourceString("GeneratedMakefileBuilder.buildSelectedIncremental")); //$NON-NLS-1$
-// else
-// buf.append(ManagedMakeMessages.getResourceString("GeneratedMakefileBuilder.buildSelectedRebuild")); //$NON-NLS-1$
-//
-//
-// buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
-// buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
-//
-// buf.append(ManagedMakeMessages
-// .getResourceString(INTERNAL_BUILDER_HEADER_NOTE));
-// buf.append("\n"); //$NON-NLS-1$
-// }
-//
-//
-// if(!cfg.isSupported()){
-// buf.append(ManagedMakeMessages.getFormattedString(WARNING_UNSUPPORTED_CONFIGURATION,new String[] {cfg.getName(),cfg.getToolChain().getName()}));
-// buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
-// buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
-// }
-// consoleOutStream.write(buf.toString().getBytes());
-// consoleOutStream.flush();
-//
-// // Remove all markers for this project
-// // TODO remove only necessary markers
-// removeAllMarkers(currentProject);
-//
-// IBuildDescription des = BuildDescriptionManager.createBuildDescription(cfg, delta, flags);
-//
-// // Hook up an error parser manager
-// String[] errorParsers = cfg.getErrorParserList();
-// ErrorParserManager epm = new ErrorParserManager(currentProject, des.getDefaultBuildDirLocationURI(), this, errorParsers);
-// epm.setOutputStream(consoleOutStream);
-// // This variable is necessary to ensure that the EPM stream stay open
-// // until we explicitly close it. See bug#123302.
-// OutputStream epmOutputStream = epm.getOutputStream();
-//
-// boolean errorsFound = false;
-//
-// doneBuild: for (int k = 0; k < resourcesToBuild.length; k++) {
-// IBuildResource buildResource = des
-// .getBuildResource(resourcesToBuild[k]);
-//
-//// step collector
-// Set<IBuildStep> dependentSteps = new HashSet<IBuildStep>();
-//
-//// get dependent IO types
-// IBuildIOType depTypes[] = buildResource.getDependentIOTypes();
-//
-//// iterate through each type and add the step the type belongs to to the collector
-// for (IBuildIOType type : depTypes) {
-// if(type != null && type.getStep() != null)
-// dependentSteps.add(type.getStep());
-// }
-//
-// monitor.subTask(ManagedMakeMessages.getResourceString("GeneratedMakefileBuilder.buildingFile") + resourcesToBuild[k].getProjectRelativePath()); //$NON-NLS-1$
-//
-// // iterate through all build steps
-// Iterator stepIter = dependentSteps.iterator();
-//
-// while(stepIter.hasNext())
-// {
-// IBuildStep step = (IBuildStep) stepIter.next();
-//
-// StepBuilder stepBuilder = new StepBuilder(step, null);
-//
-// int status = stepBuilder.build(consoleOutStream, epmOutputStream, new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-//
-// // Refresh the output resource without allowing the user to cancel.
-// // This is probably unkind, but short of this there is no way to ensure
-// // the UI is up-to-date with the build results
-//
-// for (IBuildIOType type : step.getOutputIOTypes()) {
-// for (IBuildResource res : type.getResources()) {
-// IFile file = currentProject.getFile(res.getLocation());
-// file.refreshLocal(IResource.DEPTH_INFINITE, null);
-// }
-// }
-//
-// // check status
-//
-// switch (status) {
-// case IBuildModelBuilder.STATUS_OK:
-// // don't print anything if the step was successful,
-// // since the build might not be done as a whole
-// break;
-// case IBuildModelBuilder.STATUS_CANCELLED:
-// buf.append(ManagedMakeMessages
-// .getResourceString(BUILD_CANCELLED));
-// break doneBuild;
-// case IBuildModelBuilder.STATUS_ERROR_BUILD:
-// errorsFound = true;
-// if (!resumeOnErr) {
-// buf.append(ManagedMakeMessages
-// .getResourceString(BUILD_STOPPED_ERR));
-// break doneBuild;
-// }
-// break;
-// case IBuildModelBuilder.STATUS_ERROR_LAUNCH:
-// default:
-// buf.append(ManagedMakeMessages
-// .getResourceString(BUILD_FAILED_ERR));
-// break doneBuild;
-// }
-// }
-//
-//
-// }
-//
-// // check status
-// // Report either the success or failure of our mission
-// buf = new StringBuffer();
-//
-//
-// buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$//$NON-NLS-2$
-//
-// if (printFinishedMessage) {
-// if (errorsFound) {
-// buf.append(ManagedMakeMessages
-// .getResourceString(BUILD_FAILED_ERR));
-// } else {
-// buf
-// .append(ManagedMakeMessages
-// .getResourceString("GeneratedMakefileBuilder.buildResourcesFinished")); //$NON-NLS-1$
-// }
-// }
-//
-// // Write message on the console
-// consoleOutStream.write(buf.toString().getBytes());
-// consoleOutStream.flush();
-// epmOutputStream.close();
-//
-// // Generate any error markers that the build has discovered
-////TODO: addBuilderMarkers(epm);
-// epm.reportProblems();
-// consoleOutStream.close();
-// } catch (Exception e) {
-// StringBuffer buf = new StringBuffer();
-// 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(e.getLocalizedMessage()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
-//
-// forgetLastBuiltState();
-// } finally {
-//// getGenerationProblems().clear();
-// }
-// }
-
protected BuildStatus performPostbuildGeneration(int kind, CfgBuildInfo bInfo, BuildStatus buildStatus, IProgressMonitor monitor) throws CoreException{
IBuilder builder = bInfo.getBuilder();
if(builder.isInternalBuilder())
@@ -1562,7 +1109,15 @@ public class CommonBuilder extends ACBuilder {
ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
- invokeMake(CLEAN_BUILD, bInfo, monitor);
+ bInfo.fBuilder.getBuildRunner().invokeBuild(
+ CLEAN_BUILD,
+ bInfo.getProject(),
+ bInfo.getConfiguration(),
+ bInfo.getBuilder(),
+ bInfo.getConsole(),
+ CommonBuilder.this,
+ CommonBuilder.this,
+ monitor);
}
}, rule, IWorkspace.AVOID_UPDATE, monitor);
} catch (CoreException e) {
@@ -1578,7 +1133,15 @@ public class CommonBuilder extends ACBuilder {
backgroundJob.setRule(rule);
backgroundJob.schedule();
} else {
- invokeMake(CLEAN_BUILD, bInfo, monitor);
+ bInfo.fBuilder.getBuildRunner().invokeBuild(
+ CLEAN_BUILD,
+ bInfo.getProject(),
+ bInfo.getConfiguration(),
+ bInfo.getBuilder(),
+ bInfo.getConsole(),
+ this,
+ this,
+ monitor);
}
}
@@ -1720,261 +1283,6 @@ public class CommonBuilder extends ACBuilder {
}
}
- protected boolean invokeBuilder(int kind, CfgBuildInfo bInfo, IProgressMonitor monitor) throws CoreException {
- if(bInfo.getBuilder().isInternalBuilder())
- return invokeInternalBuilder(kind, bInfo, monitor);
- return invokeMake(kind, bInfo, monitor);
- }
-
- private ConsoleOutputSniffer createBuildOutputSniffer(OutputStream outputStream,
- OutputStream errorStream,
- IProject project,
- IConfiguration cfg,
- IPath workingDirectory,
- IMarkerGenerator markerGenerator,
- IScannerInfoCollector collector){
- ICfgScannerConfigBuilderInfo2Set container = CfgScannerConfigProfileManager.getCfgScannerConfigBuildInfo(cfg);
- Map<CfgInfoContext, IScannerConfigBuilderInfo2> map = container.getInfoMap();
- List<IScannerInfoConsoleParser> clParserList = new ArrayList<IScannerInfoConsoleParser>();
-
- if(container.isPerRcTypeDiscovery()){
- for (IResourceInfo rcInfo : cfg.getResourceInfos()) {
- ITool tools[];
- if(rcInfo instanceof IFileInfo){
- tools = ((IFileInfo)rcInfo).getToolsToInvoke();
- } else {
- tools = ((IFolderInfo)rcInfo).getFilteredTools();
- }
- for (ITool tool : tools) {
- IInputType[] types = tool.getInputTypes();
-
- if(types.length != 0){
- for (IInputType type : types) {
- CfgInfoContext c = new CfgInfoContext(rcInfo, tool, type);
- contributeToConsoleParserList(project, map, c, workingDirectory, markerGenerator, collector, clParserList);
- }
- } else {
- CfgInfoContext c = new CfgInfoContext(rcInfo, tool, null);
- contributeToConsoleParserList(project, map, c, workingDirectory, markerGenerator, collector, clParserList);
- }
- }
- }
- }
-
- if(clParserList.size() == 0){
- contributeToConsoleParserList(project, map, new CfgInfoContext(cfg), workingDirectory, markerGenerator, collector, clParserList);
- }
-
- if(clParserList.size() != 0){
- return new ConsoleOutputSniffer(outputStream, errorStream,
- clParserList.toArray(new IScannerInfoConsoleParser[clParserList.size()]));
- }
-
- return null;
- }
-
- private boolean contributeToConsoleParserList(
- IProject project,
- Map<CfgInfoContext, IScannerConfigBuilderInfo2> map,
- CfgInfoContext context,
- IPath workingDirectory,
- IMarkerGenerator markerGenerator,
- IScannerInfoCollector collector,
- List<IScannerInfoConsoleParser> parserList){
- IScannerConfigBuilderInfo2 info = map.get(context);
- InfoContext ic = context.toInfoContext();
- boolean added = false;
- if (info != null &&
- info.isAutoDiscoveryEnabled() &&
- info.isBuildOutputParserEnabled()) {
-
- String id = info.getSelectedProfileId();
- ScannerConfigProfile profile = ScannerConfigProfileManager.getInstance().getSCProfileConfiguration(id);
- if(profile.getBuildOutputProviderElement() != null){
- // get the make builder console parser
- SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance().
- getSCProfileInstance(project, ic, id);
-
- IScannerInfoConsoleParser clParser = profileInstance.createBuildOutputParser();
- if (collector == null) {
- collector = profileInstance.getScannerInfoCollector();
- }
- if(clParser != null){
- clParser.startup(project, workingDirectory, collector,
- info.isProblemReportingEnabled() ? markerGenerator : null);
- parserList.add(clParser);
- added = true;
- }
-
- }
- }
-
- return added;
- }
-
- protected boolean invokeMake(int kind, CfgBuildInfo bInfo, IProgressMonitor monitor) throws CoreException {
- boolean isClean = false;
- IProject currProject = bInfo.getProject();
- IBuilder builder = bInfo.getBuilder();
-
- if (monitor == null) {
- monitor = new NullProgressMonitor();
- }
- monitor.beginTask(ManagedMakeMessages.getResourceString("MakeBuilder.Invoking_Make_Builder") + currProject.getName(), 100); //$NON-NLS-1$
-
- try {
- IPath buildCommand = builder.getBuildCommand();
- if (buildCommand != null) {
-// IConsole console = CCorePlugin.getDefault().getConsole();
-// console.start(currProject);
- IConsole console = bInfo.getConsole();
-
- OutputStream cos = console.getOutputStream();
- StringBuffer buf = new StringBuffer();
-
- String[] consoleHeader = new String[3];
- switch (kind) {
- case FULL_BUILD:
- case INCREMENTAL_BUILD:
- case AUTO_BUILD:
- consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_INC);
- break;
- case CLEAN_BUILD:
- consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_CLEAN);
- break;
- }
-
- IConfiguration cfg = bInfo.getConfiguration();
- consoleHeader[1] = cfg.getName();
- consoleHeader[2] = currProject.getName();
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader));
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
-
- if(!cfg.isSupported()){
- buf.append(ManagedMakeMessages.getFormattedString(WARNING_UNSUPPORTED_CONFIGURATION,new String[] {cfg.getName(),cfg.getToolChain().getName()}));
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- buf.append(System.getProperty("line.separator", "\n")); //$NON-NLS-1$ //$NON-NLS-2$
- }
- cos.write(buf.toString().getBytes());
- cos.flush();
-
- // remove all markers for this project
- removeAllMarkers(currProject);
-
- IPath workingDirectory = ManagedBuildManager.getBuildLocation(cfg, builder);
- URI workingDirectoryURI = ManagedBuildManager.getBuildLocationURI(cfg, builder);
-
- String[] targets = getTargets(kind, builder);
- if (targets.length != 0 && targets[targets.length - 1].equals(builder.getCleanBuildTarget()))
- isClean = true;
-
- String errMsg = null;
- ICommandLauncher launcher = builder.getCommandLauncher();
- launcher.setProject(currProject);
- // Print the command for visual interaction.
- launcher.showCommand(true);
-
- // Set the environment
- String[] env = calcEnvironment(builder);
- String[] buildArguments = targets;
-
- String[] newArgs = argumentsToArray(builder.getBuildArguments());
- buildArguments = new String[targets.length + newArgs.length];
- System.arraycopy(newArgs, 0, buildArguments, 0, newArgs.length);
- System.arraycopy(targets, 0, buildArguments, newArgs.length, targets.length);
-
-// MakeRecon recon = new MakeRecon(buildCommand, buildArguments, env, workingDirectory, makeMonitor, cos);
-// recon.invokeMakeRecon();
-// cos = recon;
- QualifiedName qName = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "progressMonitor"); //$NON-NLS-1$
- Integer last = (Integer)currProject.getSessionProperty(qName);
- if (last == null) {
- last = new Integer(100);
- }
- ErrorParserManager epm = new ErrorParserManager(currProject, workingDirectoryURI, this, builder.getErrorParsers());
- epm.setOutputStream(cos);
- StreamMonitor streamMon = new StreamMonitor(new SubProgressMonitor(monitor, 100), epm, last.intValue());
- OutputStream stdout = streamMon;
- OutputStream stderr = streamMon;
- // Sniff console output for scanner info
-// ICfgScannerConfigBuilderInfo2Set container = CfgScannerConfigProfileManager.getCfgScannerConfigBuildInfo(cfg);
-// CfgInfoContext context = new CfgInfoContext(cfg);
-// InfoContext baseContext;
-// IScannerConfigBuilderInfo2 info = container.getInfo(context);
-// if(info == null){
-// baseContext = new InfoContext(currProject);
-// } else {
-// baseContext = context.toInfoContext();
-// }
-// ConsoleOutputSniffer sniffer = ScannerInfoConsoleParserFactory.getMakeBuilderOutputSniffer(
-// stdout, stderr, currProject, baseContext, workingDirectory, info, this, null);
- ConsoleOutputSniffer sniffer = createBuildOutputSniffer(stdout, stderr, currProject, cfg, workingDirectory, this, null);
- OutputStream consoleOut = (sniffer == null ? stdout : sniffer.getOutputStream());
- OutputStream consoleErr = (sniffer == null ? stderr : sniffer.getErrorStream());
- Process p = launcher.execute(buildCommand, buildArguments, env, workingDirectory, monitor);
- if (p != null) {
- try {
- // Close the input of the Process explicitly.
- // We will never write to it.
- p.getOutputStream().close();
- } catch (IOException e) {
- }
- // Before launching give visual cues via the monitor
- monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Invoking_Command") + launcher.getCommandLine()); //$NON-NLS-1$
- if (launcher.waitAndRead(consoleOut, consoleErr, new SubProgressMonitor(monitor, 0))
- != ICommandLauncher.OK)
- errMsg = launcher.getErrorMessage();
- monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Updating_project")); //$NON-NLS-1$
-
- try {
- // Do not allow the cancel of the refresh, since the builder is external
- // to Eclipse, files may have been created/modified and we will be out-of-sync.
- // The caveat is for hugue projects, it may take sometimes at every build.
- currProject.refreshLocal(IResource.DEPTH_INFINITE, null);
- } catch (CoreException e) {
- }
- } else {
- errMsg = launcher.getErrorMessage();
- }
- currProject.setSessionProperty(qName, !monitor.isCanceled() && !isClean ? new Integer(streamMon.getWorkDone()) : null);
-
- if (errMsg != null) {
- buf = new StringBuffer(buildCommand.toString() + " "); //$NON-NLS-1$
- for (String arg : buildArguments) {
- buf.append(arg);
- buf.append(' ');
- }
-
- String errorDesc = ManagedMakeMessages.getFormattedString("MakeBuilder.buildError", buf.toString()); //$NON-NLS-1$
- buf = new StringBuffer(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$
- cos.write(buf.toString().getBytes());
- cos.flush();
- }
-
- stdout.close();
- stderr.close();
-
- monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Creating_Markers")); //$NON-NLS-1$
- consoleOut.close();
- consoleErr.close();
- cos.close();
- }
- } catch (Exception e) {
- ManagedBuilderCorePlugin.log(e);
- throw new CoreException(new Status(IStatus.ERROR,
- ManagedBuilderCorePlugin.getUniqueIdentifier(),
- e.getLocalizedMessage(),
- e));
- } finally {
- monitor.done();
- }
- return (isClean);
- }
-
/**
* Check whether the build has been canceled.
*/
@@ -1996,65 +1304,6 @@ public class CommonBuilder extends ACBuilder {
return true;
}
- protected String[] getTargets(int kind, IBuilder builder) {
- String targetsArray[] = null;
-
- if(kind != CLEAN_BUILD && !builder.isCustomBuilder() && builder.isManagedBuildOn()){
- IConfiguration cfg = builder.getParent().getParent();
- String preBuildStep = cfg.getPrebuildStep();
- try {
- preBuildStep = ManagedBuildManager.getBuildMacroProvider().resolveValueToMakefileFormat(
- preBuildStep,
- "", //$NON-NLS-1$
- " ", //$NON-NLS-1$
- IBuildMacroProvider.CONTEXT_CONFIGURATION,
- cfg);
- } catch (BuildMacroException e) {
- }
-
- if(preBuildStep != null && preBuildStep.length() != 0){
- targetsArray = new String[]{"pre-build", "main-build"}; //$NON-NLS-1$ //$NON-NLS-2$
- }
- }
-
- if(targetsArray == null){
- String targets = ""; //$NON-NLS-1$
- switch (kind) {
- case IncrementalProjectBuilder.AUTO_BUILD :
- targets = builder.getAutoBuildTarget();
- break;
- case IncrementalProjectBuilder.INCREMENTAL_BUILD : // now treated as the same!
- case IncrementalProjectBuilder.FULL_BUILD :
- targets = builder.getIncrementalBuildTarget();
- break;
- case IncrementalProjectBuilder.CLEAN_BUILD :
- targets = builder.getCleanBuildTarget();
- break;
- }
-
- targetsArray = argumentsToArray(targets);
- }
-
- return targetsArray;
- }
-
- /**
- * Parsing arguments in a shell style
- */
- private String[] argumentsToArray(String args) {
- return CommandLineUtil.argumentsToArray(args);
- }
-
- private void removeAllMarkers(IProject currProject) throws CoreException {
- IWorkspace workspace = currProject.getWorkspace();
-
- // remove all markers
- IMarker[] markers = currProject.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
- if (markers != null) {
- workspace.deleteMarkers(markers);
- }
- }
-
/**
* Only lock the workspace is this is a ManagedBuild, or this project references others.
*/

Back to the top