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 3a60bedc114..9727eb04ade 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 @@ -75,13 +75,16 @@ public interface IBuilder extends IHoldsOptions, IMakeBuilderInfo { static final String ATTRIBUTE_CUSTOMIZED_ERROR_PARSERS = "customizedErrorParsers"; //$NON-NLS-1$ static final String ATTRIBUTE_CUSTOM_PROPS = "customBuilderProperties"; //$NON-NLS-1$ - -// static final String ATTRIBUTE_CUSTOMIZED_ERROR_PARSERS = "customizedErrorParsers"; //$NON-NLS-1$ static final String ATTRIBUTE_IGNORE_ERR_CMD = "ignoreErrCmd"; //$NON-NLS-1$ static final String ATTRIBUTE_STOP_ON_ERR = "stopOnErr"; //$NON-NLS-1$ + static final String ATTRIBUTE_PARALLEL_BUILD_CMD = "parallelBuildCmd"; //$NON-NLS-1$ static final String ATTRIBUTE_PARALLELIZATION_NUMBER = "parallelizationNumber"; //$NON-NLS-1$ + /** @since 8.1 */ + static final String VALUE_OPTIMAL = "optimal"; //$NON-NLS-1$ + /** @since 8.1 */ + static final String VALUE_UNLIMITED = "unlimited"; //$NON-NLS-1$ static final String ATTRIBUTE_PARALLEL_BUILD_ON = "parallelBuildOn"; //$NON-NLS-1$ static final String PARALLEL_PATTERN_NUM = "*"; //$NON-NLS-1$ static final String PARALLEL_PATTERN_NUM_START = "["; //$NON-NLS-1$ @@ -92,15 +95,9 @@ public interface IBuilder extends IHoldsOptions, IMakeBuilderInfo { static final String DEFAULT_TARGET_INCREMENTAL = "all"; //$NON-NLS-1$ static final String DEFAULT_TARGET_CLEAN = "clean"; //$NON-NLS-1$ static final String DEFAULT_TARGET_AUTO = "all"; //$NON-NLS-1$ - - /** - * @since 6.0 - */ + /** @since 6.0 */ static final String ATTRIBUTE_COMMAND_LAUNCHER = "commandLauncher"; //$NON-NLS-1$ - - /** - * @since 8.0 - */ + /** @since 8.0 */ static final String ATTRIBUTE_BUILD_RUNNER = "buildRunner"; //$NON-NLS-1$ /** diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java index a35d89b66cd..f1307bb6bac 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IMultiConfiguration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 Intel Corporation and others. + * Copyright (c) 2007, 2011 Intel Corporation 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 @@ -13,19 +13,62 @@ package org.eclipse.cdt.managedbuilder.core; import org.eclipse.cdt.core.settings.model.ICMultiItemsHolder; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildProperty; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue; +import org.eclipse.cdt.managedbuilder.internal.core.Builder; +import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; /** + * This class is to combine multiple configurations to one to support + * selection of multiple configurations on property pages. + * * @noextend This class is not intended to be subclassed by clients. * @noimplement This interface is not intended to be implemented by clients. */ public interface IMultiConfiguration extends IConfiguration, ICMultiItemsHolder { + /** + * Check if the configuration's builder is operating in parallel mode. + * @return {@code true} if parallel mode is enabled, {@code false} otherwise. + */ boolean getParallelDef(); - void setParallelDef(boolean def); - - int getParallelNumber(); - void setParallelNumber(int num); + /** + * Set parallel execution mode for the configuration's builder. + * @see Builder#setParallelBuildOn(boolean) + * + * @param parallel - the flag to enable or disable parallel mode. + */ + void setParallelDef(boolean parallel); + + /** + * Returns maximum number of parallel threads/jobs used by the configuration's builder. + * Note that this function can return negative value to indicate "optimal" number. + * + * @see #setParallelDef(boolean) + * @see Builder#getParallelizationNum() + * + * @return - maximum number of parallel threads or jobs used by the builder or negative number. + * For exact interpretation see table in {@link IMakeCommonBuildInfo#getParallelizationNum()} + */ + int getParallelNumber(); + /** + * Sets maximum number of parallel threads/jobs to be used by builder. + * Note that the number will be set only if the builder is in "parallel" + * mode. + * + * @param jobs - maximum number of jobs or threads. If the number is 0 + * or negative, negative "optimal" number will be set, see + * {@link Builder#getOptimalParallelJobNum()}. + */ + void setParallelNumber(int jobs); + /** + * returns the Internal Builder parallel mode + * if true, internal builder will work in parallel mode + * otherwise it will use only one thread + * @return boolean + * + * @deprecated since CDT 9.0. Use {@link #getParallelDef()} + */ + @Deprecated boolean getInternalBuilderParallel(); boolean isInternalBuilderEnabled(); 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 index b8f525e1a1b..502c13732da 100644 --- 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 @@ -65,7 +65,7 @@ public class InternalBuildRunner extends AbstractBuildRunner { 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 isParallel = Math.abs(builder.getParallelizationNum()) > 1; // boolean buildIncrementaly = true; boolean resumeOnErr = !builder.isStopOnError(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildProcessManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildProcessManager.java index 28a31ae2d5a..ac5dfc450de 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildProcessManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/BuildProcessManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2007 Intel Corporation and others. + * Copyright (c) 2006, 2011 Intel Corporation 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 @@ -11,10 +11,6 @@ package org.eclipse.cdt.managedbuilder.internal.buildmodel; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; @@ -23,9 +19,6 @@ import java.util.Map.Entry; import java.util.Set; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildCommand; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable; -import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; @@ -42,11 +35,6 @@ public class BuildProcessManager { protected ProcessLauncher[] processes; protected int maxProcesses; -// Number of CPUs is not dependent of object instance. -// But user can change UI settings for processes number. -// So we cannot set procNumber directly to maxProcesses. - static int procNumber = 0; - /** * Initializes process manager * @@ -152,40 +140,10 @@ public class BuildProcessManager { /** * @return Number of processors detected + * @deprecated since CDT 9.0 - just use Runtime.getRuntime().availableProcessors() */ + @Deprecated static public int checkCPUNumber() { - if (procNumber > 0) return procNumber; - - procNumber = 1; - int x = 0; - String os = System.getProperty("os.name"); //$NON-NLS-1$ - if (os != null) { - if (os.startsWith("Win")) { //$NON-NLS-1$ - IEnvironmentVariableProvider evp = ManagedBuildManager.getEnvironmentVariableProvider(); - if (evp != null) { - IBuildEnvironmentVariable var = evp.getVariable("NUMBER_OF_PROCESSORS", null, false, false); //$NON-NLS-1$ - if (var != null) { - try { - x = new Integer(var.getValue()).intValue(); - if (x > 0) { procNumber = x; } - } catch (NumberFormatException e) {} // fallthrough and return default - } - } - } else { // linux - String p = "/proc/cpuinfo"; //$NON-NLS-1$ - try { - BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(p))); - String s; - while ((s = r.readLine() ) != null ) - { if (s.startsWith("processor\t:")) x++; } //$NON-NLS-1$ - r.close(); - if (x > 0) { procNumber = x; } - } - catch (IOException e) {} // fallthrough and return default - } - } - if(DbgUtil.DEBUG) - DbgUtil.trace("Number of processors detected: " + procNumber); //$NON-NLS-1$ - return procNumber; + return Runtime.getRuntime().availableProcessors(); } } \ No newline at end of file diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java index 782c3d59075..7dfcedf63c4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/ParallelBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Intel Corporation and others. + * Copyright (c) 2006, 2011 Intel Corporation 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 @@ -91,6 +91,7 @@ public class ParallelBuilder { return step.hashCode(); } + @Override public int compareTo(BuildQueueElement elem) { if (elem == null) throw new NullPointerException(); @@ -205,10 +206,7 @@ public class ParallelBuilder { if(cwd == null) cwd = des.getDefaultBuildDirLocation(); int threads = 1; if (cfg instanceof Configuration) { - if (((Configuration)cfg).getParallelDef()) - threads = BuildProcessManager.checkCPUNumber(); - else - threads = ((Configuration)cfg).getParallelNumber(); + threads = Math.abs(((Configuration)cfg).getParallelNumber()); } ParallelBuilder builder = new ParallelBuilder(cwd, dirs, out, err, monitor, resumeOnErrors, buildIncrementally); builder.enqueueAll(des); 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 bb9f105b626..22172cf3b8a 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 @@ -40,10 +40,10 @@ 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.internal.core.SafeStringInterner; +import org.eclipse.cdt.managedbuilder.core.AbstractBuildRunner; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.ExternalBuildRunner; import org.eclipse.cdt.managedbuilder.core.IBuildObject; -import org.eclipse.cdt.managedbuilder.core.AbstractBuildRunner; import org.eclipse.cdt.managedbuilder.core.IBuilder; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement; @@ -64,6 +64,7 @@ import org.eclipse.cdt.managedbuilder.macros.IReservedMacroNameSupplier; import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator; import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator2; import org.eclipse.cdt.managedbuilder.makegen.gnu.GnuMakefileGenerator; +import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; @@ -79,7 +80,6 @@ import org.eclipse.core.variables.VariablesPlugin; import org.osgi.framework.Version; public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider, IRealBuildObjectAssociation { - private static final String EMPTY_STRING = ""; //$NON-NLS-1$ // Superclass @@ -119,10 +119,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider private HashMap customBuildProperties; // private Boolean isWorkspaceBuildPath; private String ignoreErrCmd; - private String parallelBuildCmd; private Boolean stopOnErr; - private Integer parallelNum; - private Boolean parallelBuildOn; + // parallelization + private String parallelBuildCmd; + private Boolean isParallelBuildEnabled; + private Integer parallelJobsNumber; // negative number denotes "optimal" value, see getOptimalParallelJobNum() + private boolean isTest; // Miscellaneous @@ -327,9 +329,10 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider stopOnErr = builder.stopOnErr; ignoreErrCmd = builder.ignoreErrCmd; + + isParallelBuildEnabled = builder.isParallelBuildEnabled; + parallelJobsNumber = builder.parallelJobsNumber; parallelBuildCmd = builder.parallelBuildCmd; - parallelNum = builder.parallelNum; - parallelBuildOn = builder.parallelBuildOn; if(builder.outputEntries != null){ outputEntries = builder.outputEntries.clone(); @@ -372,17 +375,15 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } catch (CoreException e) { } } - if(getParallelizationNum() != builder.getParallelizationNum() - && supportsParallelBuild()){ + if (isParallelBuildOn() != builder.isParallelBuildOn() && supportsParallelBuild()) { try { - setParallelizationNum(builder.getParallelizationNum()); + setParallelBuildOn(builder.isParallelBuildOn()); } catch (CoreException e) { } } - if(isParallelBuildOn() != builder.isParallelBuildOn() - && supportsParallelBuild()){ + if (getParallelizationNum() != builder.getParallelizationNum() && supportsParallelBuild()) { try { - setParallelBuildOn(builder.isParallelBuildOn()); + setParallelizationNum(builder.getParallelizationNum()); } catch (CoreException e) { } } @@ -552,23 +553,23 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider ignoreErrCmd = SafeStringInterner.safeIntern(element.getAttribute(ATTRIBUTE_IGNORE_ERR_CMD)); - tmp = element.getAttribute(ATTRIBUTE_STOP_ON_ERR); - if(tmp != null) - stopOnErr = Boolean.valueOf(tmp); - - parallelBuildCmd = SafeStringInterner.safeIntern(element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD)); - - tmp = element.getAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER); - if(tmp != null){ - try { - parallelNum = Integer.decode(tmp); - } catch (NumberFormatException e){ - } - } - tmp = element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_ON); - if(tmp != null) - parallelBuildOn = Boolean.valueOf(tmp); - + tmp = element.getAttribute(ATTRIBUTE_STOP_ON_ERR); + if (tmp != null) + stopOnErr = Boolean.valueOf(tmp); + + tmp = element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD); + if (tmp != null) + parallelBuildCmd = SafeStringInterner.safeIntern(tmp); + + tmp = element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_ON); + if (tmp != null) { + isParallelBuildEnabled = Boolean.valueOf(tmp); + if (isParallelBuildEnabled) { + tmp = element.getAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER); + decodeParallelizationNumber(element.getAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER)); + } + } + // Get the semicolon separated list of IDs of the error parsers errorParserIds = SafeStringInterner.safeIntern(element.getAttribute(IToolChain.ERROR_PARSERS)); @@ -618,6 +619,46 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider fBuildRunnerElement = ((DefaultManagedConfigElement)element).getConfigurationElement(); } + private String encodeParallelizationNumber(Integer jobsNumber) { + if (jobsNumber <= 0) + return VALUE_OPTIMAL; + + if (jobsNumber.equals(Integer.MAX_VALUE)) + return VALUE_UNLIMITED; + + return jobsNumber.toString(); + } + + private void decodeParallelizationNumber(String value) { + if (VALUE_OPTIMAL.equals(value)) { + parallelJobsNumber = -getOptimalParallelJobNum(); + } else if (VALUE_UNLIMITED.equals(value)) { + if (!isInternalBuilder()) { + parallelJobsNumber = Integer.MAX_VALUE; + } else { + ManagedBuilderCorePlugin.error("'unlimited' number of jobs is not allowed for Internal Builder, switching to 'optimal'"); + parallelJobsNumber = -getOptimalParallelJobNum(); + } + } else { + try { + parallelJobsNumber = Integer.decode(value); + } catch (NumberFormatException e) { + ManagedBuilderCorePlugin.log(e); + parallelJobsNumber = getOptimalParallelJobNum(); + } + if (parallelJobsNumber <= 0) { + // compatibility with legacy representation - it was that inconsistent + if (isInternalBuilder()) { + // "optimal" for Internal Builder + parallelJobsNumber = -getOptimalParallelJobNum(); + } else { + // unlimited for External Builder + parallelJobsNumber = Integer.MAX_VALUE; + } + } + } + } + /** * Initialize the builder information from the XML element * specified in the argument @@ -748,24 +789,22 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider if(element.getAttribute(ATTRIBUTE_IGNORE_ERR_CMD) != null) ignoreErrCmd = SafeStringInterner.safeIntern(element.getAttribute(ATTRIBUTE_IGNORE_ERR_CMD)); - tmp = element.getAttribute(ATTRIBUTE_STOP_ON_ERR); - if(tmp != null) - stopOnErr = Boolean.valueOf(tmp); - - if(element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD) != null) - parallelBuildCmd = SafeStringInterner.safeIntern(element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD)); - - tmp = element.getAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER); - if(tmp != null){ - try { - parallelNum = Integer.decode(tmp); - } catch (NumberFormatException e){ - } - } - - tmp = element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_ON); - if(tmp != null) - parallelBuildOn = Boolean.valueOf(tmp); + tmp = element.getAttribute(ATTRIBUTE_STOP_ON_ERR); + if (tmp != null) + stopOnErr = Boolean.valueOf(tmp); + + tmp = element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD); + if (tmp != null) + parallelBuildCmd = SafeStringInterner.safeIntern(tmp); + + tmp = element.getAttribute(ATTRIBUTE_PARALLEL_BUILD_ON); + if (tmp != null) { + isParallelBuildEnabled = Boolean.valueOf(tmp); + if (isParallelBuildEnabled) { + tmp = element.getAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER); + decodeParallelizationNumber(element.getAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER)); + } + } ICStorageElement[] children = element.getChildren(); for(int i = 0; i < children.length; i++){ @@ -869,16 +908,19 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider if(customBuildProperties != null) element.setAttribute(ATTRIBUTE_CUSTOM_PROPS, MapStorageElement.encodeMap(customBuildProperties)); - if(ignoreErrCmd != null) - element.setAttribute(ATTRIBUTE_IGNORE_ERR_CMD, ignoreErrCmd); - if(stopOnErr != null) - element.setAttribute(ATTRIBUTE_STOP_ON_ERR, stopOnErr.toString()); - if(parallelBuildCmd != null) - element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD, parallelBuildCmd); - if(parallelNum != null) - element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, parallelNum.toString()); - if(parallelBuildOn != null) - element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_ON, parallelBuildOn.toString()); + if (ignoreErrCmd != null) + element.setAttribute(ATTRIBUTE_IGNORE_ERR_CMD, ignoreErrCmd); + if (stopOnErr != null) + element.setAttribute(ATTRIBUTE_STOP_ON_ERR, stopOnErr.toString()); + + if (parallelBuildCmd != null) + element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD, parallelBuildCmd); + + if (isParallelBuildEnabled != null) + element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_ON, isParallelBuildEnabled.toString()); + if (isParallelBuildOn() && parallelJobsNumber != null) + element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, encodeParallelizationNumber(parallelJobsNumber)); + // Note: build file generator cannot be specified in a project file because // an IConfigurationElement is needed to load it! if (buildFileGeneratorElement != null) { @@ -965,13 +1007,18 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider if(customBuildProperties != null) element.setAttribute(ATTRIBUTE_CUSTOM_PROPS, MapStorageElement.encodeMap(customBuildProperties)); - if(getIgnoreErrCmdAttribute() != null) - element.setAttribute(ATTRIBUTE_IGNORE_ERR_CMD, getIgnoreErrCmdAttribute()); - element.setAttribute(ATTRIBUTE_STOP_ON_ERR, Boolean.valueOf(isStopOnError()).toString()); - if(getParrallelBuildCmd() != null) - element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD, getParrallelBuildCmd()); - element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, new Integer(getParallelizationNumAttribute()).toString()); - element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_ON, Boolean.valueOf(isParallelBuildOn()).toString()); + if (getIgnoreErrCmdAttribute() != null) + element.setAttribute(ATTRIBUTE_IGNORE_ERR_CMD, getIgnoreErrCmdAttribute()); + element.setAttribute(ATTRIBUTE_STOP_ON_ERR, Boolean.valueOf(isStopOnError()).toString()); + + if (parallelBuildCmd != null) + element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_CMD, parallelBuildCmd); + + if (isParallelBuildEnabled != null) + element.setAttribute(ATTRIBUTE_PARALLEL_BUILD_ON, isParallelBuildEnabled.toString()); + if (isParallelBuildOn() && parallelJobsNumber != null) + element.setAttribute(ATTRIBUTE_PARALLELIZATION_NUMBER, encodeParallelizationNumber(parallelJobsNumber)); + // Note: build file generator cannot be specified in a project file because // an IConfigurationElement is needed to load it! if (buildFileGeneratorElement != null) { @@ -995,6 +1042,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider * P A R E N T A N D C H I L D H A N D L I N G */ + @Override public IToolChain getParent() { return parent; } @@ -1003,6 +1051,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider * M O D E L A T T R I B U T E A C C E S S O R S */ + @Override public IBuilder getSuperClass() { return (IBuilder)superClass; } @@ -1012,6 +1061,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return (name == null && superClass != null) ? superClass.getName() : name; } + @Override public boolean isAbstract() { if (isAbstract != null) { return isAbstract.booleanValue(); @@ -1020,6 +1070,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } } + @Override public String getUnusedChildren() { if (unusedChildren != null) { return unusedChildren; @@ -1027,6 +1078,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return EMPTY_STRING; // Note: no inheritance from superClass } + @Override public String getCommand() { if (command == null) { // If I have a superClass, ask it @@ -1039,10 +1091,11 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return command; } + @Override public String getArguments() { String args = getArgumentsAttribute(); String stopOnErrCmd = getStopOnErrCmd(isStopOnError()); - String parallelBuildCmd = isParallelBuildOn() ? getParallelizationCmd(getParallelizationNum()) : EMPTY_STRING; + String parallelCmd = isParallelBuildOn() ? getParallelizationCmd(getParallelizationNum()) : EMPTY_STRING; String reversedStopOnErrCmd = getStopOnErrCmd(!isStopOnError()); String reversedParallelBuildCmd = !isParallelBuildOn() ? getParallelizationCmd(getParallelizationNum()) : EMPTY_STRING; @@ -1051,7 +1104,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider args = removeCmd(args, reversedParallelBuildCmd); args = addCmd(args, stopOnErrCmd); - args = addCmd(args, parallelBuildCmd); + args = addCmd(args, parallelCmd); return args != null ? args.trim() : null; } @@ -1121,10 +1174,19 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider }if(num == 0){ return EMPTY_STRING; } - - return processParallelPattern(pattern, num < 0, num); + // "unlimited" number of jobs results in not adding the number to parallelization cmd + // that behavior corresponds that of "make" flag "-j". + return processParallelPattern(pattern, num == Integer.MAX_VALUE, Math.abs(num)); } + /** + * This method turns the supplied pattern to parallelization command + * + * It supports 2 kinds of pattern where "*" is replaced with number of jobs: + *
  • Pattern 1 (supports "-j*"): "text*text" -> "text#text"
  • + *
  • Pattern 2 (supports "-[j*]"): "text[text*text]text" -> "texttext#texttext
  • + *
    Where # is num or empty if {@code empty} is {@code true}) + */ private String processParallelPattern(String pattern, boolean empty, int num){ int start = pattern.indexOf(PARALLEL_PATTERN_NUM_START); int end = -1; @@ -1190,6 +1252,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return args; } + @Override public String getErrorParserIds() { String ids = errorParserIds; if (ids == null) { @@ -1201,6 +1264,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return ids; } + @Override public String[] getErrorParserList() { String parserIDs = getErrorParserIds(); String[] errorParsers = null; @@ -1223,6 +1287,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return errorParsers; } + @Override public void setCommand(String cmd) { if(getCommand().equals(cmd)) return; if (cmd == null && command == null) return; @@ -1232,16 +1297,17 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } } + @Override public void setArguments(String newArgs) { if(getArguments().equals(newArgs)) return; if(newArgs != null){ String stopOnErrCmd = getStopOnErrCmd(isStopOnError()); - String parallelBuildCmd = isParallelBuildOn() ? getParallelizationCmd(getParallelizationNum()) : EMPTY_STRING; + String parallelCmd = isParallelBuildOn() ? getParallelizationCmd(getParallelizationNum()) : EMPTY_STRING; newArgs = removeCmd(newArgs, stopOnErrCmd); - newArgs = removeCmd(newArgs, parallelBuildCmd); + newArgs = removeCmd(newArgs, parallelCmd); } setArgumentsAttribute(newArgs); } @@ -1254,6 +1320,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } } + @Override public void setErrorParserIds(String ids) { String currentIds = getErrorParserIds(); if (ids == null && currentIds == null) return; @@ -1263,11 +1330,13 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } } + @Override public void setIsAbstract(boolean b) { isAbstract = new Boolean(b); setDirty(true); } + @Override public IConfigurationElement getBuildFileGeneratorElement() { if (buildFileGeneratorElement == null) { if (superClass != null) { @@ -1277,6 +1346,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return buildFileGeneratorElement; } + @Override public IManagedBuilderMakefileGenerator getBuildFileGenerator(){ IConfigurationElement element = getBuildFileGeneratorElement(); if (element != null) { @@ -1299,6 +1369,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } + @Override public void setBuildFileGeneratorElement(IConfigurationElement element) { buildFileGeneratorElement = element; setDirty(true); @@ -1344,6 +1415,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } } + @Override public String getConvertToId() { if (convertToId == null) { // If I have a superClass, ask it @@ -1356,6 +1428,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return convertToId; } + @Override public void setConvertToId(String convertToId) { if (convertToId == null && this.convertToId == null) return; if (convertToId == null || this.convertToId == null || !convertToId.equals(this.convertToId)) { @@ -1365,6 +1438,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return; } + @Override public String getVersionsSupported() { if (versionsSupported == null) { // If I have a superClass, ask it @@ -1377,6 +1451,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return versionsSupported; } + @Override public void setVersionsSupported(String versionsSupported) { if (versionsSupported == null && this.versionsSupported == null) return; if (versionsSupported == null || this.versionsSupported == null || !versionsSupported.equals(this.versionsSupported)) { @@ -1386,18 +1461,21 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return; } + @Override public IFileContextBuildMacroValues getFileContextBuildMacroValues(){ if(fileContextBuildMacroValues == null && superClass != null) return getSuperClass().getFileContextBuildMacroValues(); return fileContextBuildMacroValues; } + @Override public String getBuilderVariablePattern(){ if(builderVariablePattern == null && superClass != null) return getSuperClass().getBuilderVariablePattern(); return builderVariablePattern; } + @Override public boolean isVariableCaseSensitive(){ if(isVariableCaseSensitive == null){ if(superClass != null) @@ -1407,12 +1485,14 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return isVariableCaseSensitive.booleanValue(); } + @Override public String[] getReservedMacroNames(){ if(reservedMacroNames == null && superClass != null) return getSuperClass().getReservedMacroNames(); return reservedMacroNames; } + @Override public IReservedMacroNameSupplier getReservedMacroNameSupplier(){ if(reservedMacroNameSupplier == null && reservedMacroNameSupplierElement != null){ try{ @@ -1617,6 +1697,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return currentMbsVersionConversionElement; } + @Override public CBuildData getBuildData() { return fBuildData; } @@ -1627,6 +1708,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider // return null; // } + @Override public String[] getErrorParsers() { if(isCustomBuilder() && customizedErrorParserIds != null) return customizedErrorParserIds.clone(); @@ -1646,6 +1728,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider customizedErrorParserIds = ids != null ? (String[])ids.clone() : ids; } + @Override public void setErrorParsers(String[] parsers) throws CoreException { if(isCustomBuilder()){ customizedErrorParserIds = (parsers != null && parsers.length != 0) ? (String[])parsers.clone() : parsers; @@ -1660,6 +1743,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return this;//!isExtensionBuilder ? (Object)this : (Object)getParent().getParent(); } + @Override public String getBuildArguments() { String args = getArguments(); IBuildMacroProvider provider = ManagedBuildManager.getBuildMacroProvider(); @@ -1672,6 +1756,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return args; } + @Override public IPath getBuildCommand() { String command = getCommand(); IBuildMacroProvider provider = ManagedBuildManager.getBuildMacroProvider(); @@ -1697,6 +1782,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return buildPath; } + @Override public void setBuildPath(String path){ setBuildPathAttribute(path); } @@ -1706,6 +1792,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider setDirty(true); } + @Override public String getBuildPath(){ if(isManagedBuildOn()) return getDefaultBuildPath(); @@ -1791,6 +1878,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return isWorkspaceBuildPath.booleanValue(); } */ + @Override public IPath getBuildLocation() { String path = getBuildPath(); @@ -1804,10 +1892,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return new Path(path); } + @Override public boolean isDefaultBuildCmd() { return isExtensionBuilder || (command == null && args == null /*&& stopOnErr == null && parallelBuildOn == null && parallelNum == null */ && superClass != null); } + @Override public boolean isStopOnError() { if(stopOnErr == null){ if(superClass != null){ @@ -1818,20 +1908,24 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return stopOnErr.booleanValue(); } + @Override public void setBuildArguments(String args) throws CoreException { setArguments(args); } + @Override public void setBuildCommand(IPath command) throws CoreException { String cmd = command != null ? command.toString() : null; setCommand(cmd); } + @Override public void setBuildLocation(IPath location) throws CoreException { String path = location != null ? location.toString() : null; setBuildPath(path); } + @Override public void setStopOnError(boolean on) throws CoreException { if(isStopOnError() == on) return; @@ -1847,6 +1941,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider setDirty(true); } + @Override public void setUseDefaultBuildCmd(boolean on) throws CoreException { if(!isExtensionBuilder && superClass != null){ if(on){ @@ -1870,6 +1965,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return autoBuildTarget; } + @Override public String getAutoBuildTarget() { String attr = getAutoBuildTargetAttribute(); @@ -1898,6 +1994,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return cleanBuildTarget; } + @Override public String getCleanBuildTarget() { String attr = getCleanBuildTargetAttribute(); @@ -1917,6 +2014,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } + @Override public String getFullBuildTarget() { return getIncrementalBuildTarget(); } @@ -1930,6 +2028,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return incrementalBuildTarget; } + @Override public String getIncrementalBuildTarget() { String attr = getIncrementalBuildTargetAttribute(); @@ -1948,6 +2047,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return attr; } + @Override public boolean isAutoBuildEnable() { if(autoBuildEnabled == null){ if(superClass != null) @@ -1957,6 +2057,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return autoBuildEnabled.booleanValue(); } + @Override public boolean isCleanBuildEnabled() { if(cleanBuildEnabled == null){ if(superClass != null) @@ -1966,10 +2067,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return cleanBuildEnabled.booleanValue(); } + @Override public boolean isFullBuildEnabled() { return isIncrementalBuildEnabled(); } + @Override public boolean isIncrementalBuildEnabled() { if(incrementalBuildEnabled == null){ if(superClass != null) @@ -1979,38 +2082,47 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return incrementalBuildEnabled.booleanValue(); } + @Override public void setAutoBuildEnable(boolean enabled) throws CoreException { autoBuildEnabled = Boolean.valueOf(enabled); } + @Override public void setAutoBuildTarget(String target) throws CoreException { autoBuildTarget = target; } + @Override public void setCleanBuildEnable(boolean enabled) throws CoreException { cleanBuildEnabled = Boolean.valueOf(enabled); } + @Override public void setCleanBuildTarget(String target) throws CoreException { cleanBuildTarget = target; } + @Override public void setFullBuildEnable(boolean enabled) throws CoreException { setIncrementalBuildEnable(enabled); } + @Override public void setFullBuildTarget(String target) throws CoreException { setIncrementalBuildTarget(target); } + @Override public void setIncrementalBuildEnable(boolean enabled) throws CoreException { incrementalBuildEnabled = Boolean.valueOf(enabled); } + @Override public void setIncrementalBuildTarget(String target) throws CoreException { incrementalBuildTarget = target; } + @Override public boolean appendEnvironment() { if(appendEnvironment == null){ if(superClass != null){ @@ -2021,6 +2133,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return appendEnvironment.booleanValue(); } + @Override public String getBuildAttribute(String name, String defaultValue) { String result = null; if(BUILD_TARGET_INCREMENTAL.equals(name)){ @@ -2156,12 +2269,14 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } + @Override public Map getEnvironment() { if(customizedEnvironment != null) return cloneMap(customizedEnvironment); return null; } + @Override public Map getExpandedEnvironment() throws CoreException { if(customizedEnvironment != null){ Map expanded = cloneMap(customizedEnvironment); @@ -2183,10 +2298,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return null; } + @Override public void setAppendEnvironment(boolean append) throws CoreException { appendEnvironment = Boolean.valueOf(append); } + @Override public void setBuildAttribute(String name, String value) throws CoreException { if(BUILD_TARGET_INCREMENTAL.equals(name)){ @@ -2255,10 +2372,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return customBuildProperties; } + @Override public void setEnvironment(Map env) throws CoreException { customizedEnvironment = new HashMap(env); } + @Override public boolean isCustomBuilder() { if(!isExtensionBuilder && getParent().getBuilder() != this) return true; @@ -2271,6 +2390,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return null; } + @Override public boolean isManagedBuildOn() { IConfiguration cfg = getConfguration(); if(cfg != null){ @@ -2295,14 +2415,17 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return managedBuildOn; } + @Override public void setManagedBuildOn(boolean on) throws CoreException { managedBuildOn = Boolean.valueOf(on); } + @Override public boolean canKeepEnvironmentVariablesInBuildfile() { return BuildMacroProvider.canKeepMacrosInBuildfile(this); } + @Override public boolean keepEnvironmentVariablesInBuildfile() { if(keepEnvVarInBuildfile == null){ if(superClass != null) @@ -2312,10 +2435,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return keepEnvVarInBuildfile.booleanValue(); } + @Override public void setKeepEnvironmentVariablesInBuildfile(boolean keep) { keepEnvVarInBuildfile = Boolean.valueOf(keep); } + @Override public boolean supportsCustomizedBuild() { if(fSupportsCustomizedBuild == null){ IManagedBuilderMakefileGenerator makeGen = getBuildFileGenerator(); @@ -2327,6 +2452,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return fSupportsCustomizedBuild.booleanValue(); } + @Override public boolean supportsBuild(boolean managed) { if(supportsManagedBuild == null){ if(superClass != null) @@ -2340,6 +2466,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider parent = toolChain; } + @Override public boolean matches(IBuilder builder){ if(builder == this) return true; @@ -2351,6 +2478,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return rBld == ManagedBuildManager.getRealBuilder(builder); } + @Override public MatchKey getMatchKey() { if(isAbstract()) return null; @@ -2359,6 +2487,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return new MatchKey(this); } + @Override public void setIdenticalList(List list) { identicalList = list; } @@ -2372,10 +2501,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return name; } + @Override public List getIdenticalList() { return identicalList; } + @Override public boolean isInternalBuilder() { IBuilder internalBuilder = ManagedBuildManager.getInternalBuilder(); for(IBuilder builder = this; builder != null; builder = builder.getSuperClass()){ @@ -2385,42 +2516,86 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return false; } - public int getParallelizationNum() { - if(supportsParallelBuild()) - return getParallelizationNumAttribute(); - return 1; + /** + * Returns the optimal number of parallel jobs. + * The number is the number of available processors on the machine. + * + * The function never returns number smaller than 1. + */ + public int getOptimalParallelJobNum() { + return Runtime.getRuntime().availableProcessors(); } + /** + * {@inheritDoc} + * + * Returns the number of parallel jobs to be used for a build. + * Note that "optimal" value is represented by negative number. + * See the table at {@link IMakeCommonBuildInfo#getParallelizationNum()}. + */ + @Override + public int getParallelizationNum() { + if (!isParallelBuildOn()) + return 1; + + if(parallelJobsNumber == null){ + if(superClass != null){ + return ((Builder)superClass).getParallelizationNum(); + } + return 1; + } + return parallelJobsNumber.intValue(); + } + public int getParallelizationNumAttribute(){ - if(parallelNum == null){ + if(parallelJobsNumber == null){ if(superClass != null){ return ((Builder)superClass).getParallelizationNumAttribute(); } return 1; } - return parallelNum.intValue(); + return parallelJobsNumber.intValue(); } - public void setParallelizationNum(int num) throws CoreException { -// if(num == 0 || supportsParallelBuild()){ - Integer newParallelNum = new Integer(num); + /** + * {@inheritDoc} + * + * @param jobs - maximum number of jobs or threads. If the number is 0 + * or negative, negative "optimal" number will be set, see + * {@link #getOptimalParallelJobNum()}. + */ + @Override + public void setParallelizationNum(int jobs) throws CoreException { + if (isParallelBuildOn() && (parallelJobsNumber == null || parallelJobsNumber != jobs)) { String curCmd = getParallelizationCmd(getParallelizationNum()); String args = getArgumentsAttribute(); String updatedArgs = removeCmd(args, curCmd); - if(!updatedArgs.equals(args)){ + if (!updatedArgs.equals(args)) { setArgumentsAttribute(updatedArgs); } - parallelNum = newParallelNum; + + if (jobs == Integer.MAX_VALUE && isInternalBuilder()) { + // Internal Builder does not support "unlimited" jobs, switching to "optimal" + jobs = -1; + } + if (jobs > 0) { + parallelJobsNumber = jobs; + } else { + // "optimal" + parallelJobsNumber = -getOptimalParallelJobNum(); + } setDirty(true); -// } + } } + @Override public boolean supportsParallelBuild() { if(isInternalBuilder()) return true; return getParrallelBuildCmd().length() != 0; } + @Override public boolean supportsStopOnError(boolean on) { if(isInternalBuilder()) return true; @@ -2446,42 +2621,60 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return ignoreErrCmd; } - public String getParrallelBuildCmd(){ - if(parallelBuildCmd == null){ - if(superClass != null){ - return ((Builder)superClass).getParrallelBuildCmd(); + public String getParrallelBuildCmd() { + if (parallelBuildCmd == null) { + if (superClass != null) { + return ((Builder) superClass).getParrallelBuildCmd(); } return EMPTY_STRING; } return parallelBuildCmd; } + @Override public boolean isParallelBuildOn() { - if(parallelBuildOn == null){ - if(superClass != null){ + if (isParallelBuildEnabled == null) { + if (superClass != null) { return getSuperClass().isParallelBuildOn(); } return false; } - return parallelBuildOn.booleanValue(); + return isParallelBuildEnabled.booleanValue(); } - public void setParallelBuildOn(boolean on) throws CoreException{ - if(isParallelBuildOn() == on) + /** + * {@inheritDoc} + * + * @param on - the flag to enable or disable parallel mode. + *
    {@code true} to enable, in this case the maximum number of jobs + * will be set to negative "optimal" number, see {@link #getOptimalParallelJobNum()}. + *
    {@code false} to disable, the number of jobs will be set to 1. + */ + @Override + public void setParallelBuildOn(boolean on) throws CoreException { + if (isParallelBuildOn() == on) return; - if(on && !supportsParallelBuild()) + if (on && !supportsParallelBuild()) return; - + String curCmd = getParallelizationCmd(getParallelizationNum()); String args = getArgumentsAttribute(); String updatedArgs = removeCmd(args, curCmd); - if(!updatedArgs.equals(args)){ + if (!updatedArgs.equals(args)) { setArgumentsAttribute(updatedArgs); } - parallelBuildOn = Boolean.valueOf(on); + + isParallelBuildEnabled = on; + + if (isParallelBuildEnabled) { + // "optimal" + parallelJobsNumber = -getOptimalParallelJobNum(); + } else { + parallelJobsNumber = 1; + } setDirty(true); } - + public Set contributeErrorParsers(Set set){ if(getErrorParserIds() != null){ if(set == null) @@ -2521,6 +2714,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } } + @Override public boolean isSystemObject() { if(isTest) return true; @@ -2533,6 +2727,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return false; } + @Override public String getUniqueRealName() { String name = getName(); if(name == null){ @@ -2604,6 +2799,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return num; } + @Override public int compareTo(Builder other) { if(other.isSystemObject() != isSystemObject()) return isSystemObject() ? 1 : -1; @@ -2611,30 +2807,37 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return getSuperClassNum() - other.getSuperClassNum(); } + @Override public IRealBuildObjectAssociation getExtensionObject() { return (Builder)ManagedBuildManager.getExtensionBuilder(this); } + @Override public IRealBuildObjectAssociation[] getIdenticBuildObjects() { return (IRealBuildObjectAssociation[])ManagedBuildManager.findIdenticalBuilders(this); } + @Override public IRealBuildObjectAssociation getRealBuildObject() { return (Builder)ManagedBuildManager.getRealBuilder(this); } + @Override public IRealBuildObjectAssociation getSuperClassObject() { return (Builder)getSuperClass(); } + @Override public final int getType() { return OBJECT_BUILDER; } + @Override public boolean isRealBuildObject() { return ManagedBuildManager.getRealBuilder(this) == this; } + @Override public boolean isExtensionBuildObject() { return isExtensionElement(); } @@ -2643,6 +2846,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return getUniqueRealName(); } + @Override public ICommandLauncher getCommandLauncher() { if(fCommandLauncher != null) return fCommandLauncher; @@ -2664,6 +2868,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider return fCommandLauncher; } + @Override public AbstractBuildRunner getBuildRunner() throws CoreException { // Already defined if (fBuildRunner != null) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index ef84a29dc1e..271b1c94aef 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -81,6 +81,7 @@ import org.eclipse.cdt.managedbuilder.internal.macros.OptionContextData; import org.eclipse.cdt.managedbuilder.macros.BuildMacroException; import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider; import org.eclipse.cdt.managedbuilder.macros.IConfigurationBuildMacroSupplier; +import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; @@ -752,7 +753,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * E L E M E N T A T T R I B U T E R E A D E R S A N D W R I T E R S */ - /* (non-Javadoc) + /** * Initialize the configuration information from an element in the * manifest file or provided by a dynamicElementProvider * @@ -803,7 +804,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild isTest = Boolean.valueOf(tmp).booleanValue(); } - /* (non-Javadoc) + /** * Initialize the configuration information from the XML element * specified in the argument * @@ -874,8 +875,8 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild if (element.getAttribute(CLEAN_COMMAND) != null) { cleanCommand = SafeStringInterner.safeIntern(element.getAttribute(CLEAN_COMMAND)); } - - // Get the pre-build and post-build commands + + // Get the pre-build and post-build commands if (element.getAttribute(PREBUILD_STEP) != null) { prebuildStep = SafeStringInterner.safeIntern(element.getAttribute(PREBUILD_STEP)); } @@ -891,7 +892,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild if (element.getAttribute(POSTANNOUNCEBUILD_STEP) != null) { postannouncebuildStep = SafeStringInterner.safeIntern(element.getAttribute(POSTANNOUNCEBUILD_STEP)); - } + } } /** @@ -970,6 +971,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getParent() */ + @Override public IConfiguration getParent() { return parent; } @@ -977,6 +979,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getOwner() */ + @Override public IResource getOwner() { if (managedProject != null) return managedProject.getOwner(); @@ -988,6 +991,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getProjectType() */ + @Override public IProjectType getProjectType() { return projectType; } @@ -995,6 +999,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getManagedProject() */ + @Override public IManagedProject getManagedProject() { return managedProject; } @@ -1002,6 +1007,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getToolChain(IToolChain, String, String, boolean) */ + @Override public IToolChain createToolChain(IToolChain superClass, String Id, String name, boolean isExtensionElement) { if(rootFolderInfo == null){ createRootFolderInfo(); @@ -1030,6 +1036,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getToolChain() */ + @Override public IToolChain getToolChain() { return rootFolderInfo.getToolChain(); } @@ -1037,6 +1044,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getResourceConfigurations() */ + @Override public IResourceConfiguration[] getResourceConfigurations() { return (IResourceConfiguration[])rcInfos.getResourceInfos(ICSettingBase.SETTING_FILE, IResourceConfiguration.class); } @@ -1044,6 +1052,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getResourceConfiguration(java.lang.String) */ + @Override public IResourceConfiguration getResourceConfiguration(String resPath) { return rcInfos.getFileInfo(new Path(resPath).removeFirstSegments(1)); } @@ -1051,6 +1060,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getFilteredTools() */ + @Override public ITool[] getFilteredTools() { return rootFolderInfo.getFilteredTools(); } @@ -1058,6 +1068,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getTools() */ + @Override public ITool[] getTools() { return rootFolderInfo.getTools(); } @@ -1065,6 +1076,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getTool(java.lang.String) */ + @Override public ITool getTool(String id) { return rootFolderInfo.getTool(id); } @@ -1072,6 +1084,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getToolsBySuperClassId(java.lang.String) */ + @Override public ITool[] getToolsBySuperClassId(String id) { return rootFolderInfo.getToolsBySuperClassId(id); } @@ -1079,6 +1092,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getTargetTool() */ + @Override public ITool getTargetTool() { String[] targetToolIds = rootFolderInfo.getToolChain().getTargetToolList(); if (targetToolIds == null || targetToolIds.length == 0) return null; @@ -1106,6 +1120,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setToolCommand(org.eclipse.cdt.managedbuilder.core.ITool, java.lang.String) */ + @Override public String getToolCommand(ITool tool) { // TODO: Do we need to verify that the tool is part of the configuration? return tool.getToolCommand(); @@ -1114,6 +1129,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setToolCommand(org.eclipse.cdt.managedbuilder.core.ITool, java.lang.String) */ + @Override public void setToolCommand(ITool tool, String command) { // TODO: Do we need to verify that the tool is part of the configuration? tool.setToolCommand(command); @@ -1122,6 +1138,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setOption(org.eclipse.cdt.core.build.managed.IOption, boolean) */ + @Override public IOption setOption(IHoldsOptions holder, IOption option, boolean value) throws BuildException { return getRootFolderInfo().setOption(holder, option, value); } @@ -1129,6 +1146,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setOption(org.eclipse.cdt.core.build.managed.IOption, java.lang.String) */ + @Override public IOption setOption(IHoldsOptions holder, IOption option, String value) throws BuildException { return getRootFolderInfo().setOption(holder, option, value); } @@ -1136,6 +1154,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setOption(org.eclipse.cdt.core.build.managed.IOption, java.lang.String[]) */ + @Override public IOption setOption(IHoldsOptions holder, IOption option, String[] value) throws BuildException { return getRootFolderInfo().setOption(holder, option, value); } @@ -1153,6 +1172,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild // rebuildNeeded = true; } + @Override public void removeResourceConfiguration(IResourceInfo resConfig) { ManagedBuildManager.performValueHandlerEvent(resConfig, IManagedOptionValueHandler.EVENT_CLOSE); @@ -1178,6 +1198,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getArtifactExtension() */ + @Override public String getArtifactExtension() { String ext = getArtifactExtensionAttribute(true); return ext != null ? ext : EMPTY_STRING; @@ -1197,6 +1218,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getArtifactName() */ + @Override public String getArtifactName() { if (artifactName == null) { // If I have a parent, ask it @@ -1214,6 +1236,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getBuildArguments() */ + @Override public String getBuildArguments() { IToolChain tc = getToolChain(); IBuilder builder = tc.getBuilder(); @@ -1226,6 +1249,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getBuildCommand() */ + @Override public String getBuildCommand() { IToolChain tc = getToolChain(); IBuilder builder = tc.getBuilder(); @@ -1240,6 +1264,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * * @see org.eclipse.cdt.core.build.managed.IConfiguration#getPrebuildStep() */ + @Override public String getPrebuildStep() { if (prebuildStep == null) { // If I have a parent, ask it @@ -1259,6 +1284,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * * @see org.eclipse.cdt.core.build.managed.IConfiguration#getPostbuildStep() */ + @Override public String getPostbuildStep() { if (postbuildStep == null) { // If I have a parent, ask it @@ -1278,6 +1304,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * * @see org.eclipse.cdt.core.build.managed.IConfiguration#getPreannouncebuildStep() */ + @Override public String getPreannouncebuildStep() { if (preannouncebuildStep == null) { // If I have a parent, ask it @@ -1297,6 +1324,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * * @see org.eclipse.cdt.core.build.managed.IConfiguration#getPostannouncebuildStep() */ + @Override public String getPostannouncebuildStep() { if (postannouncebuildStep == null) { // If I have a parent, ask it @@ -1316,6 +1344,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * * @see org.eclipse.cdt.core.build.managed.IConfiguration#getCleanCommand() */ + @Override public String getCleanCommand() { // Return the command used to remove files if (cleanCommand == null) { @@ -1338,6 +1367,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#getDescription() */ + @Override public String getDescription() { if (description == null) { // If I have a parent, ask it @@ -1357,6 +1387,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild * * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getErrorParserIds() */ + @Override public String getErrorParserIds() { if (errorParserIds != null) { return errorParserIds; @@ -1392,6 +1423,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getErrorParserList() */ + @Override public String[] getErrorParserList() { Set set = contributeErrorParsers(null, true); if(set != null){ @@ -1428,6 +1460,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setArtifactExtension(java.lang.String) */ + @Override public void setArtifactExtension(String extension) { if (extension == null && artifactExtension == null) return; if (artifactExtension == null || extension == null || !artifactExtension.equals(extension)) { @@ -1449,6 +1482,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setArtifactName(java.lang.String) */ + @Override public void setArtifactName(String name) { if (name == null && artifactName == null) return; if (artifactName == null || name == null || !artifactName.equals(name)) { @@ -1490,6 +1524,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setErrorParserIds() */ + @Override public void setErrorParserIds(String ids) { String currentIds = getErrorParserIds(); if (ids == null && currentIds == null) return; @@ -1502,6 +1537,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setCleanCommand() */ + @Override public void setCleanCommand(String command) { if (command == null && cleanCommand == null) return; if (cleanCommand == null || command == null || !cleanCommand.equals(command)) { @@ -1513,6 +1549,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setDescription(java.lang.String) */ + @Override public void setDescription(String description) { if (description == null && this.description == null) return; if (this.description == null || description == null || !description.equals(this.description)) { @@ -1524,6 +1561,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setBuildArguments() */ + @Override public void setBuildArguments(String makeArgs) { IToolChain tc = getToolChain(); IBuilder builder = tc.getBuilder(); @@ -1546,6 +1584,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setBuildCommand() */ + @Override public void setBuildCommand(String command) { IToolChain tc = getToolChain(); IBuilder builder = tc.getBuilder(); @@ -1568,7 +1607,8 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setPrebuildStep(java.lang.String) */ - public void setPrebuildStep(String step) { + @Override + public void setPrebuildStep(String step) { if (step == null && prebuildStep == null) return; if (prebuildStep == null || step == null || !prebuildStep.equals(step)) { prebuildStep = step; @@ -1581,7 +1621,8 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setPostbuildStep(java.lang.String) */ - public void setPostbuildStep(String step) { + @Override + public void setPostbuildStep(String step) { if (step == null && postbuildStep == null) return; if (postbuildStep == null || step == null || !postbuildStep.equals(step)) { postbuildStep = step; @@ -1593,7 +1634,8 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setPreannouncebuildStep(java.lang.String) */ - public void setPreannouncebuildStep(String announceStep) { + @Override + public void setPreannouncebuildStep(String announceStep) { if (announceStep == null && preannouncebuildStep == null) return; if (preannouncebuildStep == null || announceStep == null || !preannouncebuildStep.equals(announceStep)) { preannouncebuildStep = announceStep; @@ -1605,7 +1647,8 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IConfiguration#setPostannouncebuildStep(java.lang.String) */ - public void setPostannouncebuildStep(String announceStep) { + @Override + public void setPostannouncebuildStep(String announceStep) { if (announceStep == null && postannouncebuildStep == null) return; if (postannouncebuildStep == null || announceStep == null || !postannouncebuildStep.equals(announceStep)) { postannouncebuildStep = announceStep; @@ -1617,6 +1660,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#isSupported() */ + @Override public boolean isSupported(){ IFolderInfo foInfo = getRootFolderInfo(); if(foInfo != null) @@ -1627,6 +1671,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#isHeaderFile(java.lang.String) */ + @Override public boolean isHeaderFile(String ext) { return getRootFolderInfo().isHeaderFile(ext); } @@ -1638,6 +1683,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#isExtensionElement() */ + @Override public boolean isExtensionElement() { return isExtensionConfig; } @@ -1645,6 +1691,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#isDirty() */ + @Override public boolean isDirty() { // This shouldn't be called for an extension configuration if (isExtensionConfig) return false; @@ -1665,10 +1712,12 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#needsRebuild() */ + @Override public boolean needsRebuild() { return needsRebuild(true); } + @Override public boolean needsFullRebuild() { return needsRebuild(false); } @@ -1692,6 +1741,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setDirty(boolean) */ + @Override public void setDirty(boolean isDirty) { // Override the dirty flag this.isDirty = isDirty; @@ -1708,6 +1758,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#setRebuildState(boolean) */ + @Override public void setRebuildState(boolean rebuild) { if(isExtensionElement() && rebuild) return; @@ -1731,6 +1782,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#hasOverriddenBuildCommand() */ + @Override public boolean hasOverriddenBuildCommand() { IBuilder builder = getToolChain().getBuilder(); if (builder != null) { @@ -1785,21 +1837,24 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild ((FolderInfo)getRootFolderInfo()).resetOptionSettings(); } - /* + /** * Create a resource configuration object for the passed-in file */ + @Override public IResourceConfiguration createResourceConfiguration(IFile file) { return createFileInfo(file.getFullPath().removeFirstSegments(1)); } + @Override public IFileInfo createFileInfo(IPath path){ String resourceName = path.lastSegment(); String id = ManagedBuildManager.calculateChildId(getId(), path.toString()); return createFileInfo(path, id, resourceName); } + @Override public IFileInfo createFileInfo(IPath path, String id, String name){ IResourceInfo info = getResourceInfo(path, false); IFileInfo fileInfo = null; @@ -1812,6 +1867,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return fileInfo; } + @Override public IFileInfo createFileInfo(IPath path, IFolderInfo base, ITool baseTool, String id, String name){ if(base.getPath().equals(path)) return null; @@ -1823,6 +1879,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return fileInfo; } + @Override public IFileInfo createFileInfo(IPath path, IFileInfo base, String id, String name){ if(base.getPath().equals(path)) return null; @@ -1837,6 +1894,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getEnvironmentVariableSupplier() */ + @Override public IConfigurationEnvironmentVariableSupplier getEnvironmentVariableSupplier(){ IToolChain toolChain = getToolChain(); if(toolChain != null) @@ -1865,6 +1923,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getBuildMacroSupplier() */ + @Override public IConfigurationBuildMacroSupplier getBuildMacroSupplier(){ IToolChain toolChain = getToolChain(); if(toolChain != null) @@ -1876,6 +1935,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#isTemporary() */ + @Override public boolean isTemporary(){ return isTemporary; } @@ -1902,6 +1962,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } + @Override public ITool calculateTargetTool(){ ITool tool = getTargetTool(); @@ -1924,15 +1985,17 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return tool; } + @Override public ITool getToolFromOutputExtension(String extension) { return getRootFolderInfo().getToolFromOutputExtension(extension); } + @Override public ITool getToolFromInputExtension(String sourceExtension) { return getRootFolderInfo().getToolFromInputExtension(sourceExtension); } - /* + /** * The resource delta passed to the builder is not always up-to-date * for the given configuration because between two builds of the same configuration * any number of other configuration builds may occur @@ -2004,7 +2067,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild prefs.getBoolean(pref, false) : defaultValue; } */ - /* + /** * this method is used for enabling/disabling the internal builder * for the given configuration * @@ -2121,7 +2184,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return null; } - /* + /** * returns whether the internal builder is enabled * @return boolean */ @@ -2129,7 +2192,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return getBuilder().isInternalBuilder(); } - /* + /** * * sets the Internal Builder mode * @@ -2144,7 +2207,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } - /* + /** * returns the Internal Builder mode * if true, internal builder will ignore build errors while building, * otherwise it will stop at the first build error @@ -2156,73 +2219,80 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } /** - * * sets the Internal Builder Parallel mode - * * @param parallel if true, internal builder will use parallel mode + * + * @deprecated since CDT 9.0. Use {@link #setParallelDef(boolean)} */ + @Deprecated public void setInternalBuilderParallel(boolean parallel){ - if(getInternalBuilderParallel() == parallel) - return; - - try { - getEditableBuilder().setParallelBuildOn(parallel); - } catch (CoreException e) { - } + setParallelDef(parallel); } /** * returns the Internal Builder parallel mode * if true, internal builder will work in parallel mode * otherwise it will use only one thread - * * @return boolean + * + * @deprecated since CDT 9.0. Use {@link #getParallelDef()} */ + @Deprecated public boolean getInternalBuilderParallel(){ - return getBuilder().isParallelBuildOn(); + return getParallelDef(); } /** - * @param parallel if true, internal builder will use parallel mode + * Set parallel execution mode for the configuration's builder. + * @see Builder#setParallelBuildOn(boolean) + * + * @param parallel - the flag to enable or disable parallel mode. */ public void setParallelDef(boolean parallel){ if(getParallelDef() == parallel) return; - int num = getParallelNumber(); - if(num != 0){ - setParallelNumber(-num); - } else { - if(parallel){ - setParallelNumber(-1); - } else { - setParallelNumber(1); - } + try { + getEditableBuilder().setParallelBuildOn(parallel); + } catch (CoreException e) { + ManagedBuilderCorePlugin.log(e); } } /** - * @return boolean + * Check if the configuration's builder is operating in parallel mode. + * @return {@code true} if parallel mode is enabled, {@code false} otherwise. */ public boolean getParallelDef(){ - int num = getBuilder().getParallelizationNum(); - return num <= 0; + return getBuilder().isParallelBuildOn(); } /** - * sets number of Parallel threads + * Sets maximum number of parallel threads/jobs to be used by builder. + * Note that the number will be set only if the builder is in "parallel" + * mode. + * + * @param jobs - maximum number of jobs or threads. If the number is 0 + * or negative, negative "optimal" number will be set, see + * {@link Builder#getOptimalParallelJobNum()}. */ - public void setParallelNumber(int n){ + public void setParallelNumber(int jobs){ try { - getEditableBuilder().setParallelizationNum(n); + getEditableBuilder().setParallelizationNum(jobs); } catch (CoreException e) { + ManagedBuilderCorePlugin.log(e); } } /** - * returns number of Parallel threads + * Returns maximum number of parallel threads/jobs used by the configuration's builder. + * Note that this function can return negative value to indicate "optimal" number. * - * @return int + * @see #setParallelDef(boolean) + * @see Builder#getParallelizationNum() + * + * @return - maximum number of parallel threads or jobs used by the builder or negative number. + * For exact interpretation see table in {@link IMakeCommonBuildInfo#getParallelizationNum()} */ public int getParallelNumber(){ return getBuilder().getParallelizationNum(); @@ -2246,14 +2316,17 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild // return prefs; // } + @Override public IResourceInfo[] getResourceInfos() { return rcInfos.getResourceInfos(); } + @Override public IResourceInfo getResourceInfo(IPath path, boolean exactPath) { return rcInfos.getResourceInfo(path, exactPath); } + @Override public IResourceInfo getResourceInfoById(String id) { IResourceInfo infos[] = rcInfos.getResourceInfos(); for(int i = 0; i < infos.length; i++){ @@ -2263,6 +2336,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return null; } + @Override public IFolderInfo getRootFolderInfo() { return rootFolderInfo; } @@ -2272,22 +2346,26 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return new ResourceInfoContainer(cr, false); } + @Override public CConfigurationData getConfigurationData(){ return fCfgData; } + @Override public void removeResourceInfo(IPath path) { IResourceInfo info = getResourceInfo(path, true); if(info != null) removeResourceConfiguration(info); } + @Override public IFolderInfo createFolderInfo(IPath path) { String resourceName = path.lastSegment(); String id = ManagedBuildManager.calculateChildId(getId(), path.toString()); return createFolderInfo(path, id, resourceName); } + @Override public IFolderInfo createFolderInfo(IPath path, String id, String name) { IResourceInfo info = getResourceInfo(path, false); IFolderInfo folderInfo = null; @@ -2300,6 +2378,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return folderInfo; } + @Override public IFolderInfo createFolderInfo(IPath path, IFolderInfo base, String id, String name) { if(base.getPath().equals(path)) return null; @@ -2312,6 +2391,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return folderInfo; } + @Override public ICSourceEntry[] getSourceEntries() { if(sourceEntries == null || sourceEntries.length == 0){ if(parent != null && sourceEntries == null) @@ -2322,6 +2402,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return sourceEntries.clone(); } + @Override public void setSourceEntries(ICSourceEntry[] entries) { setSourceEntries(entries, true); } @@ -2355,6 +2436,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } + @Override public void setErrorParserList(String[] ids) { if(ids == null){ //reset @@ -2394,10 +2476,12 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } + @Override public CBuildData getBuildData() { return getEditableBuilder().getBuildData(); } + @Override public IBuilder getEditableBuilder(){ IToolChain tc = getToolChain(); IBuilder builder = tc.getBuilder(); @@ -2409,10 +2493,12 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return builder; } + @Override public IBuilder getBuilder(){ return getToolChain().getBuilder(); } + @Override public String getOutputPrefix(String outputExtension) { // Treat null extensions as empty string String ext = outputExtension == null ? new String() : outputExtension; @@ -2437,6 +2523,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild fCfgDes = cfgDes; } + @Override public IBuildObjectProperties getBuildProperties() { if(buildProperties == null){ BuildObjectProperties parentProps = findBuildProperties(); @@ -2467,6 +2554,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return supportsValue(type.getId(), value.getId()); } + @Override public void propertiesChanged() { if(isExtensionConfig) return; @@ -2490,6 +2578,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return booleanExpressionCalculator; } + @Override public boolean isSystemObject() { if(isTest) return true; @@ -2500,10 +2589,12 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return false; } + @Override public String getOutputExtension(String resourceExtension) { return getRootFolderInfo().getOutputExtension(resourceExtension); } + @Override public String getOutputFlag(String outputExt) { // Treat null extension as an empty string String ext = outputExt == null ? new String() : outputExt; @@ -2521,6 +2612,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return flags; } + @Override public IManagedCommandLineInfo generateToolCommandLineInfo( String sourceExtension, String[] flags, String outputFlag, String outputPrefix, String outputName, String[] inputResources, IPath inputLocation, IPath outputLocation ){ ITool[] tools = getFilteredTools(); @@ -2573,6 +2665,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return null; } + @Override public String[] getUserObjects(String extension) { Vector objs = new Vector(); ITool tool = calculateTargetTool(); @@ -2614,6 +2707,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return objs.toArray(new String[objs.size()]); } + @Override public String[] getLibs(String extension) { Vector libs = new Vector(); ITool tool = calculateTargetTool(); @@ -2668,6 +2762,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return libs.toArray(new String[libs.size()]); } + @Override public boolean buildsFileType(String srcExt) { return getRootFolderInfo().buildsFileType(srcExt); } @@ -2735,6 +2830,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } + @Override public boolean supportsBuild(boolean managed) { return supportsBuild(managed, true); } @@ -2755,6 +2851,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return true; } + @Override public boolean supportsType(String typeId) { SupportedProperties props = findSupportedProperties(); boolean supports = false; @@ -2768,6 +2865,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return supports; } + @Override public boolean supportsValue(String typeId, String valueId) { SupportedProperties props = findSupportedProperties(); boolean supports = false; @@ -2794,6 +2892,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild supportedProperties = new SupportedProperties(el); } + @Override public String[] getRequiredTypeIds() { SupportedProperties props = findSupportedProperties(); List list = new ArrayList(); @@ -2806,6 +2905,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return list.toArray(new String[list.size()]); } + @Override public String[] getSupportedTypeIds() { SupportedProperties props = findSupportedProperties(); List list = new ArrayList(); @@ -2818,6 +2918,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return list.toArray(new String[list.size()]); } + @Override public String[] getSupportedValueIds(String typeId) { SupportedProperties props = findSupportedProperties(); List list = new ArrayList(); @@ -2830,6 +2931,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return list.toArray(new String[list.size()]); } + @Override public boolean requiresType(String typeId) { SupportedProperties props = findSupportedProperties(); boolean requires = false; @@ -2843,10 +2945,12 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return requires; } + @Override public boolean isManagedBuildOn() { return getBuilder().isManagedBuildOn(); } + @Override public void setManagedBuildOn(boolean on) throws BuildException { try { getEditableBuilder().setManagedBuildOn(on); @@ -2855,6 +2959,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } + @Override public void changeBuilder(IBuilder newBuilder, String id, String name){ changeBuilder(newBuilder, id, name, false); } @@ -2884,6 +2989,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } + @Override public boolean isBuilderCompatible(IBuilder builder){ return builder.supportsBuild(isManagedBuildOn()); } @@ -2964,6 +3070,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return isPreferenceConfig; } + @Override public IBuildPropertyValue getBuildArtefactType() { IBuildObjectProperties props = findBuildProperties(); if(props != null){ @@ -2974,6 +3081,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return null; } + @Override public void setBuildArtefactType(String id) throws BuildException { IBuildObjectProperties props = getBuildProperties(); try { @@ -3026,34 +3134,42 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild } } + @Override public IRealBuildObjectAssociation getExtensionObject() { return isExtensionConfig ? this : (Configuration)getParent(); } + @Override public IRealBuildObjectAssociation[] getIdenticBuildObjects() { return new Configuration[]{(Configuration)getExtensionObject()}; } + @Override public IRealBuildObjectAssociation getRealBuildObject() { return getExtensionObject(); } + @Override public IRealBuildObjectAssociation getSuperClassObject() { return (IRealBuildObjectAssociation)getParent(); } + @Override public int getType() { return OBJECT_CONFIGURATION; } + @Override public boolean isRealBuildObject() { return getRealBuildObject() == this; } + @Override public String getUniqueRealName() { return getName(); } + @Override public boolean isExtensionBuildObject() { return isExtensionElement(); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java index 4acd71aeba6..5446824dae3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2010 IBM Corporation and others. + * Copyright (c) 2002, 2011 IBM Corporation 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 @@ -151,6 +151,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { return fullBuildNeeded; } + @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); // If the project has changed, then a build is needed and we can stop @@ -231,6 +232,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { } } + @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource rc = delta.getResource(); @@ -906,244 +908,242 @@ public class GeneratedMakefileBuilder extends ACBuilder { } IPath makeCommand = new Path(makeCmd); - if (makeCommand != null) { - String[] msgs = new String[2]; - msgs[0] = makeCommand.toString(); - msgs[1] = currentProject.getName(); - monitor.subTask(ManagedMakeMessages.getFormattedString(MAKE, msgs)); + String[] msgs = new String[2]; + msgs[0] = makeCommand.toString(); + msgs[1] = currentProject.getName(); + monitor.subTask(ManagedMakeMessages.getFormattedString(MAKE, msgs)); - // Get a build console for the project - StringBuffer buf = new StringBuffer(); - IConsole console = CCorePlugin.getDefault().getConsole(); - console.start(currentProject); - ConsoleOutputStream consoleOutStream = console.getOutputStream(); - String[] consoleHeader = new String[3]; + // Get a build console for the project + StringBuffer buf = new StringBuffer(); + IConsole console = CCorePlugin.getDefault().getConsole(); + console.start(currentProject); + ConsoleOutputStream consoleOutStream = console.getOutputStream(); + String[] consoleHeader = new String[3]; + switch (buildType) { + case FULL_BUILD: + case INCREMENTAL_BUILD: + consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_INC); + break; + case CLEAN_BUILD: + consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_CLEAN); + break; + } + + consoleHeader[1] = info.getConfigurationName(); + consoleHeader[2] = currentProject.getName(); + buf.append(NEWLINE); + buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader)).append(NEWLINE); + buf.append(NEWLINE); + + IConfiguration cfg = info.getDefaultConfiguration(); + if(!cfg.isSupported()){ + String msg = ManagedMakeMessages.getFormattedString(WARNING_UNSUPPORTED_CONFIGURATION,new String[] {cfg.getName(),cfg.getToolChain().getName()}); + buf.append(msg).append(NEWLINE); + buf.append(NEWLINE); + } + consoleOutStream.write(buf.toString().getBytes()); + consoleOutStream.flush(); + + // Remove all markers for this project + removeAllMarkers(currentProject); + + // Get a launcher for the make command + String errMsg = null; + IBuilder builder = info.getDefaultConfiguration().getBuilder(); + ICommandLauncher launcher = builder.getCommandLauncher(); + launcher.setProject(currentProject); + launcher.showCommand(true); + + // Set the environmennt + IBuildEnvironmentVariable variables[] = ManagedBuildManager.getEnvironmentVariableProvider().getVariables(cfg,true,true); + String[] env = null; + ArrayList envList = new ArrayList(); + if (variables != null) { + for(int i = 0; i < variables.length; i++){ + envList.add(variables[i].getName() + "=" + variables[i].getValue()); //$NON-NLS-1$ + } + env = envList.toArray(new String[envList.size()]); + } + + // Hook up an error parser manager + String[] errorParsers = info.getDefaultConfiguration().getErrorParserList(); + ErrorParserManager epm = new ErrorParserManager(getProject(), workingDirectoryURI, 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(); + + // 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]); + } + } + + String[] makeTargets; + String prebuildStep = info.getPrebuildStep(); + //try to resolve the build macros in the prebuildStep + try{ + prebuildStep = ManagedBuildManager.getBuildMacroProvider().resolveValueToMakefileFormat( + prebuildStep, + "", //$NON-NLS-1$ + " ", //$NON-NLS-1$ + IBuildMacroProvider.CONTEXT_CONFIGURATION, + cfg); + } catch (BuildMacroException e){ + } + boolean prebuildStepPresent = (prebuildStep.length() > 0); + Process proc = null; + boolean isuptodate = false; + + if (prebuildStepPresent) { + @SuppressWarnings("unchecked") + ArrayList premakeArgs = (ArrayList) makeArgs.clone(); + String[] premakeTargets; switch (buildType) { - case FULL_BUILD: - case INCREMENTAL_BUILD: - consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_INC); - break; - case CLEAN_BUILD: - consoleHeader[0] = ManagedMakeMessages.getResourceString(TYPE_CLEAN); - break; - } - - consoleHeader[1] = info.getConfigurationName(); - consoleHeader[2] = currentProject.getName(); - buf.append(NEWLINE); - buf.append(ManagedMakeMessages.getFormattedString(CONSOLE_HEADER, consoleHeader)).append(NEWLINE); - buf.append(NEWLINE); - - IConfiguration cfg = info.getDefaultConfiguration(); - if(!cfg.isSupported()){ - String msg = ManagedMakeMessages.getFormattedString(WARNING_UNSUPPORTED_CONFIGURATION,new String[] {cfg.getName(),cfg.getToolChain().getName()}); - buf.append(msg).append(NEWLINE); - buf.append(NEWLINE); - } - consoleOutStream.write(buf.toString().getBytes()); - consoleOutStream.flush(); - - // Remove all markers for this project - removeAllMarkers(currentProject); - - // Get a launcher for the make command - String errMsg = null; - IBuilder builder = info.getDefaultConfiguration().getBuilder(); - ICommandLauncher launcher = builder.getCommandLauncher(); - launcher.setProject(currentProject); - launcher.showCommand(true); - - // Set the environmennt - IBuildEnvironmentVariable variables[] = ManagedBuildManager.getEnvironmentVariableProvider().getVariables(cfg,true,true); - String[] env = null; - ArrayList envList = new ArrayList(); - if (variables != null) { - for(int i = 0; i < variables.length; i++){ - envList.add(variables[i].getName() + "=" + variables[i].getValue()); //$NON-NLS-1$ - } - env = envList.toArray(new String[envList.size()]); - } - - // Hook up an error parser manager - String[] errorParsers = info.getDefaultConfiguration().getErrorParserList(); - ErrorParserManager epm = new ErrorParserManager(getProject(), workingDirectoryURI, 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(); - - // 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]); - } - } - - String[] makeTargets; - String prebuildStep = info.getPrebuildStep(); - //try to resolve the build macros in the prebuildStep - try{ - prebuildStep = ManagedBuildManager.getBuildMacroProvider().resolveValueToMakefileFormat( - prebuildStep, - "", //$NON-NLS-1$ - " ", //$NON-NLS-1$ - IBuildMacroProvider.CONTEXT_CONFIGURATION, - cfg); - } catch (BuildMacroException e){ - } - boolean prebuildStepPresent = (prebuildStep.length() > 0); - Process proc = null; - boolean isuptodate = false; - - if (prebuildStepPresent) { - @SuppressWarnings("unchecked") - 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 - premakeArgs.add("-q"); //$NON-NLS-1$ - premakeArgs.add("main-build"); //$NON-NLS-1$ - premakeTargets = premakeArgs.toArray(new String[premakeArgs.size()]); - proc = launcher.execute(makeCommand, premakeTargets, env, workingDirectory, monitor); - 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(epm.getOutputStream(), epm.getOutputStream(), - new SubProgressMonitor(monitor, - IProgressMonitor.UNKNOWN)) != ICommandLauncher.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 = new StringBuffer(); - buf.append(NEWLINE); - buf.append(uptodateMsg).append(NEWLINE); - // Write message on the console - consoleOutStream.write(buf.toString().getBytes()); - consoleOutStream.flush(); - epmOutputStream.close(); - consoleOutStream.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 { - // No prebuild step - // - makeArgs.addAll(Arrays.asList(getMakeTargets(buildType))); - } - - makeTargets = makeArgs.toArray(new String[makeArgs.size()]); - - // Launch make - main invocation - if (!isuptodate) { - proc = launcher.execute(makeCommand, makeTargets, env, workingDirectory, monitor); + 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 + premakeArgs.add("-q"); //$NON-NLS-1$ + premakeArgs.add("main-build"); //$NON-NLS-1$ + premakeTargets = premakeArgs.toArray(new String[premakeArgs.size()]); + proc = launcher.execute(makeCommand, premakeTargets, env, workingDirectory, monitor); if (proc != null) { try { // Close the input of the process since we will never write to it proc.getOutputStream().close(); } catch (IOException e) { } - - int state = launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), + if (launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), new SubProgressMonitor(monitor, - IProgressMonitor.UNKNOWN)); - if(state != ICommandLauncher.OK){ + IProgressMonitor.UNKNOWN)) != ICommandLauncher.OK) { errMsg = launcher.getErrorMessage(); - - if(state == ICommandLauncher.COMMAND_CANCELED){ - //TODO: the better way of handling cancel is needed - //currently the rebuild state is set to true forcing the full rebuild - //on the next builder invocation - info.getDefaultConfiguration().setRebuildState(true); - } - } - - // 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); - - // use the refresh scope manager to refresh - RefreshScopeManager refreshManager = RefreshScopeManager.getInstance(); - IWorkspaceRunnable runnable = refreshManager.getRefreshRunnable(currentProject); - ResourcesPlugin.getWorkspace().run(runnable, null, IWorkspace.AVOID_UPDATE, 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).append(NEWLINE); - buf.append("(").append(errMsg).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ + 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 { - // Report a successful build - String successMsg = ManagedMakeMessages.getFormattedString(BUILD_FINISHED, - currentProject.getName()); - buf.append(successMsg).append(NEWLINE); + // 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 = new StringBuffer(); + buf.append(NEWLINE); + buf.append(uptodateMsg).append(NEWLINE); + // Write message on the console + consoleOutStream.write(buf.toString().getBytes()); + consoleOutStream.flush(); + epmOutputStream.close(); + consoleOutStream.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 { + // No prebuild step + // + makeArgs.addAll(Arrays.asList(getMakeTargets(buildType))); + } + + makeTargets = makeArgs.toArray(new String[makeArgs.size()]); + + // Launch make - main invocation + if (!isuptodate) { + proc = launcher.execute(makeCommand, makeTargets, env, workingDirectory, monitor); + if (proc != null) { + try { + // Close the input of the process since we will never write to it + proc.getOutputStream().close(); + } catch (IOException e) { } - // Write message on the console - consoleOutStream.write(buf.toString().getBytes()); - consoleOutStream.flush(); - epmOutputStream.close(); + int state = launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), + new SubProgressMonitor(monitor, + IProgressMonitor.UNKNOWN)); + if(state != ICommandLauncher.OK){ + errMsg = launcher.getErrorMessage(); + + if(state == ICommandLauncher.COMMAND_CANCELED){ + //TODO: the better way of handling cancel is needed + //currently the rebuild state is set to true forcing the full rebuild + //on the next builder invocation + info.getDefaultConfiguration().setRebuildState(true); + } + } - // Generate any error markers that the build has discovered - monitor.subTask(ManagedMakeMessages.getResourceString(MARKERS)); - addBuilderMarkers(epm); - consoleOutStream.close(); + // 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); + + // use the refresh scope manager to refresh + RefreshScopeManager refreshManager = RefreshScopeManager.getInstance(); + IWorkspaceRunnable runnable = refreshManager.getRefreshRunnable(currentProject); + ResourcesPlugin.getWorkspace().run(runnable, null, IWorkspace.AVOID_UPDATE, 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).append(NEWLINE); + 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).append(NEWLINE); + } + + // Write message on the console + consoleOutStream.write(buf.toString().getBytes()); + consoleOutStream.flush(); + epmOutputStream.close(); + + // Generate any error markers that the build has discovered + monitor.subTask(ManagedMakeMessages.getResourceString(MARKERS)); + addBuilderMarkers(epm); + consoleOutStream.close(); } } catch (Exception e) { forgetLastBuiltState(); @@ -1196,7 +1196,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { boolean resumeOnErr, IProgressMonitor monitor) { - boolean isParallel = ((Configuration)cfg).getInternalBuilderParallel(); + boolean isParallel = ((Configuration)cfg).getParallelDef(); // Get the project and make sure there's a monitor to cancel the build IProject currentProject = cfg.getOwner().getProject(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/MultiConfiguration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/MultiConfiguration.java index d9834448cad..0b1f6c233e5 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/MultiConfiguration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/MultiConfiguration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 Intel Corporation and others. + * Copyright (c) 2007, 2011 Intel Corporation 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 @@ -44,6 +44,7 @@ import org.eclipse.cdt.managedbuilder.envvar.IConfigurationEnvironmentVariableSu import org.eclipse.cdt.managedbuilder.macros.IConfigurationBuildMacroSupplier; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.osgi.framework.Version; @@ -91,6 +92,7 @@ public class MultiConfiguration extends MultiItemsHolder implements /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#buildsFileType(java.lang.String) */ + @Override public boolean buildsFileType(String srcExt) { return curr().buildsFileType(srcExt); } @@ -98,6 +100,7 @@ public class MultiConfiguration extends MultiItemsHolder implements /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#calculateTargetTool() */ + @Override public ITool calculateTargetTool() { return curr().calculateTargetTool(); } @@ -105,6 +108,7 @@ public class MultiConfiguration extends MultiItemsHolder implements /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#changeBuilder(org.eclipse.cdt.managedbuilder.core.IBuilder, java.lang.String, java.lang.String) */ + @Override public void changeBuilder(IBuilder newBuilder, String id, String name) { for (int i=0; i ri = new ArrayList(); for (int i=0; i + * Status Returns + * No parallel 1 + * Unlimited Integer.MAX (N/A for Internal Builder) + * Optimal -CPU# (negative number of processors) + * Specific >0 (positive number) + * + */ int getParallelizationNum(); - void setParallelizationNum(int num) throws CoreException; + + /** + * Sets maximum number of parallel threads/jobs to be used by builder. + * Note that the number will be set only if the builder is in "parallel" + * mode. + * + * @param jobs - number of jobs according table {@link #getParallelizationNum()}. + * Any number <=0 is treated as setting "optimal" property, + * the value of the number itself is ignored. + */ + void setParallelizationNum(int jobs) throws CoreException; + /** + * @return {@code true} if builder supports parallel build, + * {@code false} otherwise. + */ boolean supportsParallelBuild(); + /** + * @return {@code true} if builder support for parallel build is enabled, + * {@code false} otherwise. + */ boolean isParallelBuildOn(); + /** + * Set parallel execution mode for the builder. + * @see Builder#setParallelBuildOn(boolean) + * + * @param on - the flag to enable or disable parallel mode. + */ void setParallelBuildOn(boolean on) throws CoreException; boolean isDefaultBuildCmd(); diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.java index 7d4180d427f..94f8c37d3f6 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.java @@ -27,9 +27,10 @@ public class Messages extends NLS { public static String BuilderSettingsTab_0; public static String BuilderSettingsTab_1; public static String BuilderSettingsTab_10; - public static String BuilderSettingsTab_11; - public static String BuilderSettingsTab_12; - public static String BuilderSettingsTab_13; + public static String BuilderSettingsTab_EnableParallelBuild; + public static String BuilderSettingsTab_UseOptimalJobs; + public static String BuilderSettingsTab_UseUnlimitedJobs; + public static String BuilderSettingsTab_UseParallelJobs; public static String BuilderSettingsTab_14; public static String BuilderSettingsTab_15; public static String BuilderSettingsTab_16; diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.properties b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.properties index 7bd9281d8e1..3fdd4bfe8fb 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.properties +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/Messages.properties @@ -31,9 +31,10 @@ BuilderSettingsTab_7=&Generate Makefiles automatically BuilderSettingsTab_8=&Expand Env. Variable Refs in Makefiles BuilderSettingsTab_9=Build settings BuilderSettingsTab_10=Stop on first build error -BuilderSettingsTab_11=Use parallel build -BuilderSettingsTab_12=Use optimal jobs number -BuilderSettingsTab_13=Use parallel jobs: +BuilderSettingsTab_EnableParallelBuild=Enable parallel build +BuilderSettingsTab_UseOptimalJobs=Use number of processors ({0}) +BuilderSettingsTab_UseParallelJobs=Use parallel jobs: +BuilderSettingsTab_UseUnlimitedJobs=Use unlimited jobs BuilderSettingsTab_14=Workbench Build Behavior BuilderSettingsTab_15=Workbench build type: BuilderSettingsTab_16=Make build target: diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java index 7acf0d9326d..0193eeb2362 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 Intel Corporation and others. + * Copyright (c) 2007, 2011 Intel Corporation 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 @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.cdt.managedbuilder.ui.properties; +import java.text.MessageFormat; + import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICMultiConfigDescription; import org.eclipse.cdt.core.settings.model.ICMultiItemsHolder; @@ -18,12 +20,12 @@ import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.managedbuilder.core.IBuilder; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IMultiConfiguration; -import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildProcessManager; import org.eclipse.cdt.managedbuilder.internal.core.Builder; import org.eclipse.cdt.managedbuilder.internal.core.Configuration; import org.eclipse.cdt.managedbuilder.internal.core.MultiConfiguration; import org.eclipse.cdt.managedbuilder.internal.ui.Messages; import org.eclipse.cdt.newmake.core.IMakeBuilderInfo; +import org.eclipse.cdt.newmake.core.IMakeCommonBuildInfo; import org.eclipse.cdt.ui.newui.AbstractCPropertyTab; import org.eclipse.cdt.ui.newui.ICPropertyProvider; import org.eclipse.core.runtime.CoreException; @@ -51,6 +53,7 @@ import org.eclipse.swt.widgets.Widget; * @noinstantiate This class is not intended to be instantiated by clients. */ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { + private static final int SPINNER_MAX_VALUE = 10000; private static final int TRI_STATES_SIZE = 4; // Widgets @@ -58,9 +61,10 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { private Button b_stopOnError; // 3 private Button b_parallel; // 3 - private Button b_parallelOpt; - private Button b_parallelNum; - private Spinner parallelProcesses; + private Button b_parallelOptimal; + private Button b_parallelSpecific; + private Button b_parallelUnlimited; + private Spinner s_parallelNumber; private Label title2; private Button b_autoBuild; //3 @@ -70,11 +74,11 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { private Button b_cmdClean; // 3 private Text t_cmdClean; - private IBuilder bldr; + private Builder bldr; private IConfiguration icfg; private boolean canModify = true; - protected final int cpuNumber = BuildProcessManager.checkCPUNumber(); + protected final int cpuNumber = Runtime.getRuntime().availableProcessors(); @Override public void createControls(Composite parent) { @@ -110,7 +114,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { gl.marginHeight = 0; c2.setLayout(gl); - b_parallel = setupCheck(c2, Messages.BuilderSettingsTab_11, 1, GridData.BEGINNING); + b_parallel = setupCheck(c2, Messages.BuilderSettingsTab_EnableParallelBuild, 1, GridData.BEGINNING); Composite c3 = new Composite(g3, SWT.NONE); setupControl(c3, 1, GridData.FILL_BOTH); @@ -120,39 +124,60 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { gl.marginHeight = 0; c3.setLayout(gl); - b_parallelOpt= new Button(c3, SWT.RADIO); - b_parallelOpt.setText(Messages.BuilderSettingsTab_12); - setupControl(b_parallelOpt, 2, GridData.BEGINNING); - ((GridData)(b_parallelOpt.getLayoutData())).horizontalIndent = 15; - b_parallelOpt.addSelectionListener(new SelectionAdapter() { + b_parallelOptimal= new Button(c3, SWT.RADIO); + b_parallelOptimal.setText(MessageFormat.format(Messages.BuilderSettingsTab_UseOptimalJobs, 1)); + setupControl(b_parallelOptimal, 2, GridData.BEGINNING); + ((GridData)(b_parallelOptimal.getLayoutData())).horizontalIndent = 15; + b_parallelOptimal.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - setParallelDef(b_parallelOpt.getSelection()); - updateButtons(); + if (b_parallelOptimal.getSelection()) { + setParallelDef(true); + setParallelNumber(-1); + updateButtons(); + } }}); - b_parallelNum= new Button(c3, SWT.RADIO); - b_parallelNum.setText(Messages.BuilderSettingsTab_13); - setupControl(b_parallelNum, 1, GridData.BEGINNING); - ((GridData)(b_parallelNum.getLayoutData())).horizontalIndent = 15; - b_parallelNum.addSelectionListener(new SelectionAdapter() { + b_parallelSpecific= new Button(c3, SWT.RADIO); + b_parallelSpecific.setText(Messages.BuilderSettingsTab_UseParallelJobs); + setupControl(b_parallelSpecific, 1, GridData.BEGINNING); + ((GridData)(b_parallelSpecific.getLayoutData())).horizontalIndent = 15; + b_parallelSpecific.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { - setParallelDef(!b_parallelNum.getSelection()); - updateButtons(); + if (b_parallelSpecific.getSelection()) { + setParallelDef(true); + setParallelNumber(s_parallelNumber.getSelection()); + updateButtons(); + } }}); - parallelProcesses = new Spinner(c3, SWT.BORDER); - setupControl(parallelProcesses, 1, GridData.BEGINNING); - parallelProcesses.setValues(cpuNumber, 1, 10000, 0, 1, 10); - parallelProcesses.addSelectionListener(new SelectionAdapter () { + s_parallelNumber = new Spinner(c3, SWT.BORDER); + setupControl(s_parallelNumber, 1, GridData.BEGINNING); + s_parallelNumber.setValues(cpuNumber, 1, SPINNER_MAX_VALUE, 0, 1, 10); + s_parallelNumber.addSelectionListener(new SelectionAdapter () { @Override public void widgetSelected(SelectionEvent e) { - setParallelNumber(parallelProcesses.getSelection()); + setParallelDef(true); + setParallelNumber(s_parallelNumber.getSelection()); updateButtons(); } }); + b_parallelUnlimited= new Button(c3, SWT.RADIO); + b_parallelUnlimited.setText(Messages.BuilderSettingsTab_UseUnlimitedJobs); + setupControl(b_parallelUnlimited, 2, GridData.BEGINNING); + ((GridData)(b_parallelUnlimited.getLayoutData())).horizontalIndent = 15; + b_parallelUnlimited.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent event) { + if (b_parallelUnlimited.getSelection()) { + setParallelDef(true); + setParallelNumber(Integer.MAX_VALUE); + updateButtons(); + } + }}); + // Workbench behaviour group AccessibleListener makeTargetLabelAccessibleListener = new AccessibleAdapter() { @Override @@ -166,6 +191,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { b_autoBuild = setupCheck(g4, Messages.BuilderSettingsTab_17, 1, GridData.BEGINNING); t_autoBuild = setupBlock(g4, b_autoBuild); t_autoBuild.addModifyListener(new ModifyListener() { + @Override public void modifyText(ModifyEvent e) { if (canModify) setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_AUTO, t_autoBuild.getText()); @@ -175,6 +201,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { b_cmdBuild = setupCheck(g4, Messages.BuilderSettingsTab_19, 1, GridData.BEGINNING); t_cmdBuild = setupBlock(g4, b_cmdBuild); t_cmdBuild.addModifyListener(new ModifyListener() { + @Override public void modifyText(ModifyEvent e) { if (canModify) setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_INCREMENTAL, t_cmdBuild.getText()); @@ -183,6 +210,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { b_cmdClean = setupCheck(g4, Messages.BuilderSettingsTab_20, 1, GridData.BEGINNING); t_cmdClean = setupBlock(g4, b_cmdClean); t_cmdClean.addModifyListener(new ModifyListener() { + @Override public void modifyText(ModifyEvent e) { if (canModify) setBuildAttribute(IMakeBuilderInfo.BUILD_TARGET_CLEAN, t_cmdClean.getText()); @@ -191,6 +219,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { } /** + * Calculate enablements when multiple configurations selected on property page. * * @return: * Mode 0: @@ -202,56 +231,55 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { * 0: isStopOnError * 1: supportsStopOnError(true) * 2: bld.supportsStopOnError(false) - * 3: cfg.getInternalBuilderParallel() + * 3: cfg.getParallelDef() * Mode 2: * 0: b.isAutoBuildEnable() * 1: b.isIncrementalBuildEnabled() * 2: b.isCleanBuildEnabled() * 3: getParallelDef() */ - static int[] calc3states(ICPropertyProvider p, - IConfiguration c, - int mode) { - if (p.isMultiCfg() && - c instanceof ICMultiItemsHolder) - { - boolean p0 = (mode == 0); - boolean p1 = (mode == 1); + static int[] calc3states(ICPropertyProvider p, IConfiguration mcfg, int mode) { + if (p.isMultiCfg() && mcfg instanceof ICMultiItemsHolder) { + boolean m0 = (mode == 0); + boolean m1 = (mode == 1); - IConfiguration[] cfs = (IConfiguration[])((ICMultiItemsHolder)c).getItems(); - IBuilder b = cfs[0].getBuilder(); - int[] res = new int[TRI_STATES_SIZE]; - boolean[] x = new boolean[TRI_STATES_SIZE]; - x[0] = p0 ? b.isManagedBuildOn() : - (p1 ? b.isStopOnError() : b.isAutoBuildEnable()); - x[1] = p0 ? b.isDefaultBuildCmd(): - (p1 ? b.supportsStopOnError(true) : b.isIncrementalBuildEnabled() ); - x[2] = p0 ? b.canKeepEnvironmentVariablesInBuildfile() : - (p1 ? b.supportsStopOnError(false) : b.isCleanBuildEnabled()); - x[3] = p0 ? b.keepEnvironmentVariablesInBuildfile() : - ( p1 ? ((Configuration)cfs[0]).getInternalBuilderParallel() : getParallelDef(c)); - for (int i=1; i